運維三劍客之awk

2020-08-14 19:09:34

三劍客:grep、awk、sed

  • grep:數據查詢定位
-r/R 遞回查詢
  • awk:數據切片並格式化輸出
  • sed: 數據修改

awk

2.1格式:
awk [options] 'Pattern{Action}' file
-->
BEGIN { …. initialization awk commands …}
otherPatterns{ …. awk commands for each line of the file…}
END { …. finalization awk commands …}
例子:
ls -l | awk 'BEGIN {sum=0} {sum=sum+$5} END {print sum}'

2.2 控制流程的語句
if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
exit [ expression ]

2.3 輸入不指定分隔符時,預設使用空格作爲分隔符
2.4 連續多個空格,awk自動將連續的空格理解爲一個分割符
2.5 awk預設以"換行符"爲標記,識別每一行
2.6 $0 表示顯示整行 ,$NF表示當前行分割後的最後一列($0和$NF均爲內建變數)
2.7 $NF 和 NF 要表達的意思是不一樣的,對於awk來說,$NF表示最後一個欄位,NF表示當前行被分隔符切開以後,一共有幾個欄位。
2.8 我們也可以一次輸出多列,使用逗號隔開要輸出的多個列,列印出來,列與列之間是空格隔開,如果輸出列之間沒有逗號隔開,則列與列之間直接拼接在一起
2.9 awk的分隔符還分爲兩種,"輸入分隔符" FS [-F或-v FS="#"] 和 "輸出分隔符"OFS(output field separator) [-v OFS="--",輸出預設爲空格分隔]
2.10 在awk中,只有在參照$0、$1等內建變數的值的時候纔會用到"$",參照其他變數時,不管是內建變數,還是自定義變數,都不使用"$",而是直接使用變數名
2.11 自定義變數
方法一:-v varname=value  變數名區分字元大小寫。
當我們需要在awk中參照shell中的變數的時候,則可以通過方法一間接的參照
awk -v shellvar=$shellvar '{print shellvar}'
方法二:在program中直接定義。變數定義與動作之間需要用分號";"隔開
awk '{myvar=1;print myvar}
'
2.12 "模式"換成"條件",可能更容易理解
如果我們不指定任何"條件",awk會一行一行的處理文字中的每一行,如果我們指定了"條件",只有滿足"條件"的行纔會被處理,不滿足"條件"的行就不會被處理
2.12.1 BEGIN和END也是模式,BEGIN和END就是條件
2.12.2 模式=條件=關係表達式,爲真執行動作
a>b {actions}
x ~ /正則/ {actions}滿足正則則執行
x !~ /正則/
2.12.3 模式可以是正則表達式
把"正則表達式"當做"條件"
 {actions}不滿足正則則執行
grep "正則表達式" /etc/password
awk '/正則表達式/pritn $0' /etc/password
awk有自己的優勢,就是格式化能力
2.12.4 沒有任何內容的模式成爲空模式,將匹配每一行
2.12.5 行範圍模式
awk '/正則1/,/正則2/{動作}' 檔案
,從被正則1匹配到的行開始,到被正則2匹配到的行結束,之間的所有行都會執行對應的動作(包括匹配的兩行),所以,這種模式被稱爲行範圍模式
2.12.6 awk可以同時存在多種模式
awk '模式1{actions} 模式2{actions} ... 模式n{actions}'
2.12.7 小結:
空模式|關係運算模式|BEGIN/END模式|正則模式|行模式
2.13多個動作通過分號隔開

學習鏈接

http://www.zsythink.net/archives/tag/awk/