awk 实例演示
2019獨角獸企業重金招聘Python工程師標準>>>
一.參數解釋:
(1)-F fs or --field-separator fs :指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。 (2)-v var=value or --asign var=value :賦值一個用戶定義變量。 (3)-f scripfile or --file scriptfile :從腳本文件中讀取awk命令。 (4)-mf nnn and -mr nnn :對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。 (5)-W compact or --compat, -W traditional or --traditional :在兼容模式下運行awk。所以gawk的行為和標準的awk完全一樣,所有的awk擴展都被忽略。 (6)-W copyleft or --copyleft, -W copyright or --copyright :打印簡短的版權信息。 (7)-W help or --help, -W usage or --usage :打印全部awk選項和每個選項的簡短說明。 (8)-W lint or --lint :打印不能向傳統unix平臺移植的結構的警告。 (9)-W lint-old or --lint-old :打印關于不能向傳統unix平臺移植的結構的警告。 (10)-W posix :打開兼容模式。但有以下限制,不識別:/x、函數關鍵字、func、換碼序列以及當fs是一個空格時,將新行作為一個域分隔符;操作符**和**=不能代替^和^=;fflush無效。 (11)-W re-interval or --re-inerval :允許間隔正則表達式的使用,參考(grep中的Posix字符類),如括號表達式[[:alpha:]]。 (12)-W source program-text or --source program-text :使用program-text作為源代碼,可與-f命令混用。 (13)-W version or --version :打印bug報告信息的版本。二.內建變量
$0當前記錄(這個變量中存放著整個行的內容) 整行內容 $1~$n當前記錄的第n個字段,字段間由FS分隔 FS輸入字段分隔符 默認是空格或Tab NF當前記錄中的字段個數,就是有多少列 NR已經讀出的記錄數,就是行號,從1開始,如果有多個文件話,這個值也是不斷累加中。 FNR當前記錄數,與NR不同的是,這個值會是各個文件自己的行號RS輸入的記錄分隔符, 默認為換行符 OFS輸出字段分隔符, 默認也是空格 ORS輸出的記錄分隔符,默認為換行符 FILENAME當前輸入文件的名字 SUBSEP:數組下標分隔符三.條件判斷
1.單條件判斷:
要留意的一個地方:
if 條件后面的語句塊,如果是單個語句,可以省略花括號,如果是多個語句,必須用花括號
2.多條件判斷:
再如:
awk -F':' '{if($1=="apple"){$var=$2+50;print $var}else if ($1=="orange"){$var=$3+20;print $var}else if ($1=="pear"){$var=$3+30;print $var}}' face.txt
執行結果如下:
四.循環結構
1.for循環
for循環的圓括號中需要3個表達式,前兩個分別是初始化表達式和測試表達式,第3個則用于更新測試表達式所用的變量。在awk的for循環中,圓括號里的第一條語句只能初始化一個變量(C語言中與之對應的語句則可以用逗號分隔的形式初始化多個變量)。
2.while循環
使用while循環的第一步是給一個變量設初值,然后在while表達式中測試該變量。如果求得表達式的值為真(非0),則進入循環體執行其中的語句。如果循環體內有多條語句,就必須用花括號把這些語句括起來。循環塊結束之前,一定要更新用來控制循環表達式的變量,否則循環將無休止地進行下去。do/while循環與while 循環很相似,唯一的區別在于do/while要先執行循環體至少一次,然后才測試表達式。
五.BEGIN 與END語句
BEGIN 用于匹配輸入文件的第一行之前的位置, END 則用于輸出匹配文件處理過后的最后一行的形式。通常使用 BEGIN 來輸出一個標題: 來顯示變量和預置(初始化)變量,使用END來輸出最終結果。
要注意的是: 此處例子的FS 分隔符要用雙引號括起來。用作數字的awk變量的默認初始值為0,所以變量值為0的話就可以省略不寫? 。
再如:
六.拆分文件--根據某列的不同值進行分類歸檔
1.根據指定列的值輸出全部內容的值
命令語句:
netstat -nptoa |awk 'NR!=1{print >$6}' ?
說明:
NR!=1表示不處理表頭(首行),示例演示的功能是根據第六列的不同值取文件名,再將所有列的值輸出到先前不同文件名的文件里。
2.根據指定列的值定制輸出想輸出的列的內容
命令語句:
netstat -anopt|awk 'NR!=1{print $4,$5 >$6}'
解說:
該條命令實現的功能就是根據第6列的不同狀態值取文件名,文件內容只包含第4,5列的值
七.統計,計數
1.統計文件夾下某種文件類型的文件大小
2.統計每個用戶使用的內存大小
命令語句:
ps aux|awk 'NR!=1{a[$1]+=$6}END{for (i in a) print i ":" a[i]"KB"}'
3.統計文件相同行的次數
命令語句:
A: ?awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a )print i,a[i]}'?
B: awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a ){print i, a[i]}}'
C: ?awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a )print i a[i]}'??
備注: 留意下這三條命令在輸出上的不同之處
4.刪除文件中的重復行
5.在awk里嵌入系統命令
命令語句:
awk '!/^$/{a[$7]++}END{for (i in a)printf "URL:%-20s count:%d\n",i ,a[i]|"sort -nr -t':' -k4 " }' 2017-02-16-0000-2330_gxxxx.cn.log |head -n5
如同所示: 在awk里嵌入系統命令,需用雙引號把系統命令引起來,單引號也不行。演示的功能是統計日志文件里各域名的次數,并按逆序輸出
6.split函數
命令語句:
awk 'BEGIN{split("3/10/2017",date,"/");print "The month is "date[1] " and the year is "date[3]}'
數組與split函數:?awk的內置函數split能夠將字符串拆分為詞,然后保存在數組中。如未指定字段分隔符,也可以就用FS的當前值。
格式
split(字符串,數組,字段分隔符)
split(字符串,數組)
說明:將字符串3/10/2017保存到數組date中,用正斜杠作為字段分隔符。現在date[1]中是3,date[2]中是10,而date[3] 中則是2017。字段分隔符用第3個參數指定,如未指定,就以FS的值做字段分隔符。
八.字符匹配
模糊匹配: ~ ?精確匹配: ?== ? 不匹配: ?!~ ? 不精確匹配: ?!==
轉載于:https://my.oschina.net/szwyh2014/blog/856741
總結
- 上一篇: 使用Ant实现打包jar包上传到服务器
- 下一篇: 浏览器厂商开始默认支持WebAssemb