iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

系統與服務雜談系列 第 5

awk - 簡介 Linux 製表好工具

awk

Linux文字處理工具中, 有另一個殺器awk
但awk是個程式語言, 所以它很靈活且功能強大.
awk可以幫助我們統計,可以製作表格等等的格式化以後, 做顯示, 算是個報告生成器

## awk處理方式

  • 一次處理一行內容, 跟下一節的sed一樣都是行處理工具
  • awk對每行可以進行切片處理, 對單字做切片
// 輸出第一個單字
awk '{print $1}' 

awk統一格式

// 命令行格式
awk [options] 'command' file(s)
// awk程式區塊格式
awk -f awk-script-file file(s)
// 管道格式
stdout | awk [options] 'command'
stdout | awk -f awk-script-file

命令行格式

awk [options] 'command' file(s)
這裡command也有自己的格式pattern {awk操作命令}
pattern這裡可以是Regex也可以是邏輯判斷式, 是不是很強大?

awk工作流程

https://ithelp.ithome.com.tw/upload/images/20210912/20104930G5Y4p3u6bf.png

awk操作命令

  • 內置函數
    • print()
    • printf()
    • getline
  • 控制命令
    • if() {...} else {...}
    • while() {...};

awk 內置變數

  • $0 表示當前行
  • $1 表示第1個字段/單字
  • $2 表示第2個字段/單字; 依此類推

options

  • -F : field-separator分割符號, 預設是空格
awk -F ':' '{print $1}' /etc/passwd

把/etc/passwd給輸出出來, 如下圖
https://ithelp.ithome.com.tw/upload/images/20210909/201049305UD8meglbz.png
透過awk取得用戶名稱, 用戶名稱依照:做分割的話, 會是第一個字段
https://ithelp.ithome.com.tw/upload/images/20210909/20104930CMo6hQS1XJ.png

透過awk把第1個字段和第3個字段UID一起輸出, 透過,在變數之間多個空格, 是awk預設的分隔符號.
如果是這樣打'{print $1 $3}', 對awk來說是把字串做拼接, 並不會把字串做分隔.
又或是透過" "把空格視為字串一起輸出; 也能透過這種方式, 補充些說明文字

awk -F ':' '{print $1,$3}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210909/20104930bRSoRSTYVU.png

awk -F ':' '{print "User:"$1" ""UID:"$3}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210909/20104930EQfq0Aqb3E.png

  • NR 行號
  • NF 字段數量
  • FILENAME 處理的文件名
// 輸出行號與每行的字段總數量
awk -F ':' '{print NR,NF}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210910/201049308hCJPypC9V.png

透過剛剛學的, 將/etc/passwd中的用戶名稱, 行號跟字段數量給輸出

awk -F ':' '{print "Ln:"NR,"WordCnt:"NF,"User:"$1}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210910/201049307KK4l1nFSB.png

也能透過printf做格式化字串

awk -F ':' '{printf "Ln:%2s WordCnt:%s User:%s\n", NR,NF,$1}' /etc/passwd
// 需要加上\n, 替每一行的輸出做換行

https://ithelp.ithome.com.tw/upload/images/20210910/20104930wzCyTtKLWK.png

只輸出UID > 10的行號、用戶名

awk -F ':' '{if ($3>100) printf "Ln:%2s User:%s\n", NR, $1}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210910/20104930sDi1iWm1qV.png

找出/var/log/syslog中發生Error的日期時間
可以透過之前的grep來查找後, 在用awk只輸出日期時間

grep "Error" syslog | awk '{print $1, $2, $3}'

也能在awk中使用Regex

awk '/Error/{print $1,$2,$3}' syslog 

https://ithelp.ithome.com.tw/upload/images/20210910/201049309zzJaJWiks.png

本日小結

awk關鍵字不多, 可以在整理輸出時, 用一些控制命列+邏輯運算做些過濾, 而後將結果整齊的輸出
是個簡單的語言也是個強大的工具


上一篇
grep - 3 Regex搭配淺談
下一篇
awk-2 Regex搭配淺談
系列文
系統與服務雜談32

尚未有邦友留言

立即登入留言