سؤال

أجد AWK مفيدًا حقًا.إليك بطانة واحدة قمت بتجميعها لمعالجة البيانات.

ls | awk '{ print "awk " "'"'"'"  " {print $1,$2,$3} " "'"'"'"  " " $1 ".old_ext > " $1    ".new_ext"  }' > file.csh

لقد استخدمت AWK هذا لإنشاء ملف نصي من شأنه إعادة تسمية بعض الملفات وطباعة الأعمدة الانتقائية فقط.هل يعرف أحد طريقة أفضل للقيام بذلك؟ما هي أفضل بطانات AWK أو التلاعب الذكي؟

هل كانت مفيدة؟

المحلول

كتاب AWK مليء أمثلة رائعة. استخدموا التي سيتم جمعها للتنزيل من كيرنيغان في صفحة ويب (404s الآن).

نصائح أخرى

يمكنك العثور على العديد من الخطوط اللطيفة هنا.

وأنا استخدم هذا:

df -m | awk '{p+=$3}; END {print p}'

لمجموع كل مساحة القرص المستخدمة على النظام عبر نظام الملفات.

قبل

وسنوات عديدة وكتبت نصا الذيل في AWK:

#!/usr/bin/awk -f
BEGIN {
  lines=10
}

{
  high = NR % lines + 1
  a[high] = $0
}

END {
  for (i = 0; i < lines; i++) {
    n = (i + high) % lines + 1
    if (n in a) {
      print a[n]
    }
  }
}

وانها سخيفة، وأنا أعلم، ولكن هذا ما يفعله AWK لك. انها مجرد ممتعة جدا اللعب معها.

وكتب هنري سبنسر تطبيق جيد إلى حد ما من nroff على AWK. سماه "عوف". وادعى أيضا أنه إذا كان لاري ستريت قد عرفت كيف كان AWK قوية، وقال انه لن يكون هناك حاجة لاختراع بيرل.

وهنا بضعة awks أن كنت تستخدم بانتظام ... لاحظ أنه يمكنك استخدام $ 1، $ 2، وما إلى ذلك للخروج العمود الذي تريد. لذلك، لمعالجة مجموعة من الملفات، على سبيل المثال وهنا أمر غبي يمكن استخدامها بدلا من ام ...

ls -1 *.mp3 | awk '{printf("mv %s newDir/%s\n",$1,$1)}' | /bin/sh

وأو إذا كنت تبحث في مجموعة من العمليات ربما ...

ps -ef | grep -v username | awk '{printf("kill -9 %s\n",$2)}' | /bin/sh

وتافهة جدا لكن يمكنك أن ترى كيف يمكن أن تحصل على قليل من الطرق. =) معظم الاشياء كنت تفعل يمكنك استخدام xargs ل، ولكن مهلا، الذي يحتاج لهم الأوامر فتية جديدة؟

وأنا استخدم هذا البرنامج النصي الكثير لPATH التحرير ومتغيرات البيئة مثل المسار. الاستعمال:

export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/other/old/bin)

ويضيف هذا الأمر / جديد / بن و/ أخرى / بن أمام PATH، ويزيل كل من / القديم / بن و/ أخرى / القديم / بن من PATH (إذا كان موجودا - أي خطأ إذا تغيب)، ويزيل إدخالات الدليل مكررة على المسار.

:   "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
#   Print minimal version of $PATH, possibly removing some items

case $# in
0)  chop=""; path=${PATH:?};;
1)  chop=""; path=$1;;
2)  chop=$2; path=$1;;
*)  echo "Usage: `basename $0 .sh` [$PATH [remove:list]]" >&2
    exit 1;;
esac

# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN       {       # Sort out which path components to omit
                    chop="'"$chop"'";
                    if (chop != "") nr = split(chop, remove); else nr = 0;
                    for (i = 1; i <= nr; i++)
                            omit[remove[i]] = 1;
            }
{
    for (i = 1; i <= NF; i++)
    {
            x=$i;
            if (x == "") x = ".";
            if (omit[x] == 0 && path[x]++ == 0)
            {
                    output = output pad x;
                    pad = ":";
            }
    }
    print output;
}'

والذاكرة المستخدمة من قبل عدد هتبد

ps -ylC httpd | awk '/[0-9]/ {SUM += $8} END {print SUM/1024}'

وأو أي عملية أخرى عن طريق استبدال هتبد. تقسيم 1024 للحصول على الناتج في MB.

وتمكنت من بناء DOS محاكي القيادة شجرة لUNIX (تجد + AWK):

find . -type d -print 2>/dev/null|awk '{for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",$0);print $NF}'  FS='/'

وخطوط طباعة بين نمطين:

awk '/END/{flag=0}flag;/START/{flag=1}' inputFile

وشرح تفصيلي: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

زوجان من المفضلات، لا علاقة لهما ببعضهما البعض.اقرأ كاقتراحين مختلفين وغير متصلين.

تحديد أرقام الأعمدة بسهولة

:

بالنسبة لأولئك الذين يستخدمون awk بشكل متكرر، كما أفعل لتحليل السجل في العمل، غالبًا ما أجد نفسي بحاجة إلى معرفة أرقام الأعمدة الخاصة بالملف.لذا، إذا كنت أقوم بتحليل ملفات وصول Apache، على سبيل المثال (يمكن العثور على بعض العينات هنا) أقوم بتشغيل البرنامج النصي أدناه على الملف:

NR == 1 {
        for (i = 1 ; i <= NF ; i++)
                {
                print i "\t" $i
                }
        }
NR > 1  {
        exit
        }

عادةً ما أسميها "cn.awk"، نسبةً إلى "c'olumn'n'umbers".مبدع، إيه؟على أية حال، يبدو الإخراج كما يلي:

1   64.242.88.10
2   -
3   -
4   [07/Mar/2004:16:05:49
5   -0800]
6   "GET
7   /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables
8   HTTP/1.1"
9   401
10  12846

من السهل جدًا معرفة ما هو.عادةً ما أستخدم هذا الاسم المستعار على خوادمي وأحصل عليه في كل مكان.


الإشارة إلى الحقول بالاسم

الآن، لنفترض أن ملفك يحتوي على صف رأس وأنك تفضل استخدام هذه الأسماء بدلاً من أرقام الحقول.هذا يسمح لك بالقيام بذلك:

NR == 1 {
    for (i = 1 ; i <= NF ; i++)
        {
        field[$i] = i
        }
    }

الآن، لنفترض أن لدي صف الرأس هذا...

metric,time,val,location,http_status,http_request

... وأود أن تلخيص val عمود.بدلاً من الإشارة إلى $3، يمكنني الإشارة إليه بالاسم:

NR > 1  {
    SUM += $field["val"]
    }

الفائدة الرئيسية هي جعل البرنامج النصي أكثر قابلية للقراءة.

ومجالات الطباعة هي واحدة من أول الأشياء المذكورة في معظم الدروس AWK.

awk '{print $1,$3}' file

وأقل شهرة ولكنها مفيدة على حد سواء هو استبعاد المجالات التي من الممكن أيضا:

awk '{$1=$3=""}1' file
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top