-----------awk命令-----------
說明:
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
有三種方式調用awk
1.命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱爲一個域。
通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。
2.shell腳本方式
將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作爲腳本的首行,一遍通過鍵入腳本名稱來調用。
相當於shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk
格式爲: ./awk腳本文件 輸入文件
3.插入文件方式
將所有的awk命令插入一個單獨文件,然後調用:
awk -f awk-script-file input-file(s)
awk -f awk腳本文件 輸入文件
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
awk有許多內置變量用來設置環境信息,這些變量可以被改變,下面給出了最常用的一些變量。
- ARGC 命令行參數個數
- ARGV 命令行參數排列
- ENVIRON 支持隊列中系統環境變量的使用
- FILENAME awk瀏覽的文件名
- FNR 瀏覽文件的記錄數
- FS 設置輸入域分隔符,等價於命令行 -F選項
- NF 瀏覽記錄的域的個數
- NR 已讀的記錄數
- OFS 輸出域分隔符
- ORS 輸出記錄分隔符
- RS 控制記錄分隔符
例:
last -n 5 |awk '{print $1}'
#顯示最近登錄的5個賬號。
cat /etc/passwd |awk -F ':' '{print $1}'
#顯示/etc/passwd的賬戶。
cat /etc/passwd |awk -F ':' '{print $1 "\t" $7}'
#顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1 "," $7} END{print "這裏結束了"}'
#只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,
#而且在所有行添加列名name,shell,在最後一行打印“這裏結束了”。
awk -F: '/root/' /etc/passwd
#搜索/etc/passwd有root關鍵字的所有行。
awk -F ':' '/root/{print $7}' /etc/passwd
#搜索/etc/passwd有root關鍵字的所有行,並顯示對應的shell。
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
#統計/etc/passwd文件名,每行的行號,每行的列數,對應的完整內容。
awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
#使用printf替代print,可以讓代碼更加簡潔,易讀。
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
#統計/etc/passwd的賬戶人數,count是自定義變量。
awk 'BEGIN {count=0;print "start usr count is ", count} {count=count+1;print $0;} END{print "end user count is", count }' /etc/passwd
#初始化count,雖然默認是0,但是妥當的做法還是初始化爲0。
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "end size is ", size}'
#統計某個文件夾下的文件佔用的字節數。
ls -l |awk 'BEGIN {size=0;} {size=size + $5;} END{print "end size is", size/1024/1024 "M"}'
#同上,以M爲單位顯示;注意,統計不包括文件夾的子目錄。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1; count++;}; END{for(i=0; i < NR; i++) print i, name[i]}' /etc/passwd #顯示/etc/passwd的賬戶。
awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt
#第一個段匹配root的行,並以#作爲分隔符輸出結果。
awk -F ':' '$1=="root" || NR>20 {OFS="#";print $1,$2}' 1.txt
#匹配root或者行號大於20的行的結果。
awk -F ':' '$1=$3+$4 {print}' 1.txt
#把第一段用第3和第4段的和的結果表示,並打印出全部結果。
awk -F ':' 'NF >3 && NF<10 {print}' 1.txt
#顯示分段數量在3-10之間的結果。