0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解Linux awk命令

CHANBAEK ? 來(lái)源:myfreax ? 作者:myfreax ? 2022-12-07 17:34 ? 次閱讀

Awk是一種通用腳本語(yǔ)言,用于高級(jí)文本處理的。它主要用作報(bào)告和分析工具。與大多數(shù)其他程序性編程語(yǔ)言不同。

Awk是數(shù)據(jù)驅(qū)動(dòng)的,這意味著您必須定義一組針對(duì)輸入文本要執(zhí)行的操作。它獲取輸入數(shù)據(jù),對(duì)其進(jìn)行轉(zhuǎn)換,然后將結(jié)果發(fā)送到標(biāo)準(zhǔn)輸出。

awk有幾種不同的實(shí)現(xiàn)。我們將使用Awk的GNU實(shí)現(xiàn),稱(chēng)為gawk。在大多數(shù)Linux發(fā)行版可用,awk命令只gawk的符號(hào)鏈接。

在本教程的所有示例中,我們將使用teams.txt文件作為awk的輸入,teams.txt文件內(nèi)容如下所示。

Bucks Milwaukee    60 22 0.732 
Raptors Toronto    58 24 0.707 
76ers Philadelphia 51 31 0.622
Celtics Boston     49 33 0.598
Pacers Indiana     48 34 0.585

teams.txt

記錄和字段

Awk可以處理文本數(shù)據(jù)和流。將輸入的數(shù)據(jù)分為記錄和字段。Awk一次對(duì)一條記錄進(jìn)行操作,直到達(dá)到輸入結(jié)束為止。

記錄由記錄分隔符分隔。默認(rèn)的記錄分隔符是換行符,這意味著文本數(shù)據(jù)中的每一行都是一條記錄。可以使用RS變量來(lái)設(shè)置記錄分的隔符。

記錄由多個(gè)字段組成,并且使用字段分隔符分隔。默認(rèn)情況下,字段之間用空格分隔,可以是一個(gè)或多個(gè)制表符,空格等,你可以使用awk命令的-F選項(xiàng)指定字段的分隔符。

每條記錄中的字段都可以使用美元符號(hào)$后跟字段編號(hào)表示,從1開(kāi)始。第一個(gè)字段由$1表示,第二個(gè)字段由$2表示。

依此類(lèi)推,最后一個(gè)字段也可以用特殊變量$NF表示。整個(gè)記錄可以用$0表示。

下面可以直觀(guān)展示記錄和字段的關(guān)系,也是awk處理文本數(shù)據(jù)默認(rèn)使用的記錄分隔符,即換行符。字段分隔符是空格符。

tmpfs      788M  1.8M  786M   1% /run/lock 
/dev/sda1  234G  191G   31G  87% /
|-------|  |--|  |--|   |--| |-| |--------| 
   $1       $2    $3     $4   $5  $6 ($NF) --> 字段 $1,$2...字段
|-----------------------------------------| 
                    $0                     --> 記錄由多個(gè)字段組成的單行記錄

正則表達(dá)式模式

正則表達(dá)式是與一組字符串匹配的模式。Awk正則表達(dá)式模式包含在斜杠//中。這是正則表達(dá)式模式語(yǔ)法形式/regex pattern/ { action }。

模式可以是任何類(lèi)型的擴(kuò)展正則表達(dá)式,換句話(huà)說(shuō),你在其它語(yǔ)言使用的正則表達(dá)式都可以用于awk。

例如命令awk '/0.5/ { print $1 }' teams.txt僅打印包含0.5記錄的第一個(gè)字段。

命令awk '/^[0-9][0-9]/ { print $1 }' teams.txt將會(huì)搜索以?xún)蓚€(gè)或多個(gè)數(shù)字開(kāi)頭的記錄,并打印第一個(gè)字段。

awk '/0.5/ { print $1 }' teams.txt
Celtics
Pacers
awk '/^[0-9][0-9]/ { print $1 }' teams.txt
76ers

關(guān)系表達(dá)模式

關(guān)系表達(dá)式模式通常用于匹配指定字段或變量的內(nèi)容。默認(rèn)情況下,正則表達(dá)式模式與記錄進(jìn)行匹配。

要將正則表達(dá)式與字段進(jìn)行匹配,請(qǐng)指定字段并針對(duì)模式使用包含比較運(yùn)算符約等于號(hào)~。要匹配不包含指定模式的字段,請(qǐng)使用不約等于運(yùn)算符!~

除了約等于和不約等于符號(hào)之外,您可以比較字符串或數(shù)字之間的關(guān)系,例如大于>,小于<,等于=符號(hào)。

例如命令awk '$2 ~ /ia/ { print $1 }' teams.txt將會(huì)搜索第二個(gè)字段包含ia的記錄并打印第一個(gè)字段。

awk '$2 ~ /ia/ { print $1 }' teams.txt
76ers
Pacers

例如命令awk '$2 !~ /ia/ { print $1 }' teams.txt將會(huì)搜索第二個(gè)字段不包含ia的記錄并打印第一個(gè)字段。

awk '$2 !~ /ia/ { print $1 }' teams.txt
Bucks
Raptors
Celtics

例如命令awk '$3 > 50 { print $1 }' teams.txt將會(huì)搜索三字段大于50的所有記錄,并打印第一字段。

awk '$3 > 50 { print $1 }' teams.txt
Bucks
Raptors
76ers

范圍模式

范圍模式由用逗號(hào)分隔的兩個(gè)模式組成,從匹配第一個(gè)模式的記錄開(kāi)始,直到匹配第二個(gè)模式的記錄停止匹配。

也就是說(shuō)匹配兩個(gè)模式之間的記錄都會(huì)被執(zhí)行相關(guān)的操作。即使中間記錄沒(méi)有匹配模式也將會(huì)被執(zhí)行相關(guān)操作。

但有一點(diǎn)值得注意的是范圍模式不能與某些模式表達(dá)式組合使用。但范圍模式可以與關(guān)系表達(dá)式組合使用。

例如命令awk '/Raptors/,/Celtics/ { print $1 }' teams.txt將會(huì)搜索從包含Raptors的記錄開(kāi)始到包含Celtics記錄結(jié)束的所有記錄。

然后打印兩個(gè)模式之間所有記錄的第一個(gè)字段{ print $1 }。

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors
76ers //這個(gè)記錄沒(méi)有匹配到兩個(gè)模式中任意一個(gè),但它在兩個(gè)模式之間,所以也會(huì)打印
Celtics

例如命令awk '$4 == 31, $4 == 33 { print $0 }' teams.txt組合范圍模式和關(guān)系表達(dá)式。

將會(huì)搜索第四個(gè)字段等于31記錄開(kāi)始,直到第四個(gè)字段等于33的所有記錄。然后打印整個(gè)記錄$0。

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622
Celtics Boston     49 33 0.598

特殊表達(dá)模式

Awk可以使用的特殊模式是。BEGIN用于在處理記錄之前執(zhí)行的操作。END用于在處理記錄后執(zhí)行操作。

BEGIN模式通常用于聲明變量,END模式通常用于處理記錄中的數(shù)據(jù),例如統(tǒng)計(jì)指定字段的總數(shù)。

如果程序只有BEGIN模式,則執(zhí)行操作,并且不處理輸入數(shù)據(jù)。如果程序只有END模式,則在執(zhí)行操作之前先處理輸入。

awk的Gnu版本還包含另外兩個(gè)特殊模式BEGINFILEENDFILE,它們?cè)试S您在處理文件時(shí)執(zhí)行操作。

在下面的示例中將打印Start Processing.,然后打印每個(gè)記錄的第三個(gè)字段,最后打印End Processing.。這是一個(gè)簡(jiǎn)單的示例,你也可以用于打印字段的名稱(chēng)。

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing
60
58
51
49
48
End Processing.

組合模式

Awk允許您使用邏輯AND運(yùn)算符&&和邏輯或運(yùn)算符||組合兩個(gè)或多個(gè)模式。

例如命令awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt使用&&運(yùn)算符搜索第三字段大于50而第四字段小于30的記錄,然后打印已匹配記錄的第一個(gè)字段。

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
Bucks
Raptors
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11171

    瀏覽量

    208474
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    669

    瀏覽量

    21956
  • 腳本語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    8197
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux Awk命令實(shí)例教程

    Awk種通用腳本語(yǔ)言,用于高級(jí)文本處理的。它主要用作報(bào)告和分析工具。與大多數(shù)其他程序性編程語(yǔ)言不同。
    發(fā)表于 12-08 16:32 ?561次閱讀

    Linux中g(shù)rep、sed和awk命令詳解

    今天給大家聊Linux中文本操作的`三劍客:awk、grep、sed`,因其功能強(qiáng)大、使用頻繁,且是Linux下文本處理的得力利器,常被稱(chēng)之為`文本三劍客`。`grep`常用于查找
    發(fā)表于 04-26 17:20 ?3123次閱讀
    <b class='flag-5'>Linux</b>中g(shù)rep、sed和<b class='flag-5'>awk</b><b class='flag-5'>命令</b><b class='flag-5'>詳解</b>

    Linux系統(tǒng)命令及其使用詳解

    Linux系統(tǒng)命令及其使用詳解
    發(fā)表于 08-20 13:38

    Linux關(guān)機(jī)命令詳解

    Linux關(guān)機(jī)命令詳解linux些常用的關(guān)機(jī)/重啟命令有shutdown、halt、r
    發(fā)表于 01-18 12:52 ?3604次閱讀

    Linux系統(tǒng)命令及其使用詳解 _120頁(yè)

    電子發(fā)燒友網(wǎng)站提供《Linux系統(tǒng)命令及其使用詳解 _120頁(yè).doc》資料免費(fèi)下載
    發(fā)表于 04-18 13:23 ?3次下載

    Linux命令詳解 [兼容模式]pdf免費(fèi)下載

    linux命令詳解pdf,希望對(duì)大家有幫助!
    發(fā)表于 12-15 15:54 ?10次下載

    linux awk命令簡(jiǎn)單易懂分分鐘學(xué)會(huì)

    awk個(gè)強(qiáng)大的文本分析工具,相對(duì)于grep的查找,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大。簡(jiǎn)單來(lái)說(shuō)awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切
    的頭像 發(fā)表于 03-17 10:15 ?4660次閱讀

    Linux Awk用法總結(jié)

    Awk、sed與grep,俗稱(chēng)Linux下的三劍客,它們之間有很多相似點(diǎn),但是同樣也各有各的特色,相似的地方是它們都可以匹配文本,其中sed和awk還可以用于文本編輯,而grep則不具備這個(gè)功用。
    的頭像 發(fā)表于 04-13 09:27 ?5536次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>Awk</b>用法總結(jié)

    linuxawk以及重定向命令如何使用?

    awk語(yǔ)言的最基本功能是在文件或字符串中基于指定規(guī)則瀏覽和抽取信息,awk抽取信息后,才能進(jìn)行其他文本操作,完整的awk腳本通常用來(lái)格式化文本文件中的信息
    發(fā)表于 10-18 17:25 ?3次下載

    Linuxawk命令的格式和匹配模式

    1.命令簡(jiǎn)介 AWK 是文本處理語(yǔ)言,是個(gè)強(qiáng)大的文本分析工具,是 Unix/Linux 環(huán)境中功能強(qiáng)大的數(shù)據(jù)處理引擎之。數(shù)據(jù)可以來(lái)自標(biāo)準(zhǔn)
    的頭像 發(fā)表于 03-11 16:24 ?3885次閱讀

    Linux三劍客之awk實(shí)戰(zhàn)詳解教程

    awk 強(qiáng)大的功能,是Linux 命令無(wú)法比擬的。在本文中,我不會(huì)告訴你 awk 也是
    的頭像 發(fā)表于 03-31 17:12 ?2266次閱讀
    <b class='flag-5'>Linux</b>三劍客之<b class='flag-5'>awk</b>實(shí)戰(zhàn)<b class='flag-5'>詳解</b>教程

    Linux系統(tǒng)中EXP命令詳解質(zhì)量匯總

    Linux系統(tǒng)中EXP命令詳解質(zhì)量匯總
    發(fā)表于 05-14 09:35 ?1次下載

    Linux虛擬機(jī)之tcpdump命令操作詳解

    Linux虛擬機(jī)之tcpdump命令操作詳解
    發(fā)表于 08-12 09:50 ?23次下載

    掌握Linux常用命令

    掌握Linux40個(gè)命令
    的頭像 發(fā)表于 04-03 11:38 ?603次閱讀

    關(guān)于linuxawk高效命令集錦

    今天浩道跟大家分享關(guān)于linux三劍客之awk相關(guān)的高效命令集錦!
    發(fā)表于 04-20 10:09 ?314次閱讀