awk

awk 也是流式編輯器,它比sed的功能更強大

1.截取文檔中的某段

awk -F ‘:‘ ‘{print $1}‘ /etc/passwd |head -2
-F 指定分割符,不指定以空格或者tab為分隔符
print 為打印動作
$1 為第一字段, $2 為第二字段,依次類推,$0標示整行
那麽打印整個文檔就是
awk ‘{print $0}‘ /etc/passwd
print 還可以打印自定義的內容,要用雙引號括起來
awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ /etc/passwd |head -2
技術分享圖片
意思是以冒號分割打印前四段,每段用#號分開

2.匹配字符或字符串

awk ‘/root/‘ /etc/passwd 匹配含有root的行,該用法跟sed 類似
讓某個字段去匹配
awk -F ‘:‘ ‘$1 ~/da/‘ /etc/passwd
技術分享圖片
awk還可以多次匹配,只打印所匹配的段
awk -F ‘:‘ ‘/root/ {print $1 $3} /test/ {print $1 $3}‘ /etc/passwd
技術分享圖片
意思是先找出帶有關鍵詞root ,test的行,再打印出這些行指定的字段

3.條件操作符

根據邏輯判斷篩選 比如==,<,<=,>,>=,!=
awk -F ‘:‘ ‘$3==0‘ /etc/passwd
awk -F ‘:‘ ‘$3>=500‘ /etc/passwd 這樣我們就篩選出了普通用戶
技術分享圖片
邏輯符號後面的數字如果用雙引號引起來,則按照字符處理
舉一個!=的例子
awk -F ‘:‘ ‘$7!="/sbin/nologin"‘ /etc/passwd
技術分享圖片
當然我們也可以根據字段處理
awk -F ‘:‘ ‘$3<$4‘ /etc/passwd
技術分享圖片
另外還可以使用 && 和 || 表示 “並且” 和 “或者” 的意思
awk -F ‘:‘ ‘$3<$4 && $3<10‘ /etc/passwd
awk -F ‘:‘ ‘$3>=500 || $3<1‘ /etc/passwd
技術分享圖片

4.awk內置變量

NF :用分隔符分隔後一共有多少段
NR :行數
awk -F ‘:‘ ‘{print NF}‘ /etc/passwd |head -3
awk -F ‘:‘ ‘{print NR}‘ /etc/passwd |head -3

技術分享圖片
用行號作為判斷條件曬篩選,也可以同時匹配某段字符
awk ‘"NR">20‘ /etc/passwd
awk -F ‘:‘ ‘NR>20 && $1~/test/‘ /etc/passwd

技術分享圖片

5.awk 中的數學運算

更改某字段的內容輸出
awk -F ‘:‘ ‘$1="root"‘ /etc/passwd |head -3
以冒號分割,將第一段替換為root
技術分享圖片
awk還可以對各個段的值進行數學運算:
awk -F ‘:‘ ‘{$7=$3+$4;print $0}‘ /etc/passwd |head -3
該語句標示將第三段和第四段求和後替換第七段
技術分享圖片
還可以計算某一列的和
head -3 /etc/passwd |awk -F ‘:‘ ‘{(sum=sum+$3)}; END {print sum}‘
技術分享圖片
這裏我們選了文件前三行,統計了以冒號分割的第三列數字之和,sum是變量可以任意取,END是關鍵詞類似shell腳本的done ,其實該命令已經相當於一個帶有循環語句的簡單腳本了
在awk中使用if判斷,for循環都可以,舉一個if例子
awk -F ‘:‘ ‘{if ($3>=500) print $0}‘ /etc/passwd
技術分享圖片

Linux學習總結(二十一)正則三劍客之awk