弱者,是沒有資格要求公平的。
--《秦時明月》衛莊
參考文獻:
http://www.ruanyifeng.com/blog/2018/11/awk.html 阮一峯
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
awk是一種優良的文本處理工具,linux及unix環境中現有的功能最強大的數據處理引擎之一。
awk提供了極其強大的功能:可以進行正則表達式的匹配,樣式裝入,流控制,數學運算符,進程控制語句甚至於內置的變量和函數。它具備了一個完整的語言應該具有的幾乎所有的精美特性。實際上awk的確擁有自己的語言:awk程序設計語言,三位創建者已將它正式定義爲“樣式掃描和處理語言”。它允許創建簡短的程序,這些程序讀取輸入文件,爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他功能。
最簡單的說,awk是一種用於處理文本的編程語言工具。awk在很多方面類似於unix shell語言,儘管awk具有完全屬於其本身的語法。(--取自wiki)
語法
awk [option] 'script' var = value file(s)
awk [opyion] -f script var = value file(s)
常用命令選項:
-F fs fs指定輸入分隔符,fs可以是字符串或正則表達式
-v var=value 賦值一個用戶定義的變量,將外部變量傳遞給awk
-f scripfile 從腳本中讀取awk命令
-m[fr] val 對val值設置內在限制,-mf選項限制分配給val的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。
基本用法
awk 動作 文件名
示例:
awk '{print $0}' demo.txt
上方示例中,demo.txt是awk要處理的文件。前面單引號內部有一個大括號,裏面就是每一行的處理動作print $0。其中print是打印命令,$0代表當前行,因此上面的執行結果,就是把每一行原樣打印出來。
awk會根據空格和製表符,將每一行分成若干字段,依次用$1,$2,$3代表第一個字段、第二個字段、第三個字段。
echo 'This is a student' | awk '{print $3}'
打印出a,a爲第三個字段。
如需要指定分割符,則要加上-F參數。
示例:
awk -F ';' '{print $1}' demo.txt
變量
$NF代表最後一個字段。
echo 'this is a test' | awk '{print $NF}'
$(NF-1)代表倒數第二個字段
awk -F ':' '{print $1, $(NF-1)}' demo
print命令裏面的逗號,表示輸出的時候,兩部分之間使用空格分隔。
NR表示當前處理的是第幾行
awk -F ':' '{print NR ") " $1}' demo
print 命令中如果原樣輸出字符,要放在雙引號裏面。
awk的其他內置變量如下
FILENAME:當前文件名
FS:字段分隔符,默認是空格和製表符。
RS:行分隔符,用於分割每一行,默認是換行符。
OFS:輸出字段的分隔符,用於打印時分隔字段,默認爲空格。
ORS:輸出記錄的分隔符,用於打印時分隔記錄,默認爲換行符。
OFMT:數字輸出的格式,默認爲%.6g。
函數
tolower():字符轉爲小寫。
length():返回字符串長度。
substr():返回子字符串。
sin():正弦。
cos():餘弦。
sqrt():平方根。
rand():隨機數。
條件
awk '條件 動作' 文件名
awk -F ':' '/usr/ {print $1}' demo.txt
print命令前面是正則表達式,只輸出包含user的行。
awk -F ':' 'NR %2 = 1 {print $1}' demo.txt
輸出奇數行
awk -F ':' 'NR >3 {print $1}' demo.txt
輸出第三行以後的行
#輸出第一個字段等於指定值的行 $ awk -F ':' '$1 == "root" {print $1}' demo.txt root $ awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt root bin
if語句
awk -F ':' '{if ($1 > "m") print $1}' demo
輸出第一個字段的第一個字符大於m的行
if可指定else部分
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo