awk
教學網站
- http://techarena51.com/index.php/advance-text-processing-examples-awk/
- https://linuxhandbook.com/awk-command-tutorial/
搜尋字串
awk '/^this/{print $0}' #與 sed -n '/^this/p' 相同
我們經常使用 sort 與 uniq 指令,從檔案中找出並移除重複項目。不過如果你不希望你的原始檔被排序或更動,這時正是 awk 派上用場的時候,我們可以用 awk 截取不重複記錄並儲存在新的檔案中
awk '!x[$0]++' filewithdupes > newfile
搜尋含 disabled 的行,並列出第 1, 3 欄的內容
awk '/disabled/{print $1, $3}'
取值做計算
awk '{print "up " $1 /60 " minutes"}' /proc/uptime
df -lP -text4 |awk '{sum += $4} END {printf "%d GiB\n", sum/1048576}'
df -lP -text4 |awk '{sum += $4} END {printf "%d GiB\n", sum/2**20}'
加上判斷式
df -k |grep "/dev/" | awk '($2 > 0 && ((1 - $3/$2) > 0.9) ) {print $0 }'
awk -F" " '{print ($7 != "A")?$0"***":$0}' myfile
搜尋每行的第9欄,如果不是 0x00000000 時就顯示該行訊息
cat info.out | awk '($9 != "0x00000000") {print}'
列出 uid >= 500 且 <= 10000 的行
export UGIDLIMIT=500
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3<=10000)' /etc/passwd
解決長整數顯示問題
$ awk 'BEGIN {print 12345678901234567890}'
1.23457e+19
方法一
$ awk 'BEGIN {printf("%d\n", 12345678901234567890)}'
12345678901234567168
方法二
$ awk 'BEGIN {OFMT="%.0f"; print 12345678901234567890}'
12345678901234567168
列出 uid=0 的帳號
awk -F: '($3 == "0") {print}' /etc/passwd
列出最後一個欄位的值
ls -ltd */ | awk -F ' ' '{print $NF}'
格式化輸出
awk '{ printf("1-minute: %s\n5-minute: %s\n15-minute: \
%s\n",$1,$2,$3); }' /proc/loadavg
計算目錄的檔案大小
foldersize() {
if [ -d $1 ]; then
ls -alRF $1/ | grep '^-' | awk 'BEGIN {tot=0} { tot=tot+$5 } END { print tot }'
else
echo "$1: folder does not exist"
fi
}
搜尋特定字串的文字段落內容
# lspci -v | awk '/ATI/,/^$/'
01:03.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) (prog-if 00 [VGA])
Subsystem: Compaq Computer Corporation: Unknown device 001e
Flags: bus master, stepping, medium devsel, latency 64
Memory at fc000000 (32-bit, non-prefetchable) [size=16M]
I/O ports at 3000 [size=256]
Memory at fbff0000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [5c] Power Management version 2