成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開源 系統運維
我們將學習更多的 awk 功能,即 awk 的特殊模式:BEGIN 和 END。隨著我們逐漸展開,并探索出更多構建復雜 awk 操作的方法,將會證明 awk 的這些特殊功能的是多么強大。

在 awk 系列的第八節,我們介紹了一些強大的 awk 命令功能,它們是變量、數字表達式和賦值運算符。

本節我們將學習更多的 awk 功能,即 awk 的特殊模式:BEGIN 和 END。

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

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

  1. # awk 'script' filenames 

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

  1. /pattern/ { actions } 

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

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

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

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

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

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

當你使用特殊模式時,想要在 awk 操作中獲得***的結果,你應當記住上面的執行順序。

為了便于理解,讓我們使用第八節的例子進行演示,那個例子是關于 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 

 

查看文件內容在這個例子中,我們希望統計出 domains.txt 文件中域名 tecmint.com 出現的次數。所以,我們編寫了一個簡單的 shell 腳本幫助我們完成任務,它使用了變量、數學表達式和賦值運算符的思想,腳本內容如下:

  1. #!/bin/bash 
  2. for file in $@; do 
  3. if [ -f $file ] ; then 
  4. ### 輸出文件名 
  5. echo "File is: $file" 
  6. ### 輸出一個遞增的數字記錄包含 tecmint.com 的行數 
  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. ### 成功執行后使用退出代碼 0 終止腳本 
  14. exit 0 

現在讓我們像下面這樣在上述腳本的 awk 命令中應用這兩個特殊模式:BEGIN 和 END:

我們應當把腳本:

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

改成:

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

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

  1. #!/bin/bash 
  2. for file in $@; do 
  3. if [ -f $file ] ; then 
  4. ### 輸出文件名 
  5. echo "File is: $file" 
  6. ### 輸出文件中 tecmint.com 出現的總次數 
  7. awk ' BEGIN {  print "文件中出現 tecmint.com 的次數是:" ; } 
  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. ### 成功執行后使用退出代碼 0 終止腳本 
  17. exit 0 

 

 

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

接下來,我們的模式 /^tecmint.com/ 會在每個輸入行中進行比較,對應的動作 { counter+=1 ; } 會在每個匹配成功的行上執行,它會統計出 tecmint.com 在文件中出現的次數。

最終,END 模式將會輸出域名 tecmint.com 在文件中出現的總次數。

 

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

 

用于統計字符串出現次數的腳本***總結一下,我們在本節中演示了更多的 awk 功能,并學習了特殊模式 BEGIN 和 END 的概念。

正如我之前所言,這些 awk 功能將會幫助我們構建出更復雜的文本過濾操作。第十節將會給出更多的 awk 功能,我們將會學習 awk 內置變量的思想,所以,請繼續保持關注。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

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循環

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技術棧公眾號

主站蜘蛛池模板: 国产精品免费播放 | 欧美精品 在线观看 | 日韩中文一区二区三区 | 国产亚洲欧美另类一区二区三区 | 国产综合一区二区 | 蜜桃av鲁一鲁一鲁一鲁 | 久久69精品久久久久久国产越南 | 久久国产精品精品国产色婷婷 | 综合久久综合久久 | 色婷婷久久 | jizz在线免费观看 | 国产精品久久久久久久久图文区 | 日韩无 | 婷婷在线视频 | 涩涩视频大全 | 国产成人高清 | 天天插天天搞 | 日韩福利在线 | 欧美成人h版在线观看 | 国产一区二区三区 | 天天干天天爽 | 亚洲国产精品成人综合久久久 | 六月成人网 | 午夜视频在线播放 | av一区二区三区四区 | 亚洲中国字幕 | 伊人欧美视频 | 国产高清在线精品一区二区三区 | 日本大香伊一区二区三区 | 欧美在线 | 蜜桃五月天 | 午夜影院操 | 久草在线| 色婷婷综合网 | 欧美精品日韩 | 黑人精品欧美一区二区蜜桃 | 亚洲一区二区精品视频在线观看 | 国产一区二区三区免费 | 国产精品免费视频一区 | 国产日韩欧美在线观看 | 亚洲精品国产成人 |