awk是一種編程語言,主要用於在linux/unix下對文本和數據進行處理,是linux/unix下的一個工具。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。awk的處理文本和數據的方式:逐行掃描文件,預設從第一行到最後一行,尋找匹配的特定模式的行,併在這些行上進行你想要的操作。gawk是 ...
awk是一種編程語言,主要用於在linux/unix下對文本和數據進行處理,是linux/unix下的一個工具。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。awk的處理文本和數據的方式:逐行掃描文件,預設從第一行到最後一行,尋找匹配的特定模式的行,併在這些行上進行你想要的操作。gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴展。下麵介紹的awk是以GNU的gawk為例的,在linux系統中已把awk鏈接到gawk,所以下麵全部以awk進行介紹。
awk命令兩種使用方式:
1)命令模式
awk [options] 'commands' file(s)
option 部分
-F 定義欄位分割符號
-v 定義變數並賦值
command 部分:
1、範圍說明或者正則表達式或者{awk命令語句1;awk命令語句2;}
2、範圍說明部分可以是BEGIN、END、邏輯表達式或者為空
3、awk命令語句間用分號間隔
4、引用shell 變數需用雙引號引起
2)腳本模式
awk [options] -f scriptfile file(s)
特點:
1、awk腳本是awk命令的清單
2、命令需要用分號間隔
3、#號開頭的是註釋行
4、# !/bin/awk -f
欄位分割及相關變數:
$1,$2,$3...$n:awk中用該順序形式表示files中每行以間隔符號分割的各列的不同欄位
$0表示文本本身
註:
awk預設以空格符為間隔符號將每行分割為單獨的欄位,也可以使用awk內置變數FS定義間隔符號
NF 表示當前記錄的欄位數(列數)
$NF 最後一列
$(NF-1) 倒數第二列
FNR/NR 行號
FILENAME 文件名
"\t" 製表符
RS 換行符
"" 列印字元串
FS 定義間隔符
關於awk的練習:
1.截取/etc/passwd前五行的倒數第二列
head -5 /etc/passwd|tail -5|awk -F":" '{print $(NF-1)}'
2.列印第五行
head -5 /etc/passwd |tail -1
awk 'NR==5 {print $0}' /etc/passwd
awk '{if (NR==5) print $0}' /etc/passwd
3.列印第五行的第五列
awk -F: 'NR==5 {print $5}' /etc/passwd
4.列印第五行和第六行
awk 'NR==5||NR==6 {print $0}' /etc/passwd
5.找出/etc/以.conf結尾的文件的名字(如:kernelcap-2.6.18-164.el5.conf,只需要得到kernelcap-2.6.18-164.el5就可以了)
find /etc/ -name "*.conf"|awk -F"." '{print $(NF-1)}'|awk -F"/" '{print $NF}'
6.列印每一行的最後一列(可以以/etc/passwd文件為例,以下相同)
cat /etc/passwd |awk -F":" '{print $NF}'
7.列印每行的欄位數
cat /etc/passwd |awk -F":" '{print NF}'
8.列印第五行的欄位數
cat /etc/passwd |awk -F":" '{print FNR,NF}'|grep ^5.[[:digit:]]$
9.列印最後一行
cat /etc/passwd|tail -1
10.列印最後一行的最後一列
cat /etc/passwd|tail -1|awk -F":" '{print $NF}'
11.列印前五行
cat /etc/passwd|head -5
12.列印五到十行,併在前面加上行號
awk -F: '{print NR,$0}' /etc/passwd|head -10|tail -6
13.列印奇數行 (刪除偶數行)
cat /etc/passwd|grep -n x|awk '{if (NR%2==1) print $0}'
14.列印偶數行 (刪除奇數行)
cat /etc/passwd|grep -n x|awk '{if (NR%2==0) print $0}'
15.統計/etc/passwd一共出現了多少次bash字元 (要求用awk)
cat /etc/passwd|grep bash|awk -F"[:/]" '{{count++;}} END{print count}'