大香蕉综合在线观看视频-日本在线观看免费福利-欧美激情一级欧美精品性-综合激情丁香久久狠狠

好房網(wǎng)

網(wǎng)站首頁知識問答 >正文

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

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

 

文章目錄[隱藏]

截取文件中的一段。匹配字符或字符串條件運(yùn)算符awk的內(nèi)置變量awk中的數(shù)學(xué)運(yùn)算

文本分析(課題研究的常用方法)

Awk是一個流編輯器,它對文檔中的行進(jìn)行操作,并逐行執(zhí)行它們。Awk可以非常方便高效的操作文檔和字符,從而實(shí)現(xiàn)我們想要的格式。它的功能非常強(qiáng)大,我經(jīng)常在shell腳本中使用它來處理字符串。以下是awk在工作中經(jīng)常用到的幾種用法。

截取文件中的一段。

例子如下:

#?head?-n2?test.txt?|awk?-F?\':\'?\'{print?$1}\'rootbin

在本例中,-F選項(xiàng)用于指定分隔符。如果沒有添加-F選項(xiàng),則使用空或tab作為分隔符。打印是打印的動作,用來打印一個字段。是第一個字段,是第二個字段,依此類推。但是[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后面是單引號,分隔符在單引號里面。print的動作應(yīng)該用{}括起來,否則會報(bào)錯。Print也可以打印自定義內(nèi)容,但是自定義內(nèi)容應(yīng)該用雙引號括起來,如下所示:

#?head?-n2?test.txt?|awk?-F?\':\'?\'{print?$1\"#\"$2\"#\"$3\"#\"$4}\'root#x#0#0bin#x#1#1

匹配字符或字符串

過濾掉文檔中包含指定字符串的行。示例命令如下:

#?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的功能,但是沒有彩色顯示。當(dāng)然沒有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

在這個例子中,awk匹配root,然后匹配test,并且只打印匹配的段。

條件運(yùn)算符

有時候匹配字符的時候要給一個限定條件,比如第三段的0。例子如下:

#?awk?-F?\':\'?\'$3==\"0\"\'?/etc/passwdroot:x:0:0:root:/root:/bin/bash

在awk中,我們可以用邏輯符號進(jìn)行判斷,比如= = equals,也可以理解為精確匹配。另外,還有>,> =,,!=等等。值得注意的是,在與數(shù)字進(jìn)行比較時,如果要比較的數(shù)字是用雙引號括起來的,awk就不會認(rèn)為是數(shù)字,而是字符,會認(rèn)為是沒有雙引號的數(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

在這個例子中,Amin想要打印uid大于或等于500的行,但是結(jié)果并不令人滿意。這是因?yàn)閍wk把所有的數(shù)字都當(dāng)作字符,就像上一章提到的sort排序原理一樣。但是,如果不添加雙引號,就會得到想要的結(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

在上面的例子中!=表示不匹配,除了可以對某個段的字符進(jìn)行邏輯比較之外,還可以對兩個段進(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具有相似的功能,也用于定義分隔符,但它們是在輸出時定義的。NF表示有多少數(shù)據(jù)段被分隔符分隔開。NR代表行號。

OFS的用法舉例如下:

#?head?-5?/etc/passwd?|awk?-F?\':\'?\'{OFS=\"#\"}?{print?$1,$3,$4}\'root#0#0bin#1#1daemon#2#2adm#3#4lp#4#7

還有更高級的用途:

#?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還可以對每個段的值執(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特有的語法,表示已經(jīng)執(zhí)行了所有的行。如下所示:

#?awk?-F?\':\'?\'{if?($1==\"root\")?{print?$0}}\'?/etc/passwdroot:x:0:0:root:/root:/bin/bash

其實(shí)awk可以寫成腳本文件,有自己的語法。awk中可以使用If判斷和for循環(huán),但是在日常管理中使用如此復(fù)雜的語句并不常見。

最后,我們附上一個常見的常規(guī)字符的解釋。

。表示任何字符,如空大小寫、特殊符號等。

*表示*前面有0個或多個字符,如a*,表示0個A或多個A。

。*表示任意字符,表示貪婪匹配。

+表示+前面有一個或多個字符,如a+表示A、aa、aaa……...

?就這樣嗎?前面有1或0個字符。

{}是里面的一個范圍,比如{1,5},也就是{}前面有1~5個字符。

|表示或,例如,a|b是A或b。

表示其中任意一個字符,比如[abc]是A或者B或者c,另外還可以用范圍[0-9]表示任意數(shù)字,用[a-z]表示任意小寫字母。

目前上述的內(nèi)容應(yīng)該能夠?yàn)榇蠹医獯鸪龃蠹覍τ谖谋痉治觯ㄕn題研究常用方法)的疑惑了,所以如果大家還想要了解更多的知識內(nèi)容,也可以關(guān)注本站其他文章進(jìn)行了解哦。


版權(quán)說明:本文由用戶上傳,如有侵權(quán)請聯(lián)系刪除!


標(biāo)簽:

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