前幾天寫了sed,這次來繼續學習一下它的好兄弟,awk,用了兩者,一個這樣的感覺,兩者都可以用來處理匹配,如果想對文本做處理,sed的刪除,匹配,替換要用的頻繁一些,如果要深入文本的每一行,對每一行進行一些列處理,例如,統計,然後格式化輸出,awk就可以派上用場了
查看自己ubuntu當前的awk
which awk,其實用的是/usr/bin/mawk
在學習sed篇中,我們知道,sed是讀取文本的每一行到一個模式空間,然後對模式空間的內容進行處理,其實awk差不多,它也是對模式空間進行處理,但是它做的處理動作時"切片"
1.awk的變量
爲什麼要先說變量呢,因爲不用變量,awk基本上就是廢(遊戲玩多了^-^)
首先我們把/etc/passwd裏面的第一行取出來備用
head -1 /etc/passwd > test.txt
$0 當前處理的記錄(默認是行,除非指定RS)
awk 'BEGIN{FS=":"}{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
$1---$n 當前的第幾個字段,和命令行參數類似
awk 'BEGIN{FS=":"}{print $1,$3}' test.txt
FS 這裏記住:F表示域field,S表示分隔seperate
這裏有兩種寫法:我喜歡用這種,簡潔明瞭
awk -F: '{print $1,$2,$3}' test.txt
RS 想想,R表示記錄record,S同上
awk 'BEGIN{RS=":"}{print $1,$3}' test.txt
NF number of field 可以理解爲多少列
awk 'BEGIN{FS=":"}{print NF}' test.txt
NR number of record 可以理解爲多少行
awk 'BEGIN{FS=":"}{print NR}' test.txt
OFS FS是處理這行的時候的分隔,O是指輸出,OFS就是指輸出時候的分隔符
awk 'BEGIN{FS=":"}{print $1,$2,$3}' OFS="#" test.txt
ORS 同理
2.awk的格式化輸出
awk的處理完文本之後還可以按照格式化進行輸出,很強大吧,其實說白了就是printf
awk -F: '{printf "%s#%s#%s\n" ,$1,$2,$3}' test.txt
%d 十進制整數
%f 浮點數
%s 字符串
%% 百分號
- 左對齊
雖然簡單,但是靈活運用,效果特殊
3.awk的算術運算
awk支持的運算符:+ - * / % ** awk甚至提供了一些數學函數sin(x),cos(x)等
還可以做一些統計運算,統計某一列的值
awk '{ sum += $1 }; END { print sum }' file
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}'
4.模式
awk '模式{命令}‘ file
模式可以是一下幾種:
1.正則表達式
awk -F : '/^r/{print $1}' /etc/passwd
2.表達式
awk -F: '$3>=500{print $1,$3}' /etc/passwd
awk -F: '$7 ~/bash$/{print $1,$7}' /etc/passwd
awk -F: '$7 !~/bash$/{print $1,$7}' /etc/passwd
3.BEGIN和END
BEGIN{ 這裏面放的是執行前的語句 }
END {這裏面放的是處理完所有的行後要執行的語句 }
{這裏面放的是處理每一行時要執行的語句}
例如:
awk 'BEGIN{test="123";print test}'
發現其實沒有文件也可以使用awk,因爲BEGIN不依賴於輸入,但是注意打印內部變量不必使用$