Awk是為高級文本處理而設計的非常強大的工具。她逐行搜索掃描文件,將輸入的每行分割成字段,將輸入行或字段與模式進行比較,并對匹配的結果執(zhí)行操作。 |
本節(jié)將使用sub和gsub函數(shù)和awk命令來刪除文件中的制表符和空格。我們將使用以下文本文件作為本文中所有示例的輸入文件:
[root@localhost ~]# cat << EOF >> content.txt
出現(xiàn)大于號時將一下內(nèi)容復制到終端,將文本內(nèi)容保存到content.txt文件中。
hitesh engineer sales 30000jayesh director account 25000vyom manager purchase 20000bhavesh engineer sales 30000 rajesh directory sales 40000niraj clerk account 20000jay peon purchase 23000deep clerk sales 20000EOF
刪除文件中的所有空白行
可以使用awk的特殊變量NF,從文件中刪除所有空白行。例如,刪除文件content.txt中的所有空白行。
[root@localhost ~]# awk NF content.txt
刪除每行開頭或者末尾的空格和制表符
使用awk命令在文件開頭找到一個或多個空格或制表符并刪除。可以使用以下命令:
[root@localhost ~]# awk '{ sub(/^[ \t]+/, ""); print }' content.txt
命令行中的意思是:使用sub函數(shù)找到開頭是制表符和空格的行,并替換空格和制表符為空。注意:sub()函數(shù)替換只發(fā)生在第一次匹配的時候,也就是一行中有多個空格或多個制表符,只替換左面的第一個。
刪除末尾的空格和制表符可以使用下面的命令:
[root@localhost ~]# awk '{ sub(/[ \t]+$/, ""); print }' content.txt
同時查詢開頭和末尾的空格和制表符,可以使用下面命令:
[root@localhost ~]# awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' content.txt
gsub函數(shù)表示滿足條件,替換所有的匹配字符。
倒序列出文件中的所有行
她記錄數(shù)組中的所有行,并將她們以相反的順序排列。使用以下命令:
[root@localhost ~]# awk '{ b[i++] = $0 } END { for (j=i-1; j>=0;) print b[j--] }' content.txt
添加行號為每行內(nèi)容
使用以下命令使用NF內(nèi)置變量對非空行進行編號:
[root@localhost ~]# awk 'NF { $0=++a ": " $0 }; { print }' content.txt
打印包含特定字符串的行數(shù)
使用以下命令來打印包含engineer的總行數(shù):
[root@localhost ~]# awk '/engineer/{n++}; END {print n+0}' content.txt
打印與指定字符串匹配的行
下面實例中,篩選出含有 engineer字符串的行:
[root@localhost ~]# awk '/engineer/' content.txt
打印與指定字符串不匹配的行
下面實例中,打印不包含字符串 jayesh 的行:
[root@localhost ~]# awk '!/jayesh/' content.txt
替換字符串
實例一:將content.txt中的字符串“ engineer”替換為“ doctor”,用到gsub()函數(shù):
[root@localhost ~]# awk '{gsub(/engineer/,"doctor")}{print}' content.txt
實例二:查找字符串“ jayesh”,“ hitesh”或“ bhavesh”,并將其替換為字符串“ mahesh”,運行以下命令:
[root@localhost ~]# awk '{gsub(/jayesh|hitesh|bhavesh/ , "mahesh"); print}' content.txt
配合df命令,顯示磁盤空間
可以將awk命令與df一起使用,只顯示設備名稱和可用空間、使用率。
[root@localhost ~]# df -h | awk '{printf("%-24s \t %-6s \t %-4s \n",$1,$4,$5)}'
查看每個IP打開的連接數(shù)
如果認為服務器受到攻擊,那么這種awk單行代碼非常有用。她將顯示服務器的打開連接列表,并按數(shù)量對她們進行排序。
[root@localhost ~]# netstat -ntu|awk '{print $5}'|cut -d: -f1|awk '/[0-9]/'|sort|uniq -c|sort -n
總結
我們通過實際示例了解如何使用一行awk命令執(zhí)行日常任務。