有用的 AWK One-Liner 便於攜帶

awk 是一個非常強大和方便的工具,專為高級文本處理而設計。 它逐行搜索和掃描文件,將每個輸入行拆分為字段,將輸入行或字段與模式進行比較,並對匹配的行執行操作。 一般用於轉換數據文件和生成格式化報告。

在本教程中,我們將展示一些高級且方便的 awk one-liners 示例,這些示例將有助於執行日常操作。

文本轉換

在本節中,我們將學習如何在 awk 命令中使用 sub 和 gsub 函數來刪除文件中的製表符和空格。

我們將使用以下文本文件作為本文所有示例的輸入文件:

cat > contents.txt

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

刪除文件中的所有空行

您可以使用帶有特殊 NF 變量的 awk 命令從文件中刪除所有空行。

為了 example, 刪除文件 contents.txt 中的所有空行,運行以下命令:

awk NF contents.txt

您應該看到以下輸出:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

您還可以使用以下命令執行相同的操作:

awk '/./' /contents.txt

刪除每行開頭的前導空格和製表符

您可以使用 awk 命令查找文件開頭的一個或多個空格或製表符並刪除它們。

運行以下命令從名為 contents.txt 的文件中刪除前導空格

awk '{ sub(/^[ t]+/, ""); print }' contents.txt

您應該看到以下輸出:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

刪除每行末尾的尾隨空格和製表符

您可以在文件的每一行末尾找到一個或多個空格或製表符並將其刪除。

運行以下命令刪除文件contents.txt中每行末尾的空格和製表符

awk '{ sub(/[ t]+$/, ""); print }' contents.txt

你應該得到以下輸出:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

刪除每一行的前導和尾隨空格

您還可以使用單個命令從每行中刪除前導和尾隨空格,如下所示:

awk '{ gsub(/^[ t]+|[ t]+$/, ""); print }' contents.txt

你應該得到以下輸出:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

顛倒行序

這是非常流行且非常有用的 awk one-liner,它記錄數組中的所有行並按相反順序排列它們。

運行此 awk one-liner 以在文件 contents.txt 中以相反的順序排列所有行:

awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' contents.txt

你應該得到以下輸出:

deep clerk sales 20000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
bhavesh engineer sales 30000

vyom manager purchase 20000
jayesh director account 25000
hitesh engineer sales 30000

顛倒每行中的字段順序

您可以使用帶有 NF 變量的 awk 命令以相反的順序排列每行中的每個字段。

awk '{ for (i=NF; i>0; i--) printf("%s ", $i); printf ("n") }' contents.txt

你應該得到以下輸出:

30000 sales engineer hitesh
25000 account director jayesh
20000 purchase manager vyom

30000 sales engineer bhavesh
40000 sales directory rajesh
20000 account clerk niraj
23000 purchase peon jay
20000 sales clerk deep

刪除連續的重複行

要從文件中刪除連續的重複行,請運行以下命令:

awk 'a != $0; { a = $0 }' contents.txt

刪除不連續的重複行

要從文件中刪除不連續的重複行,請運行以下命令:

awk '!a[$0]++' contents.txt

編號和計算

在本節中,我們將學習如何通過 awk 命令使用 FN 和 NR 變量。 它用於處理和報告,例如記錄數、字段數。

對文件中的所有行進行編號

您可以使用以下命令對特定文件中的所有行進行編號:

awk '{ print NR "t" $0 }' contents.txt

你應該得到以下輸出:

1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4
5 bhavesh engineer sales 30000
6 rajesh directory sales 40000
7 niraj clerk account 20000
8 jay peon purchase 23000
9 deep clerk sales 20000

花哨的數字線

要以特殊格式對特定文件中的所有行進行編號,請運行以下命令:

awk '{ printf("%5d : %sn", NR, $0) }' contents.txt

你應該得到以下輸出:

1 : hitesh engineer sales 30000
2 : jayesh director account 25000
3 : vyom manager purchase 20000
4 :
5 : bhavesh engineer sales 30000
6 : rajesh directory sales 40000
7 : niraj clerk account 20000
8 : jay peon purchase 23000
9 : deep clerk sales 20000

僅對文件中的非空行進行編號

您只能使用以下命令對非空行進行編號:

awk 'NF { $0=++a " :" $0 }; { print }' contents.txt

你應該得到以下輸出:

1 : hitesh engineer sales 30000
2 :jayesh director account 25000
3 :vyom manager purchase 20000

4 :bhavesh engineer sales 30000
5 : rajesh directory sales 40000
6 :niraj clerk account 20000
7 :jay peon purchase 23000
8 :deep clerk sales 20000

打印包含特定字符串的行數

您可以使用以下命令打印包含工程師一詞的總行數:

awk '/engineer/{n++}; END {print n+0}' contents.txt

你應該得到以下輸出:

2

常用表達

在本節中,我們將向您展示如何使用正則表達式和 awk 命令來過濾文件中的文本或字符串。

打印匹配指定字符串的行

要打印文件 contents.txt 中與字符串工程師匹配的所有行,請運行以下命令:

awk '/engineer/' contents.txt

你應該得到以下輸出:

hitesh engineer sales 30000
bhavesh engineer sales 30000

打印與指定字符串不匹配的行

要打印文件 contents.txt 中所有不匹配字符串 ‘jayesh’ 的行,請運行以下命令:

awk '!/jayesh/' contents.txt

你應該得到以下輸出:

hitesh engineer sales 30000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

在匹配字符串前打印一行

要打印匹配字符串 ‘rajesh’ 之前的行,請運行以下命令:

awk '/rajesh/{print x};{x=$0}' contents.txt

你應該得到以下輸出:

bhavesh engineer sales 30000

在匹配字符串後打印行

要打印匹配字符串 ‘rajesh’ 之後的行,請運行以下命令:

awk '/account/{getline; print}' contents.txt

你應該得到以下輸出:

vyom manager purchase 20000
jay peon purchase 23000

替代

在本節中,我們將向您展示如何使用 awk 命令在文件中搜索特定字符串並將其替換為您想要的字符串。

用其他替換字符串

要將 contents.txt 中的字符串 ‘engineer’ 替換為 ‘doctor’,請運行以下命令:

awk '{gsub(/engineer/, "doctor")};{print}' contents.txt

你應該得到以下輸出:

hitesh doctor sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh doctor sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

找到字符串 ‘jayesh’、’hitesh’ 或 ‘bhavesh’ 並將它們替換為字符串 ‘mahesh’,運行以下命令:

awk '{gsub(/jayesh|hitesh|bhavesh/,"mahesh");print}' contents.txt

你應該得到以下輸出:

mahesh engineer sales 30000
mahesh director account 25000
vyom manager purchase 20000

mahesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

使用設備名稱查找可用磁盤空間

您可以將 awk 命令與 df 一起使用來查找和顯示設備名稱以及每個設備使用的空間。

為此,請運行以下命令:

df -h | awk '{print $1, $4}'

你應該得到以下輸出:

Filesystem Avail
/dev/sda1 235G
none 4.0K
udev 1.9G
tmpfs 377M
none 5.0M
none 1.5G
none 100M
/dev/sda5 135G
/dev/loop0 0
/dev/loop1 0
/dev/loop2 0
/dev/loop4 0

查找每個 ip 打開的連接數

如果您認為您的服務器受到攻擊,這個 awk one-liner 非常有用。 它打印出到您的服務器的打開連接列表並按數量對它們進行排序。

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

您應該按數量獲取到您的服務器的所有打開連接的列表:

18 103.132.192.30
12 104.18.12.5
11 104.18.5.23
9 104.244.42.3
1 104.244.42.5
1 127.0.0.1

結論

如您所見,我們通過實際示例了解了 awk 單行命令。 我希望這將有助於您執行日常任務。