一、顯示特定行 1.awk 'NR%2==1' file / /顯示奇數(shù)行 二、修改Unix時間 linux獲得 Unix時間戳方法:awk 'BEGIN{print systime()}' 三、特定匹配
匹配第七個字段以mp4結(jié)尾的第三個域 $ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一個域以兩個數(shù)字結(jié)束就打印這個記錄。 $ awk '$1 != 10' test-----如果第一個域不等于10就打印該行 $ awk '$1 == 100 || $2 < 50' test-----如果第一個或等于100或者第二個域小于50,則打印該行。 $ awk '/^root/,/^mysql/' test----打印以正則表達(dá)式root開頭的記錄到以正則表達(dá)式mysql開頭的記錄范圍內(nèi)的所有記錄。如果找到一個新的正則表達(dá)式root開頭的記錄,則繼續(xù)打印直到下一個以正則表達(dá)式mysql開頭的記錄為止,或到文件末尾。 四、BEGIN&END 對某一列求和awk 'BEGIN{sum=0} {sum=$9+sum} END {print "sum " sum}' dataawk '{num+=$1} END {print unm}' 求平均數(shù) awk 'BEGIN{sum=0} {sum=$9+sum} END {print "average " sum / FNR}' access_log 從第6個字段開始輸出awk '{for(i=6; i<NF; ++i){printf "%s,",$i};printf "%s\n", $NF}' access_log從第6個字段開始輸出awk '{for(i=6; i= 6 && NR <=100) printf "%d: %s\n", NR, $7}' access_log 五、IF條件和循環(huán) awk '{if ($NF>3) print $0}' xxx.txt 最后一列大于3行打印 awk '{if (length($2)>3) print $0}' xxx.txt 打印第二個字段長度大于3的行 $awk '{if($2 ~ /^baidu$/) print $0}' xxx.txt 打印第二列為百度的字段 $awk '$2 ~ /^baidu$/ {print $0}' xxx.txt awk有三種循環(huán):while循環(huán);for循環(huán);special for循環(huán)。 $ awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test。變量的初始值為1,若i小于可等于NF(記錄中域的個數(shù)),則執(zhí)行打印語句,且i增加1。直到i的值大于NF. $ awk '{for (i = 1; i<NF; i++) print NF,$i}' test。作用同上。 breadkcontinue語句。break用于在滿足條件的情況下跳出循環(huán);continue用于在滿足條件的情況下忽略后面的語句,直接返回循環(huán)的頂端。如: {for ( x=3; x<=NF; x++) if ($x<0){print "Bottomed out!"; break}} {for ( x=3; x<=NF; x++) if ($x==0){print "Get next item"; continue}} next語句從輸入文件中讀取一行,然后從頭開始執(zhí)行awk腳本。如: {if ($1 ~/test/){next} else {print} } 六、數(shù)組 awk '{a[$(NF-2)]++}END{for(i in a) print i,a[i]}' xxx.txt 統(tǒng)計(jì)倒數(shù)第2個字段出現(xiàn)的次數(shù)(字段相同+1) 七、變量 $ awk '$1 ~/test/{count = $2 + $3; print count}' test,上式的作用是,awk先掃描第一個域,一旦test匹配,就把第二個域的值加上第三個域的值,并把結(jié)果賦值給變量count,最后打印出來。 awk可以在命令行中給變量賦值,然后將這個變量傳輸給awk腳本。如$ awk -F: -f awkscript month=4 year=2004 test,上式的month和year都是自定義變量,分別被賦值為4和2004。在awk腳本中,這些變量使用起來就象是在腳本中建立的一樣。注意,如 果參數(shù)前面出現(xiàn)test,那么在BEGIN語句中的變量就不能被使用。 域變量也可被賦值和修改,如$ awk '{$2 = 100 + $1; print }' test,上式表示,如果第二個域不存在,awk將計(jì)算表達(dá)式100加$1的值,并將其賦值給$2,如果第二個域存在,則用表達(dá)式的值覆蓋$2原來的值。 再例如:$ awk '$1 == "root"{$1 ="test";print}' test,如果第一個域的值是“root”,則把它賦值為“test”,注意,字符串一定要用雙引號。 內(nèi)建變量的使用。變量列表在前面已列出,現(xiàn)在舉個例子說明一下。$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test,把IGNORECASE設(shè)為1代表忽略大小寫,打印第一個域是mary的記錄數(shù)、第一個域、第二個域和最后一個 域。 八、重定向和管道 $ awk 'BEGIN{ "date" | getline d; print d}' test。執(zhí)行l(wèi)inux的date命令,并通過管道輸出給getline,然后再把輸出賦值給自定義變量d,并打印它。 $ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test。執(zhí)行shell的date命令,并通過管道輸出給getline,然后getline從管道中讀取并將輸入賦值給d,split函數(shù)把變量d轉(zhuǎn)化成數(shù)組mon,然后打印數(shù)組mon的第二個元素。 $ awk 'BEGIN{while( "ls" | getline) print}',命令ls的輸出傳遞給geline作為輸入,循環(huán)使getline從ls的輸出中讀取一行,并把它打印到屏幕。這里沒有輸入文件,因?yàn)锽EGIN塊在打開輸入文件前執(zhí)行,所以可以忽略輸入文件。 $ awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found" name on line ", NR "."} END{print "See you," name "."} test。在屏幕上打印”What is your name?",并等待用戶應(yīng)答。當(dāng)一行輸入完畢后,getline函數(shù)從終端接收該行輸入,并把它儲存在自定義變量name中。如果第一個域匹配變量name的值,print函數(shù)就被執(zhí)行,END塊打印See you和name的值。 $ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'。awk將逐行讀取文件/etc/passwd的內(nèi)容,在到達(dá)文件末尾前,計(jì)數(shù)器lc一直增加,當(dāng)?shù)侥┪矔r,打印lc的值。注意,如果文件不存在,getline返回-1,如果到達(dá)文件的末尾就返回0,如果讀到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情況下將陷入無限循環(huán),因?yàn)榉祷?1表示邏輯真。 可以在awk中打開一個管道,且同一時刻只能有一個管道存在。通過close()可關(guān)閉管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awd把print語句的輸出通過管道作為linux命令sort的輸入,END塊執(zhí)行關(guān)閉管道操作。 system函數(shù)可以在awk中執(zhí)行l(wèi)inux的命令。如:$ awk 'BEGIN{system("clear")'。 1.3.2 打印指定的匹配行數(shù)
l -m NUM, --max-count=NUM 未完待續(xù) |
|