国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux awk命令詳解

2024-08-27 23:56:04
字體:
來源:轉載
供稿:網友
  除了使用 sed 命令,Linux 系統中還有一個功能更加強大的文本數據處理工具,就是 awk。它誕生于 20 世紀 70 年代末期,這也許是它影響了眾多 Linux 用戶的原因之一。
 
  曾有人推測 awk 命令的名字來源于 awkward 這個單詞。其實不然,此命令的設計者有 3 位,他們的姓分別是 Aho、Weingberger 和 Kernighan,awk 就取自這 3 為大師姓的首字母。
 
  和 sed 命令類似,awk 命令也是逐行掃描文件(從第 1 行到最后一行),尋找含有目標文本的行,如果匹配成功,則會在該行上執行用戶想要的操作;反之,則不對行做任何處理。
 
  awk 命令的基本格式為:
 
  [root@localhost ~]# awk [選項] '腳本命令' 文件名
 
  此命令常用的選項以及各自的含義。
 
  選項 含義
 
  -F fs 指定以 fs 作為輸入行的分隔符,awk 命令默認分隔符為空格或制表符。
 
  -f file 從腳本文件中讀取 awk 腳本指令,以取代直接在命令行中輸入指令。
 
  -v var=val 在執行處理過程之前,設置一個變量 var,并給其設備初始值為 val。
 
  awk 的強大之處在于腳本命令,它由 2 部分組成,分別為匹配規則和執行命令,如下所示:
 
  '匹配規則{執行命令}'
 
  這里的匹配規則,和 sed 命令中的 address 部分作用相同,用來指定腳本命令可以作用到文本內容中的具體行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正則表達式指定。另外需要注意的是,整個腳本命令是用單引號('')括起,而其中的執行命令部分需要用大括號({})括起來。
 
  在 awk 程序執行時,如果沒有指定執行命令,則默認會把匹配的行輸出;如果不指定匹配規則,則默認匹配文本中所有的行。
 
  舉個簡單的例子:
 
  [root@localhost ~]# awk '/^$/ {print "Blank line"}' test.txt
 
  在此命令中,/^$/ 是一個正則表達式,功能是匹配文本中的空白行,同時可以看到,執行命令使用的是 print 命令,此命令經常會使用,它的作用很簡單,就是將指定的文本進行輸出。因此,整個命令的功能是,如果 test.txt 有 N 個空白行,那么執行此命令會輸出 N 個 Blank line。
 
  awk 使用數據字段變量
 
  awk 的主要特性之一是其處理文本文件中數據的能力,它會自動給一行中的每個數據元素分配一個變量。
 
  默認情況下,awk 會將如下變量分配給它在文本行中發現的數據字段:
 
  $0 代表整個文本行;
 
  $1 代表文本行中的第 1 個數據字段;
 
  $2 代表文本行中的第 2 個數據字段;
 
  $n 代表文本行中的第 n 個數據字段。
 
  前面說過,在 awk 中,默認的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每個數據字段都是通過字段分隔符劃分的。awk 在讀取一行文本時,會用預定義的字段分隔符劃分每個數據字段。
 
  所以在下面的例子中,awk 程序讀取文本文件,只顯示第 1 個數據字段的值:
 
  [root@localhost ~]# cat data2.txt
 
  One line of test text.
 
  Two lines of test text.
 
  Three lines of test text.
 
  [root@localhost ~]# awk '{print $1}' data2.txt
 
  One
 
  Two
 
  Three
 
  該程序用 $1 字段變量來表示“僅顯示每行文本的第 1 個數據字段”。當然,如果你要讀取采用了其他字段分隔符的文件,可以用 -F 選項手動指定。
 
  awk 腳本命令使用多個命令
 
  awk 允許將多條命令組合成一個正常的程序。要在命令行上的程序腳本中使用多條命令,只要在命令之間放個分號即可,例如:
 
  [root@localhost ~]# echo "My name is Rich" | awk '{$4="Christine"; print $0}'
 
  My name is Christine
 
  第一條命令會給字段變量 $4 賦值。第二條命令會打印整個數據字段。可以看到,awk 程序在輸出中已經將原文本中的第四個數據字段替換成了新值。
 
  除此之外,也可以一次一行地輸入程序腳本命令,比如說:
 
  [root@localhost ~]# awk '{
 
  > $4="Christine"
 
  > print $0}'
 
  My name is Rich
 
  My name is Christine
 
  在你用了表示起始的單引號后,bash shell 會使用 > 來提示輸入更多數據,我們可以每次在每行加一條命令,直到輸入了結尾的單引號。
 
  注意,此例中因為沒有在命令行中指定文件名,awk 程序需要用戶輸入獲得數據,因此當運行這個程序的時候,它會一直等著用戶輸入文本,此時如果要退出程序,只需按下 Ctrl+D 組合鍵即可。
 
  awk從文件中讀取程序
 
  跟 sed 一樣,awk 允許將腳本命令存儲到文件中,然后再在命令行中引用,比如:
 
  [root@localhost ~]# cat awk.sh
 
  {print $1 "'s home directory is " $6}
 
  [root@localhost ~]# awk -F: -f awk.sh /etc/passwd
 
  root's home directory is /root
 
  bin's home directory is /bin
 
  daemon's home directory is /sbin
 
  adm's home directory is /var/adm
 
  lp's home directory is /var/spool/lpd
 
  ...
 
  Christine's home directory is /home/Christine
 
  Samantha's home directory is /home/Samantha
 
  Timothy's home directory is /home/Timothy
 
  awk.sh 腳本文件會使用 print 命令打印 /etc/passwd 文件的主目錄數據字段(字段變量 $6),以及 userid 數據字段(字段變量 $1)。注意,在程序文件中,也可以指定多條命令,只要一條命令放一行即可,之間不需要用分號。
 
  awk BEGIN關鍵字
 
  awk 中還可以指定腳本命令的運行時機。默認情況下,awk 會從輸入中讀取一行文本,然后針對該行的數據執行程序腳本,但有時可能需要在處理數據前運行一些腳本命令,這就需要使用 BEGIN 關鍵字。
 
  BEGIN 會強制 awk 在讀取數據前執行該關鍵字后指定的腳本命令,例如:
 
  [root@localhost ~]# cat data3.txt
 
  Line 1
 
  Line 2
 
  Line 3
 
  [root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
 
  > {print $0}' data3.txt
 
  The data3 File Contents:
 
  Line 1
 
  Line 2
 
  Line 3
 
  可以看到,這里的腳本命令中分為 2 部分,BEGIN 部分的腳本指令會在 awk 命令處理數據前運行,而真正用來處理數據的是第二段腳本命令。
 
  awk END關鍵字
 
  和 BEGIN 關鍵字相對應,END 關鍵字允許我們指定一些腳本命令,awk 會在讀完數據后執行它們,例如:
 
  [root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
 
  > {print $0}
 
  > END {print "End of File"}' data3.txt
 
  The data3 File Contents:
 
  Line 1
 
  Line 2
 
  Line 3
 
  End of File
 
  可以看到,當 awk 程序打印完文件內容后,才會執行 END 中的腳本命令。
 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 红原县| 天气| 鄂托克旗| 新郑市| 金平| 富宁县| 大名县| 宕昌县| 当阳市| 固安县| 乐昌市| 藁城市| 望奎县| 韶关市| 唐河县| 大悟县| 西峡县| 桃江县| 郧西县| 青冈县| 普宁市| 安平县| 日土县| 图们市| 西青区| 金寨县| 白沙| 稷山县| 政和县| 从化市| 伊通| 九台市| 五台县| 赤城县| 皮山县| 桂阳县| 桂阳县| 潍坊市| 乐山市| 六安市| 资溪县|