Linux必知必會--awk

弱者,是沒有資格要求公平的。

          --《秦時明月》衛莊

參考文獻:

  http://www.ruanyifeng.com/blog/2018/11/awk.html 阮一峯

  https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

  https://man.linuxde.net/awk

  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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章