awk是一種模式掃描和處理語言,在對數據進行分析處理時,是十分強大的工具。
awk [options] 'pattern {action}' file...
awk的工作過程是這樣的:按行讀取輸入(標準輸入或文件),對于符合模式pattern的行,執行action。當pattern省略時表示匹配任何字符串;當action省略時表示執行'{print}';它們不可以同時省略。
每一行輸入,對awk來說都是一條記錄(record),awk使用$0來引用當前記錄:
[root@centos7 ~]# head -1 /etc/passwd | awk '{print $0}'root:x:0:0:root:/root:/bin/bash例子中將命令head -1 /etc/passwd作為awk的輸入,awk省略了pattern,action為print $0,意為打印當前記錄。
對于每條記錄,awk使用分隔符將其分割成列,第一列用$1表示,第二列用$2表示...最后一列用$NF表示
選項-F表示指定分隔符
如輸出文件/etc/passwd第一行第一列(用戶名)和最后一列(登錄shell):
[root@centos7 ~]# head -1 /etc/passwd | awk -F: '{print $1,$NF}'root /bin/bash當沒有指定分隔符時,使用一到多個blank(空白字符,由空格鍵或TAB鍵產生)作為分隔符。輸出的分隔符默認為空格。
如輸出命令ls -l *的結果中,文件大小和文件名:
[root@centos7 temp]# ls -l * | awk '{print $5,$NF}'13 b.txt58 c.txt12 d.txt0 e.txt0 f.txt24 test.sh[root@centos7 temp]# 還可以對任意列進行過濾:
[root@centos7 temp]# ls -l *|awk '$5>20 && $NF ~ /txt$/'-rw-r--r-- 1 nobody nobody 58 11月 16 16:34 c.txt
其中$5>20表示第五列的值大于20;&&表示邏輯與;$NF ~ /txt$/中,~表示匹配,符號//內部是正則表達式。這里省略了action,整條awk語句表示打印文件大小大于20字節并且文件名以txt結尾的行。
awk用NR表示行號
[root@centos7 temp]# awk '/^root/ || NR==2' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin[root@centos7 temp]#
例子中||表示邏輯或,語句表示:輸出文件/etc/passwd中以root開頭的行或者第二行。
在一些情況下,使用awk過濾甚至比使用grep更靈活
如獲得ifconfig的輸出中網卡名及其對應的mtu值
[root@idc-v-71253 ~]# ifconfig|awk '/^/S/{print $1"/t"$NF}'ens32: 1500ens33: 1500lo: 65536[root@idc-v-71253 ~]# #這里的正則表示不以空白字符開頭的行,輸出內容中使用/t進行了格式化。以上所說的NR、NF等都是awk的內建變量,下面列出部分常用內置變量
$0 當前記錄(這個變量中存放著整個行的內容)$1~$n 當前記錄的第n個字段,字段間由FS分隔FS 輸入字段分隔符 默認是空格或TabNF 當前記錄中的字段個數,就是有多少列NR 行號,從1開始,如果有多個文件話,這個值也不斷累加。FNR 輸入文件行號RS 輸入的記錄分隔符, 默認為換行符OFS 輸出字段分隔符, 默認也是空格ORS 輸出的記錄分隔符,默認為換行符FILENAME 當前輸入文件的名字
新聞熱點
疑難解答