awk是一個超級強大的文本格式化處理工具,他與grep, sed命令被成為linux 三劍客命令 三劍客命令的特點: grep:只要用來匹配和查找文本 sed: 編輯匹配到文本 awk: 格式化文本,可以對複雜文本進行處理 awk語法格式:awk [options] 'program' file1 ...
awk是一個超級強大的文本格式化處理工具,他與grep, sed命令被成為linux 三劍客命令
三劍客命令的特點:
grep:只要用來匹配和查找文本
sed: 編輯匹配到文本
awk: 格式化文本,可以對複雜文本進行處理
awk語法格式:awk [options] 'program' file1 file2 ...
其中,program包含兩部分:'pattern{action}',最常用的兩個action就是print和printf,如果學過c語言,你就知道,他們專門由於格式化字元串, awk把處理過的格式文本,用他們輸出
1,不使用任何選項,模式和action, awk就相當於輸出整個文件,awk的工作方式是:逐行掃描. 預設情況下 掃描行的時候,用空格分割列,輸出的時候也是空格
使用print這個動作,列印文件所有的內容.
ghostwu@dev:~/linux/sed$ cat ghostwu.txt this is ghostwu how are you fine thank you bye bye ghostwu@dev:~/linux/sed$ awk '{print}' ghostwu.txt this is ghostwu how are you fine thank you bye bye
2,把ls -l 的結果通過管道交給awk逐行掃描處理,$1列印每一行的第一列,$3:每一行的第三列,$9就是第9列了...
ghostwu@dev:~/linux/sed$ ls -l total 4 -rw-rw-r-- 1 ghostwu ghostwu 51 5月 21 23:23 ghostwu.txt ghostwu@dev:~/linux/sed$ ls -l | awk '{print $1}' total -rw-rw-r-- ghostwu@dev:~/linux/sed$ ls -l | awk '{print $3}' ghostwu ghostwu@dev:~/linux/sed$ ls -l | awk '{print $9}' ghostwu.txt
ghostwu@dev:~/linux/sed$ cat ghostwu.txt this is ghostwu how are you fine thank you bye bye ghostwu@dev:~/linux/sed$ awk '{print $3}' ghostwu.txt ghostwu you you
3,$0表示整行,$NF表示當前行分割後的最後一列,他們都是內置變數
ghostwu@dev:~/linux/sed$ awk '{print $0}' ghostwu.txt this is ghostwu how are you fine thank you bye bye ghostwu@dev:~/linux/sed$ awk '{print $NF}' ghostwu.txt ghostwu you you bye
4,一次列出多列,使用逗號隔開要輸出的列
ghostwu@dev:~/linux/sed$ cat ghostwu.txt this is ghostwu how are you fine thank you bye bye ghostwu@dev:~/linux/sed$ awk '{print $1, $3}' ghostwu.txt this ghostwu how you fine you bye
文件最後一行,沒有第三列,所以沒有輸出任何東西
5,也可以加上自定義的列
ghostwu@dev:~/linux/awk$ ls ghostwu.txt ghostwu@dev:~/linux/awk$ awk '{print "name:" $1, "age:" $2, "sex:" $3}' ghostwu.txt name:ghostwu age:20 sex:man name:zhangsan age:22 sex:woman name:lisi age:23 sex:woman ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman
6,數字前面有美元符號的,是awk的內置變數,不能加引號,否則會把他們當做字元串原樣輸出
ghostwu@dev:~/linux/awk$ awk '{print "$1"}' ghostwu.txt $1 $1 $1 ghostwu@dev:~/linux/awk$ awk '{print $1}' ghostwu.txt ghostwu zhangsan lisi
ghostwu@dev:~/linux/awk$ awk '{print "first-cloumn:"$1}' ghostwu.txt first-cloumn:ghostwu first-cloumn:zhangsan first-cloumn:lisi
7,以下兩種寫法,都表示輸出整行
ghostwu@dev:~/linux/awk$ awk '{print $0}' ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman ghostwu@dev:~/linux/awk$ awk '{print}' ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman
8,BEGIN模式,在AWK掃描行之前,執行
在掃描行之前,列印aa,bb
ghostwu@dev:~/linux/awk$ awk 'BEGIN{print "aa", "bb"}' ghostwu.txt aa bb
如果勝省略文件,BEGIN模式依然會執行
ghostwu@dev:~/linux/awk$ awk 'BEGIN{print "aa", "bb"}' aa bb
BEGIN有什麼用?我們可以在掃描文件的行之前,為每個列都加上表頭信息
ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman ghostwu@dev:~/linux/awk$ awk 'BEGIN{print "name", "age", "sex"} {print $1, $2, $3}' ghostwu.txt name age sex ghostwu 20 man zhangsan 22 woman lisi 23 woman
9,掃描每一行,在每一行的後面加上自定義的列
ghostwu@dev:~/linux/awk$ awk 'BEGIN{print "name", "age", "sex"} {print $1, $2, $3} {print "展昭", 20, "man"}' ghostwu.txt name age sex ghostwu 20 man 展昭 20 man zhangsan 22 woman 展昭 20 man lisi 23 woman 展昭 20 man
10, 掃描完所有的行,在加上自己自定義的列信息,可以用END模式
ghostwu@dev:~/linux/awk$ awk 'BEGIN{print "name", "age", "sex"} {print $1, $2, $3} END{print "展昭", 20, "man"}' ghostwu.txt name age sex ghostwu 20 man zhangsan 22 woman lisi 23 woman 展昭 20 man