偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

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

  1. # awk 'script' filenames 

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

  1. /pattern/ { actions } 

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

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

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

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

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

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

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

為了便于理解,讓我們使用第八節(jié)的例子進(jìn)行演示,那個例子是關(guān)于 Tecmint 擁有的域名列表,并保存在一個叫做 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)容在這個例子中,我們希望統(tǒng)計出 domains.txt 文件中域名 tecmint.com 出現(xiàn)的次數(shù)。所以,我們編寫了一個簡單的 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. ### 輸出一個遞增的數(shù)字記錄包含 tecmint.com 的行數(shù) 
  7. awk '/^tecmint.com/ { counter+=1 ; printf "%s\n", counter ; }' $file 
  8. else 
  9. ### 若輸入不是文件,則輸出錯誤信息 
  10. echo "$file 不是一個文件,請指定一個文件。" >&2 && exit 1 
  11. fi 
  12. done 
  13. ### 成功執(zhí)行后使用退出代碼 0 終止腳本 
  14. exit 0 

現(xiàn)在讓我們像下面這樣在上述腳本的 awk 命令中應(yīng)用這兩個特殊模式: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. ### 若輸入不是文件,則輸出錯誤信息 
  13. echo "$file 不是一個文件,請指定一個文件。" >&2 && exit 1 
  14. fi 
  15. done 
  16. ### 成功執(zhí)行后使用退出代碼 0 終止腳本 
  17. exit 0 

 

 

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

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

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

 

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

 

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

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

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

2010-05-11 12:17:51

Unix awk

2016-08-10 16:07:08

awkLinux開源

2016-08-11 09:18:33

awkShellLinux

2016-10-08 20:58:50

awkLinux編寫腳本

2016-07-29 15:13:00

awk文本處理工具編程

2016-08-29 20:51:16

awkLinux開源

2018-03-28 17:51:24

LinuxUnix

2024-09-11 17:00:36

2022-03-20 10:40:11

Linuxawk 腳本

2010-07-23 13:23:10

Perl語言

2019-11-26 14:00:58

awkLinux命令

2010-05-11 10:29:06

Unix awk

2019-12-03 10:00:19

awkLinux循環(huán)

2010-07-23 13:46:27

Perl語言

2010-03-04 15:28:01

Ubuntu Shel

2017-08-04 14:00:32

Linuxawk變量

2019-12-09 14:13:41

awkPython編程語言

2019-12-12 18:00:54

awkLinux開源

2011-08-18 16:57:52

awk中文man

2010-03-04 15:11:06

Ubuntu awk
點贊
收藏

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