簡(jiǎn)介
awk是行處理器: 相比較屏幕處理的優(yōu)點(diǎn),在處理龐大文件時(shí)不會(huì)出現(xiàn)內(nèi)存溢出或是處理緩慢的問題,通常用來格式化文本信息
awk處理過程: 依次對(duì)每一行進(jìn)行處理,然后輸出
1)awk命令會(huì)逐行讀取文件的內(nèi)容進(jìn)行處理
2)awk以’:’為分隔符,將第1行數(shù)據(jù)格式化為7段,每段數(shù)據(jù)存入$1--$7變量中。$0存儲(chǔ)這1行數(shù)據(jù)?
3)一行處理完成繼續(xù)處理下一行,直到此文件讀取結(jié)束
?awk常見用法
awk 選項(xiàng) ?'模式或條件 { 編輯指令 }' 文件1 文件2 … ?
awk ?-f ?腳本文件 文件1 文件2 …
特殊的內(nèi)建變量
$0 ? ? ? ? ? 表示整個(gè)當(dāng)前行
$1 ? ? ? ? ? 每行第一個(gè)字段
NF ? ? ? ? ?字段數(shù)量變量
NR ? ? ? ? ?每行的記錄號(hào),多文件記錄遞增
FNR ? ? ? ?與NR類似,不過多文件記錄不遞增,每個(gè)文件都從1開始
\t ? ? ? ? ? ?制表符
\n ? ? ? ? ? 換行符
FS ? ? ? ? ?BEGIN時(shí)定義分隔符
RS ? ? ? 輸入的記錄分隔符, 默認(rèn)為換行符(即文本是按一行一行輸入)
~ ? ? ? ? ? ?匹配,與==相比不是精確比較
!~ ? ? ? ? ? 不匹配,不精確比較
== ? ? ? ? 等于,必須全部相等,精確比較
!= ? ? ? ? ? 不等于,精確比較
&& ? ? ?邏輯與
|| ? ? ? ? ? ? 邏輯或
+ ? ? ? ? ? ?匹配時(shí)表示1個(gè)或1個(gè)以上
/[0-9][0-9]+/ ? 兩個(gè)或兩個(gè)以上數(shù)字
/[0-9][0-9]*/ ? ?一個(gè)或一個(gè)以上數(shù)字
FILENAME 文件名
OFS ? ? ?輸出字段分隔符, 默認(rèn)也是空格,可以改為制表符等
ORS ? ? ? ?輸出的記錄分隔符,默認(rèn)為換行符,即處理結(jié)果也是一行一行輸出到屏幕
-F'[:#/]' ? 定義三個(gè)分隔符
?用法示例:輸出
awk '{print}' test.txt?
簡(jiǎn)單的輸入全部?
第1,3字段
?awk '{print $1,$3}' test.txt?
輸出奇數(shù)行%2求模運(yùn)算,余數(shù)為1是奇數(shù),0為偶數(shù)?
? awk '(NR%2)==1{print}' test.txt?
? 輸出偶數(shù)行
? awk '(NR%2)==0{print}' test.txt?
輸出以root開頭的行
?awk '/^root/{print}' /etc/passwd
?輸出以……結(jié)尾的行
? awk '/nologin$/{print}' /etc/passwd
統(tǒng)計(jì)以/bin/bash結(jié)尾的行=== grep -c "/bin/bash$"
awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}' /etc/passwd
統(tǒng)計(jì)以空行分割的文本段落數(shù)
awk 'BEGIN{RS=""};END{print NR}' /etc/sysctl.conf?
按字段輸出文本??
輸出每行中以空格或制表位分割的第3個(gè)字段
awk '{print $3}' test.txt??
?密碼為空的行?
awk -F ":" '$2==""{print}' /etc/shadow
密碼為空的行?
awk 'BEGIN {FS==":"}; $2==""{print}' /etc/shadow
?輸出以‘:’分割,第7字段包含/bash,的行的第1個(gè)字段
awk -F: '$7~"/bash"{print $1}' /etc/passwd
輸出第1個(gè)字段包含nfs;并且包含8個(gè)字段的行的第1,2字段
awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services??
輸出第7個(gè)字段不是/bin/bsh也不是/sbin/nologin的行
awk -F: '($7!="/bin/bsh")&&($7!="/sbin/nologin"){print}' /etc/passwd?
通過管道、雙引號(hào)調(diào)用Shell命令?
調(diào)用wc -l 命令統(tǒng)計(jì)使用bash的用戶個(gè)數(shù)
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
===等同于下列命令
grep -c "bash$" /etc/passwd
調(diào)用w命令,統(tǒng)計(jì)在線用戶數(shù)
awk 'BEGIN {while ("w" |getline) n++; {print n-2}}'
調(diào)用hostname,并輸出當(dāng)前主機(jī)名
awk 'BEGIN { "hostname" |getline ; print $0}'
分割?
awk? ? ? -F分割的字符? ? ? '{print $第幾個(gè)}'
舉一個(gè)簡(jiǎn)單的例子?,我們檢索出cat /etc/passwd? 里的root
cat /etc/passwd | grep '^root'
?用:分割開,去除最后一段文章來源:http://www.zghlxwxcb.cn/news/detail-664170.html
cat /etc/passwd | grep '^root'| awk -F: '{print $7}'
文章來源地址http://www.zghlxwxcb.cn/news/detail-664170.html
到了這里,關(guān)于Linux:shell腳本:基礎(chǔ)使用(6)《正則表達(dá)式-awk工具》的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!