English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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، يجب أن نلاحظ كلمتين مهمتين هي 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")}'