国产精品久久久久久久久久东京,亚洲视频免费播放,少妇人妻精品一区二区三区视频,日韩一级品

好房網(wǎng)

網(wǎng)站首頁(yè)知識(shí)問(wèn)答 >正文

今日更新文本分析(課題研究常用方法)

2022-05-23 18:01:42 知識(shí)問(wèn)答來(lái)源:
導(dǎo)讀 文章目錄[隱藏]截取文件中的一段。匹配字符或字符串條件運(yùn)算符awk的內(nèi)置變量awk中的數(shù)學(xué)運(yùn)算文本分析(課題研究的常用方法)Awk是一個(gè)流...

 

文章目錄[隱藏]

截取文件中的一段。匹配字符或字符串條件運(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)系刪除!


標(biāo)簽:

熱點(diǎn)推薦
熱評(píng)文章
隨機(jī)文章