自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

awk系列:如何使用awk的特殊模式 BEGIN 和 END

開(kāi)源 系統(tǒng)運(yùn)維
我們將學(xué)習(xí)更多的 awk 功能,即 awk 的特殊模式:BEGIN 和 END。隨著我們逐漸展開(kāi),并探索出更多構(gòu)建復(fù)雜 awk 操作的方法,將會(huì)證明 awk 的這些特殊功能的是多么強(qiáng)大。

在 awk 系列的第八節(jié),我們介紹了一些強(qiáng)大的 awk 命令功能,它們是變量、數(shù)字表達(dá)式和賦值運(yùn)算符。

本節(jié)我們將學(xué)習(xí)更多的 awk 功能,即 awk 的特殊模式:BEGIN 和 END。

隨著我們逐漸展開(kāi),并探索出更多構(gòu)建復(fù)雜 awk 操作的方法,將會(huì)證明 awk 的這些特殊功能的是多么強(qiáng)大。

開(kāi)始前,先讓我們回顧一下 awk 系列的介紹,記得當(dāng)我們開(kāi)始這個(gè)系列時(shí),我就指出 awk 指令的通用語(yǔ)法是這樣的:

  1. # awk 'script' filenames 

在上述語(yǔ)法中,awk 腳本擁有這樣的形式:

  1. /pattern/ { actions } 

你通常會(huì)發(fā)現(xiàn)腳本中的模式(/pattern/)是一個(gè)正則表達(dá)式,此外,你也可以在這里用特殊模式 BEGIN 和 END。因此,我們也能按照下面的形式編寫(xiě)一條 awk 命令:

  1. awk ' 
  2. BEGIN { actions }  
  3. /pattern/ { actions } 
  4. /pattern/ { actions } 
  5. ………. 
  6. END { actions }  
  7. ' filenames   

假如你在 awk 腳本中使用了特殊模式:BEGIN 和 END,以下則是它們對(duì)應(yīng)的含義:

  • BEGIN 模式:是指 awk 將在讀取任何輸入行之前立即執(zhí)行 BEGIN 中指定的動(dòng)作。
  • END 模式:是指 awk 將在它正式退出前執(zhí)行 END 中指定的動(dòng)作。

含有這些特殊模式的 awk 命令腳本的執(zhí)行流程如下:

  1. 當(dāng)在腳本中使用了 BEGIN 模式,則 BEGIN 中所有的動(dòng)作都會(huì)在讀取任何輸入行之前執(zhí)行。
  2. 然后,讀入一個(gè)輸入行并解析成不同的段。
  3. 接下來(lái),每一條指定的非特殊模式都會(huì)和輸入行進(jìn)行比較匹配,當(dāng)匹配成功后,就會(huì)執(zhí)行模式對(duì)應(yīng)的動(dòng)作。對(duì)所有你指定的模式重復(fù)此執(zhí)行該步驟。
  4. 再接下來(lái),對(duì)于所有輸入行重復(fù)執(zhí)行步驟 2 和 步驟 3。
  5. 當(dāng)讀取并處理完所有輸入行后,假如你指定了 END 模式,那么將會(huì)執(zhí)行相應(yīng)的動(dòng)作。

當(dāng)你使用特殊模式時(shí),想要在 awk 操作中獲得***的結(jié)果,你應(yīng)當(dāng)記住上面的執(zhí)行順序。

為了便于理解,讓我們使用第八節(jié)的例子進(jìn)行演示,那個(gè)例子是關(guān)于 Tecmint 擁有的域名列表,并保存在一個(gè)叫做 domains.txt 的文件中。

  1. news.tecmint.com 
  2. tecmint.com 
  3. linuxsay.com 
  4. windows.tecmint.com 
  5. tecmint.com 
  6. news.tecmint.com 
  7. tecmint.com 
  8. linuxsay.com 
  9. tecmint.com 
  10. news.tecmint.com 
  11. tecmint.com 
  12. linuxsay.com 
  13. windows.tecmint.com 
  14. tecmint.com 
  1. $ cat ~/domains.txt 

 

查看文件內(nèi)容在這個(gè)例子中,我們希望統(tǒng)計(jì)出 domains.txt 文件中域名 tecmint.com 出現(xiàn)的次數(shù)。所以,我們編寫(xiě)了一個(gè)簡(jiǎn)單的 shell 腳本幫助我們完成任務(wù),它使用了變量、數(shù)學(xué)表達(dá)式和賦值運(yùn)算符的思想,腳本內(nèi)容如下:

  1. #!/bin/bash 
  2. for file in $@; do 
  3. if [ -f $file ] ; then 
  4. ### 輸出文件名 
  5. echo "File is: $file" 
  6. ### 輸出一個(gè)遞增的數(shù)字記錄包含 tecmint.com 的行數(shù) 
  7. awk '/^tecmint.com/ { counter+=1 ; printf "%s\n", counter ; }' $file 
  8. else 
  9. ### 若輸入不是文件,則輸出錯(cuò)誤信息 
  10. echo "$file 不是一個(gè)文件,請(qǐng)指定一個(gè)文件。" >&2 && exit 1 
  11. fi 
  12. done 
  13. ### 成功執(zhí)行后使用退出代碼 0 終止腳本 
  14. exit 0 

現(xiàn)在讓我們像下面這樣在上述腳本的 awk 命令中應(yīng)用這兩個(gè)特殊模式:BEGIN 和 END:

我們應(yīng)當(dāng)把腳本:

  1. awk '/^tecmint.com/ { counter+=1 ; printf "%s\n", counter ; }' $file 

改成:

  1. awk ' BEGIN {  print "文件中出現(xiàn) tecmint.com 的次數(shù)是:" ; } 
  2. /^tecmint.com/ {  counter+=1  ;  } 
  3. END {  printf "%s\n",  counter  ; }  
  4. '  $file 

在修改了 awk 命令之后,現(xiàn)在完整的 shell 腳本就像下面這樣:

  1. #!/bin/bash 
  2. for file in $@; do 
  3. if [ -f $file ] ; then 
  4. ### 輸出文件名 
  5. echo "File is: $file" 
  6. ### 輸出文件中 tecmint.com 出現(xiàn)的總次數(shù) 
  7. awk ' BEGIN {  print "文件中出現(xiàn) tecmint.com 的次數(shù)是:" ; } 
  8. /^tecmint.com/ {  counter+=1  ;  } 
  9. END {  printf "%s\n",  counter  ; }  
  10. '  $file 
  11. else 
  12. ### 若輸入不是文件,則輸出錯(cuò)誤信息 
  13. echo "$file 不是一個(gè)文件,請(qǐng)指定一個(gè)文件。" >&2 && exit 1 
  14. fi 
  15. done 
  16. ### 成功執(zhí)行后使用退出代碼 0 終止腳本 
  17. exit 0 

 

 

awk 模式 BEGIN 和 END當(dāng)我們運(yùn)行上面的腳本時(shí),它會(huì)首先輸出 domains.txt 文件的位置,然后執(zhí)行 awk 命令腳本,該命令腳本中的特殊模式 BEGIN將會(huì)在從文件讀取任何行之前幫助我們輸出這樣的消息“文件中出現(xiàn) tecmint.com 的次數(shù)是:”。

接下來(lái),我們的模式 /^tecmint.com/ 會(huì)在每個(gè)輸入行中進(jìn)行比較,對(duì)應(yīng)的動(dòng)作 { counter+=1 ; } 會(huì)在每個(gè)匹配成功的行上執(zhí)行,它會(huì)統(tǒng)計(jì)出 tecmint.com 在文件中出現(xiàn)的次數(shù)。

最終,END 模式將會(huì)輸出域名 tecmint.com 在文件中出現(xiàn)的總次數(shù)。

 

  1. $ ./script.sh ~/domains.txt 

 

用于統(tǒng)計(jì)字符串出現(xiàn)次數(shù)的腳本***總結(jié)一下,我們?cè)诒竟?jié)中演示了更多的 awk 功能,并學(xué)習(xí)了特殊模式 BEGIN 和 END 的概念。

正如我之前所言,這些 awk 功能將會(huì)幫助我們構(gòu)建出更復(fù)雜的文本過(guò)濾操作。第十節(jié)將會(huì)給出更多的 awk 功能,我們將會(huì)學(xué)習(xí) awk 內(nèi)置變量的思想,所以,請(qǐng)繼續(xù)保持關(guān)注。

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2010-05-11 12:17:51

Unix awk

2016-08-10 16:07:08

awkLinux開(kāi)源

2016-08-11 09:18:33

awkShellLinux

2016-10-08 20:58:50

awkLinux編寫(xiě)腳本

2016-07-29 15:13:00

awk文本處理工具編程

2016-08-29 20:51:16

awkLinux開(kāi)源

2018-03-28 17:51:24

LinuxUnix

2024-09-11 17:00:36

2022-03-20 10:40:11

Linuxawk 腳本

2019-11-26 14:00:58

awkLinux命令

2010-07-23 13:23:10

Perl語(yǔ)言

2019-12-03 10:00:19

awkLinux循環(huán)

2010-05-11 10:29:06

Unix awk

2010-07-23 13:46:27

Perl語(yǔ)言

2010-03-04 15:28:01

Ubuntu Shel

2017-08-04 14:00:32

Linuxawk變量

2011-08-18 16:57:52

awk中文man

2019-12-09 14:13:41

awkPython編程語(yǔ)言

2019-12-12 18:00:54

awkLinux開(kāi)源

2010-03-04 15:11:06

Ubuntu awk
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)