English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

أمر awk في Linux

مجمع الأوامر في لينكس

AWK هو لغة معالجة ملفات النصوص، هو أداة قوية لتحليل النصوص.

يُدعى AWK لأنه يستلهم من اسم العائلة الأولي لثلاثة من مؤسسيه Alfred Aho، Peter Weinberger، و Brian Kernighan.

النحو

awk [خيارات] 'script' var=value file(s)
أو
awk [خيارات] -f scriptfile var=value file(s)

شرح الخيارات:

  • -F fs أو --field-separator fs
    تحديد مسافات التمييز في ملفات الإدخال، fs هو سلسلة أو تعبير عشوائي، مثل -F:.

  • -v var=value أو --asign var=value
    تعيين متغير مستخدم معين.

  • -f scripfile أو --file scriptfile
    قراءة أوامر awk من ملف السكريبت.

  • -mf nnn و -mr nnn
    ضبط القيود الداخلية للقيمة nnn، يحدد خيار -mf عدد الأكواد المحددة المخصصة لن nn، ويحدد خيار -mr عدد السجلات القصوى. هاتان الميزتان هما ميزات إضافية في إصدار awk من مختبر Bell، ولا تنطبق على awk القياسي.

  • -W compact أو --compat, -W traditional أو --traditional
    تشغيل awk في الوضع المدمج. لذا سلوك gawk متطابق تمامًا مع awk القياسي، وتُتجاهل جميع إضافات awk.

  • -W copyleft أو --copyleft, -W copyright أو --copyright
    طباعة معلومات حقوق النشر القصيرة.

  • -W help أو --help، -W usage أو --usage
    طباعة جميع خيارات awk وشرح مختصر لكل خيار.

  • -W lint أو --lint
    طباعة التحذيرات عن الأنماط التي لا يمكن نقلها إلى منصات unix التقليدية.

  • -W lint-old أو --lint-old
    طباعة التحذيرات عن الأنماط التي لا يمكن نقلها إلى منصات unix التقليدية.

  • -W posix
    فتح الوضع المتوافق. ولكن هناك بعض القيود، لا يتم التعرف عليها: /x، كلمات المفاتيح للوظائف، func، سلاسل التحويل، وكذلك عند fs هو فراغ، سيتم اعتبار السطر الجديد كحرف تقسيم المجال؛ لا يمكن استبدال العملات ** و **= ب ^ و ^=؛ لا يمكن استخدام fflush.

  • -W re-interval أو --re-interval
    السماح باستخدام تعبيرات التكرار المتناوبة، مرجع (فئة الحروف في grep)، مثل تعبيرات التكرار [[:alpha:]].

  • -W source program-text أو --source program-text
    استخدام program-text كنص المصدر، يمكن استخدام الأمر -f معه.

  • -W version أو --version
    طباعة إصدار تقرير الأخطاء

الاستخدام الأساسي

محتوى النص log.txt كالتالي:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

الطريقة الأولى:

awk '{[pattern] action}' {filenames} # جملة التصفية awk '' يمكن استخدامها فقط بالكواد

مثال:

# تقسيم كل سطر على حسب الفراغ أوTAB، إخراج النصوص في الموضعين 1 و4
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 مثل
 هذا هو
 10 برتقالي,تفاح,مونغو
 # إخراج تنسيقي
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2          a
 3          مثل
 هذا هو
 10          برتقالي,تفاح,مونغو

الطريقة الثانية:

awk -F # -F يساوي المتغير المدمج FS، تحديد حرف التقسيم

مثال:

# استخدام "," كحرف تقسيم
 $ awk -F, '{print $1,$2}' log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 هناك تفاح برتقالي
 # أو استخدام المتغيرات المدمجة
 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 هناك تفاح برتقالي
 # استخدامه مع أكثر من فاصل. أولاً استخدم مسافة، ثم استخدم "," لفصل النتائج
 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

الاستخدام الثالث:

awk -v # تعيين المتغير

مثال:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

الاستخدام الرابع:

awk -f {awk سكربت} {اسم الملف}

مثال:

 $ awk -f cal.awk log.txt

عنصر الحساب

عنصر الحسابالوصف
= += -= *= /= %= ^= **=التعيين
?:التعبير الشرطي C
||ال逻辑 أو
&&ال逻辑 وال
~ و !~التطابق مع النمط النسقي وعدم التطابق مع النمط النسقي
< <= > >= != ==عنصر العلاقة
مسافةالإضافة
+ -الجمع والنقص
* / %الضرب، التقسيم والباقي
+ - !الجمع، النقص وال逻辑 غير
^ ***الحساب بالقوة
++ --زيادة أو إنقاص، كـ مقدم أو مؤخرة
$الإشارة إلى الحقل
فيعناصر العدد

تصفية السطور التي تحتوي على عمود الأول أكبر من 2

$ awk '$1>2' log.txt # أمر
# مخرجات
3 Are you like awk
This's a test
10 There are orange,apple,mongo

تصفية السطور التي تحتوي على عمود الأول يساوي 2

$ awk '$1==2 {print $1,$3}' log.txt # أمر
# مخرجات
2 is

تصفية السطور التي تحتوي على عمود الأول أكبر من 2 والثاني يساوي 'Are'

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt # أمر
# مخرجات
3 Are you

المتغيرات المدمجة

المتغيرالوصف
$nالسجل الحالي في الموضع n، مفصولة بالـ FS
$0سجل الإدخال الكامل
ARGCعدد معطيات سطر الأوامر
ARGINDموقع الملف الحالي في سطر الأوامر (تبدأ من 0)
ARGVمصفوفة تحتوي على معطيات سطر الأوامر
CONVFMTتنسيق التحويل الرقمي (القيمة الافتراضية %.6g) مصفوفة مرتبطة بـ ENVIRON متغيرات البيئة
ERRNOوصف الأخطاء النظامية الأخيرة
FIELDWIDTHSعرض الحقول (مفصولة بمسافة)
FILENAMEاسم الملف الحالي
FNRرقم السطر الم计数 لكل ملف
FSمحدد فاصلة الحقل (القيمة الافتراضية هي أي مسافة)
IGNORECASEإذا كان صحيحًا، يتم تجاهل التشابه بين الأحرف الكبيرة والصغيرة عند التطابق
NFعدد الحقول في سطر واحد
NRعدد السجلات التي تم قراءتها، وهو الرقم الموجود في السطر، يبدأ من 1
OFMTتنسيق الإخراج للرقم (القيمة الافتراضية هي %.6g)
OFSمحدد فاصلة الحقل للإخراج، القيمة الافتراضية هي نفسها لمحدد فاصلة الحقل للإدخال.
ORSمحدد فاصلة التسجيل للإخراج (القيمة الافتراضية هي مسار النسخة)
RLENGTHطول النص الذي يطابق وظيفة match
RSمحدد فاصلة التسجيل (القيمة الافتراضية هي مسار النسخة)
RSTARTالموقع الأول من النص الذي يطابق وظيفة match
SUBSEPمحدد فاصلة بين أرقام النص (القيمة الافتراضية هي /034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt        2        1        5        1
log.txt        2        2        5        2
log.txt        2        3        3
log.txt        2        4        4
$ awk -F' ' BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt        2        1        '        1        1
log.txt        2        2        '        1        2
log.txt        2        3        '        2        3
log.txt        2        4        '        1        4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/ ' log.txt
---------------------------------------------
2 this is a test
This's a test

模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '/!th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

script awk

عن script awk، يجب أن نلاحظ كلمتين مهمتين هي BEGIN وEND.

  • BEGIN{ هذا هو الجملة التي يتم تنفيذها قبل البدء }

  • END {هناك جملة يتم تنفيذها بعد معالجة جميع السطور }

  • {هناك جملة يتم تنفيذها لكل سطر}

افترض أن لدينا ملفًا مثل هذا (جدول درجات الطلاب):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

نحن هنا script awk الخاص بنا:

$ cat cal.awk
#!/bin/awk -f
# قبل التنفيذ
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
# أثناء التنفيذ
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
# بعد التنفيذ
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

نحن نرى نتيجة التنفيذ:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
  المجموع: 319 393 350
متوسط: 63.80 78.60 70.00

بعض الأمثلة الأخرى

برنامج hello world الخاص بـ AWK هو:

BEGIN { print "Hello, world!" }

حساب حجم الملف

$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
--------------------------------------------------
666581

إيجاد الصفوف التي طولها أكبر من 80 من الملف:

awk 'length>80' log.txt

طباعة جدول ضرب التسعة

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

مجمع الأوامر في لينكس