網(wǎng)站首頁(yè)知識(shí)問(wèn)答 >正文
文章目錄[隱藏]
截取文件中的一段。匹配字符或字符串條件運(yùn)算符awk的內(nèi)置變量awk中的數(shù)學(xué)運(yùn)算文本分析(課題研究的常用方法)
Awk是一個(gè)流編輯器,它對(duì)文檔中的行進(jìn)行操作,并逐行執(zhí)行它們。Awk可以非常方便高效的操作文檔和字符,從而實(shí)現(xiàn)我們想要的格式。它的功能非常強(qiáng)大,我經(jīng)常在shell腳本中使用它來(lái)處理字符串。以下是awk在工作中經(jīng)常用到的幾種用法。
截取文件中的一段。例子如下:
#?head?-n2?test.txt?|awk?-F?\':\'?\'{print?$1}\'rootbin
在本例中,-F選項(xiàng)用于指定分隔符。如果沒(méi)有添加-F選項(xiàng),則使用空或tab作為分隔符。打印是打印的動(dòng)作,用來(lái)打印一個(gè)字段。是第一個(gè)字段,是第二個(gè)字段,依此類推。但是[6]是特殊的,它表示整行:
#?head?-n2?test.txt?|awk?-F\':\'?\'{print?$0}\'root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin
注意awk的格式,-F后面是單引號(hào),分隔符在單引號(hào)里面。print的動(dòng)作應(yīng)該用{}括起來(lái),否則會(huì)報(bào)錯(cuò)。Print也可以打印自定義內(nèi)容,但是自定義內(nèi)容應(yīng)該用雙引號(hào)括起來(lái),如下所示:
#?head?-n2?test.txt?|awk?-F?\':\'?\'{print?$1\"#\"$2\"#\"$3\"#\"$4}\'root#x#0#0bin#x#1#1
匹配字符或字符串過(guò)濾掉文檔中包含指定字符串的行。示例命令如下:
#?awk?\'/oo/\'?test.txtroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0perator:/root:/sbin/nologin?postfix:x:89:89::/var/spool/postfix:/sbin/nologin?setroubleshoot:x:992:990::/var/lib/setroubleshoot:/sbin/nologin
這類似于sed的用法??梢詫?shí)現(xiàn)grep的功能,但是沒(méi)有彩色顯示。當(dāng)然沒(méi)有g(shù)rep方便。但是,awk比sed具有更強(qiáng)的匹配性,如下所示:
#?awk?-F?\':\'?\'$1?~/oo/\'?test.txtroot:x:0:0:root:/root:/bin/bashsetroubleshoot:x:992:990::/var/lib/setroubleshoot:/sbin/nologin
它可以進(jìn)行某段匹配,其中~表示匹配。
此外,awk可以匹配多次,如下所示:
#?awk?-F?\':\'?\'/root/?{print?$1,$3}?/test/?{print?$1,$3}\'?test.txtroot?0operator?11test?1006
在這個(gè)例子中,awk匹配root,然后匹配test,并且只打印匹配的段。
條件運(yùn)算符有時(shí)候匹配字符的時(shí)候要給一個(gè)限定條件,比如第三段的0。例子如下:
#?awk?-F?\':\'?\'$3==\"0\"\'?/etc/passwdroot:x:0:0:root:/root:/bin/bash
在awk中,我們可以用邏輯符號(hào)進(jìn)行判斷,比如= = equals,也可以理解為精確匹配。另外,還有>,> =,,!=等等。值得注意的是,在與數(shù)字進(jìn)行比較時(shí),如果要比較的數(shù)字是用雙引號(hào)括起來(lái)的,awk就不會(huì)認(rèn)為是數(shù)字,而是字符,會(huì)認(rèn)為是沒(méi)有雙引號(hào)的數(shù)字。例子如下:
#?awk?-F?\':\'?\'$3>=\"500\"\'?/etc/passwd?|head?-n?5shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinnobody:x:65534:65534:Kernel?Overflow?User:/:/sbin/nologindbus:x:81:81:System?message?bus:/:/sbin/nologin
在這個(gè)例子中,Amin想要打印uid大于或等于500的行,但是結(jié)果并不令人滿意。這是因?yàn)閍wk把所有的數(shù)字都當(dāng)作字符,就像上一章提到的sort排序原理一樣。但是,如果不添加雙引號(hào),就會(huì)得到想要的結(jié)果:
#?awk?-F?\':\'?\'$3>=500\'?/etc/passwd|head?-n?5nobody:x:65534:65534:Kernel?Overflow?User:/:/sbin/nologinsystemd-coredump:x:999:997:systemd?Core?Dumper:/:/sbin/nologinpolkitd:x:998:996:User?for?polkitd:/:/sbin/nologingeoclue:x:997:995:User?for?geoclue:/var/lib/geoclue:/sbin/nologinunbound:x:996:991:Unbound?DNS?resolver:/etc/unbound:/sbin/nologin#?awk?-F?\':\'?\'$7!=\"/sbin/nologin\"\'?/etc/passwdroot:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltaminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash
在上面的例子中!=表示不匹配,除了可以對(duì)某個(gè)段的字符進(jìn)行邏輯比較之外,還可以對(duì)兩個(gè)段進(jìn)行邏輯比較。如下所示:
#?awk?-F?\':\'?\'$3
或者,您可以使用& &和||,它們分別代表“與”和“或”。& &的用法如下:
#?awk?-F?\':\'?\'$3>\"5\"?&&?$3
||的用法如下:
#?awk?-F?\':\'?\'$3>1000?||?$7==\"/bin/bash\"\'?/etc/passwdroot:x:0:0:root:/root:/bin/bashnobody:x:65534:65534:Kernel?Overflow?User:/:/sbin/nologinaminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash
awk的內(nèi)置變量Awk常用的變量有OFS、NF和NR。選項(xiàng)OFS和-F具有相似的功能,也用于定義分隔符,但它們是在輸出時(shí)定義的。NF表示有多少數(shù)據(jù)段被分隔符分隔開(kāi)。NR代表行號(hào)。
OFS的用法舉例如下:
#?head?-5?/etc/passwd?|awk?-F?\':\'?\'{OFS=\"#\"}?{print?$1,$3,$4}\'root#0#0bin#1#1daemon#2#2adm#3#4lp#4#7
還有更高級(jí)的用途:
#?awk?-F?\':\'?\'{OFS=\"#\"}?{if?($3>=1000)?{print?$1,$2,$3,$4}}\'?/etc/passwdnobody#x#65534#65534aminglinux#x#1000#1000
變量NF的具體用法如下:
#?head?-n3?/etc/passwd?|?awk?-F?\':\'?\'{print?NF}\'777#?head?-n3?/etc/passwd?|?awk?-F?\':\'?\'{print?$NF}\'/bin/bash/sbin/nologin/sbin/nologin
這里NF是多少段,$NF是最后一段的值。NR變量的具體用法如下:
#?head?-n3?/etc/passwd?|?awk?-F?\':\'?\'{print?NR}\'123
我們也可以用NR作為判斷條件,如下:
#?awk?\'NR>40\'?/etc/passwdinsights:x:978:976:Red?Hat?Insights:/var/lib/insights:/sbin/nologinsshd:x:74:74rivilege-separated?SSH:/var/empty/sshd:/sbin/nologin?avahi:x:70:70:Avahi?mDNS/DNS-SD?Stack:/var/run/avahi-daemon:/sbin/nologin?tcpdump:x:72:72::/:/sbin/nologin?aminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash
NR也可以用于如下的分段匹配:
#?awk?-F?\':\'?\'NR
awk中的數(shù)學(xué)運(yùn)算Awk可以更改段值。該命令示例如下:
#?head?-n?3?/etc/passwd?|awk?-F?\':\'?\'$1=\"root\"\'root?x?0?0?root?/root?/bin/bashroot?x?1?1?bin?/bin?/sbin/nologinroot?x?2?2?daemon?/sbin?/sbin/nologin
Awk還可以對(duì)每個(gè)段的值執(zhí)行數(shù)學(xué)運(yùn)算。命令示例如下:
#?head?-n2?/etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin#?head?-n2?/etc/passwd?|awk?-F?\':\'?\'{$7=$3+$4}\'#?head?-n2?/etc/passwd?|awk?-F?\':\'?\'{$7=$3+$4;?print?$0}\'root?x?0?0?root?/root?0bin?x?1?1?bin?/bin?2
Awk還可以計(jì)算某段的和。該命令示例如下:
#?awk?-F?\':\'?\'{(tot=tot+$3)};?END?{print?tot}\'?/etc/passwd84699
END這里是awk特有的語(yǔ)法,表示已經(jīng)執(zhí)行了所有的行。如下所示:
#?awk?-F?\':\'?\'{if?($1==\"root\")?{print?$0}}\'?/etc/passwdroot:x:0:0:root:/root:/bin/bash
其實(shí)awk可以寫成腳本文件,有自己的語(yǔ)法。awk中可以使用If判斷和for循環(huán),但是在日常管理中使用如此復(fù)雜的語(yǔ)句并不常見(jiàn)。
最后,我們附上一個(gè)常見(jiàn)的常規(guī)字符的解釋。
。表示任何字符,如空大小寫、特殊符號(hào)等。
*表示*前面有0個(gè)或多個(gè)字符,如a*,表示0個(gè)A或多個(gè)A。
。*表示任意字符,表示貪婪匹配。
+表示+前面有一個(gè)或多個(gè)字符,如a+表示A、aa、aaa……...
?就這樣嗎?前面有1或0個(gè)字符。
{}是里面的一個(gè)范圍,比如{1,5},也就是{}前面有1~5個(gè)字符。
|表示或,例如,a|b是A或b。
表示其中任意一個(gè)字符,比如[abc]是A或者B或者c,另外還可以用范圍[0-9]表示任意數(shù)字,用[a-z]表示任意小寫字母。
目前上述的內(nèi)容應(yīng)該能夠?yàn)榇蠹医獯鸪龃蠹覍?duì)于文本分析(課題研究常用方法)的疑惑了,所以如果大家還想要了解更多的知識(shí)內(nèi)容,也可以關(guān)注本站其他文章進(jìn)行了解哦。
版權(quán)說(shuō)明:本文由用戶上傳,如有侵權(quán)請(qǐng)聯(lián)系刪除!
- 上一篇:今日更新乳貼怎么清洗和保存,乳貼一天可以用多久
- 下一篇:最后一頁(yè)
猜你喜歡:
- 2022-05-11今日更新請(qǐng)事假怎么扣工資
- 2022-05-22今日更新個(gè)人無(wú)力償還債務(wù)怎么處理
- 2022-05-06今日更新球褲里面的褲子叫什么 為什么球褲里面還要穿長(zhǎng)褲
- 2022-05-19今日更新醉駕怎么判
- 2022-05-06今日更新科比戰(zhàn)靴最高評(píng)價(jià)是哪一代 科比戰(zhàn)靴全系列介紹
- 2022-05-07今日更新AJ1黑金蛇紋多少錢 AJ1黑金蛇紋在哪購(gòu)買
- 2022-05-03今日更新回族麻葉子的做法和配方
- 2022-05-09今日更新離婚時(shí)房產(chǎn)分割的方式有哪些
最新文章:
- 2022-05-23今日更新單位集資房如何辦理產(chǎn)權(quán)證集資建房可以辦房產(chǎn)證嗎
- 2022-05-23個(gè)人寫真都有什么風(fēng)格的(室內(nèi)個(gè)人寫真風(fēng)格有哪幾種)
- 2022-05-23今日更新appstore怎么切換id賬號(hào)
- 2022-05-23qq飛車光明騎士幾個(gè)噴(QQ飛車T2光明騎士和S海神之刺8噴哪個(gè)更好?)
- 2022-05-23今日更新乳貼怎么清洗和保存,乳貼一天可以用多久
- 2022-05-23今日更新藍(lán)膠是什么
- 2022-05-23今日更新婚后房產(chǎn) 如何放棄產(chǎn)權(quán)夫妻一方放棄產(chǎn)權(quán)協(xié)議內(nèi)容
- 2022-05-23鏡箱豆腐是哪個(gè)地方的菜(鏡箱豆腐是哪里的菜)
- 2022-05-23摩托羅拉手機(jī)型號(hào)大全(摩托羅拉手機(jī)型號(hào)大全)
- 2022-05-23今日更新4k和1080p區(qū)別大嗎
- 2022-05-23今日更新如何快速抑制腸鳴,為何會(huì)腸鳴
- 2022-05-23今日更新什么是鹽
- 2022-05-23今日更新各地對(duì)小產(chǎn)權(quán)房是如何拆遷的小產(chǎn)權(quán)房子拆遷有補(bǔ)償么怎么補(bǔ)償
- 2022-05-23鏡箱豆腐是哪個(gè)地方的菜(鏡箱豆腐是哪里的菜)
- 2022-05-23今日更新廣西省有哪些市
- 熱點(diǎn)推薦
- 熱評(píng)文章
- 隨機(jī)文章
- 今日更新城管拖車取車流程
- 今日更新離婚時(shí)嫁妝歸哪一方
- 今日更新匡威all star Pro BB怎么樣 匡威all star Pro BB開(kāi)箱測(cè)評(píng)
- 今日更新形容果實(shí)飽滿的詞語(yǔ)
- 今日更新精神賠償?shù)姆梢罁?jù)
- 今日更新Kenzo是什么品牌 Kenzo屬于什么檔次
- 今日更新女方被男方脅迫而與其結(jié)婚如何處理
- 今日更新摩托車逆向行駛會(huì)被處罰嗎
- 今日更新OFF WHITE X AIR PRESTO真假辨別 ow聯(lián)名耐克AIR PRESTO鑒定方法
- 今日更新?tīng)I(yíng)業(yè)執(zhí)照變更法人需要本人去嗎