Linux中的awk命令使用詳解
除了使用 sed 命令,Linux 系統(tǒng)中還有一個功能更加強(qiáng)大的文本數(shù)據(jù)處理工具,就是 awk。
曾有人推測 awk 命令的名字來源于 awkward 這個單詞。其實不然,此命令的設(shè)計者有 3 位,他們的姓分別是 Aho、Weingberger 和 Kernighan,awk 就取自這 3 為大師姓的首字母。
和 sed 命令類似,awk 命令也是逐行掃描文件(從第 1 行到最后一行),尋找含有目標(biāo)文本的行,如果匹配成功,則會在該行上執(zhí)行用戶想要的操作;反之,則不對行做任何處理。awk 命令的基本格式為:
[root@localhost ~]# awk [選項] '腳本命令' 文件名
此命令常用的選項以及各自的含義
awk 的強(qiáng)大之處在于腳本命令,它由 2 部分組成,分別為匹配規(guī)則和執(zhí)行命令,如下所示:
'匹配規(guī)則{執(zhí)行命令}'
這里的匹配規(guī)則,和 sed 命令中的 address 部分作用相同,用來指定腳本命令可以作用到文本內(nèi)容中的具體行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正則表達(dá)式指定。另外需要注意的是,整個腳本命令是用單引號('')括起,而其中的執(zhí)行命令部分需要用大括號({})括起來。
在 awk 程序執(zhí)行時,如果沒有指定執(zhí)行命令,則默認(rèn)會把匹配的行輸出;如果不指定匹配規(guī)則,則默認(rèn)匹配文本中所有的行。
舉個簡單的例子:
[root@localhost ~]# awk '/^$/ {print "Blank line"}' test.txt
在此命令中,/^$/
是一個正則表達(dá)式,功能是匹配文本中的空白行,同時可以看到,執(zhí)行命令使用的是 print 命令,此命令經(jīng)常會使用,它的作用很簡單,就是將指定的文本進(jìn)行輸出。因此,整個命令的功能是,如果 test.txt 有 N 個空白行,那么執(zhí)行此命令會輸出 N 個 Blank line。
awk 使用數(shù)據(jù)字段變量
awk 的主要特性之一是其處理文本文件中數(shù)據(jù)的能力,它會自動給一行中的每個數(shù)據(jù)元素分配一個變量。
默認(rèn)情況下,awk 會將如下變量分配給它在文本行中發(fā)現(xiàn)的數(shù)據(jù)字段:
- $0 代表整個文本行;
- $1 代表文本行中的第 1 個數(shù)據(jù)字段;
- $2 代表文本行中的第 2 個數(shù)據(jù)字段;
- $n 代表文本行中的第 n 個數(shù)據(jù)字段。
前面說過,在 awk 中,默認(rèn)的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每個數(shù)據(jù)字段都是通過字段分隔符劃分的。awk 在讀取一行文本時,會用預(yù)定義的字段分隔符劃分每個數(shù)據(jù)字段。所以在下面的例子中,awk 程序讀取文本文件,只顯示第 1 個數(shù)據(jù)字段的值:
[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 個數(shù)據(jù)字段”。當(dāng)然,如果你要讀取采用了其他字段分隔符的文件,可以用 -F 選項手動指定。
awk 腳本命令使用多個命令
awk 允許將多條命令組合成一個正常的程序。要在命令行上的程序腳本中使用多條命令,只要在命令之間放個分號即可,例如:
[root@localhost ~]# echo "My name is Rich" | awk '{$4="Christine"; print $0}' My name is Christine
第一條命令會給字段變量 $4 賦值。第二條命令會打印整個數(shù)據(jù)字段??梢钥吹?,awk 程序在輸出中已經(jīng)將原文本中的第四個數(shù)據(jù)字段替換成了新值。除此之外,也可以一次一行地輸入程序腳本命令,比如說:
[root@localhost ~]# awk '{ > $4="Christine" > print $0}' My name is Rich My name is Christine
在你用了表示起始的單引號后,bash shell 會使用 > 來提示輸入更多數(shù)據(jù),我們可以每次在每行加一條命令,直到輸入了結(jié)尾的單引號。
注意,此例中因為沒有在命令行中指定文件名,awk 程序需要用戶輸入獲得數(shù)據(jù),因此當(dāng)運行這個程序的時候,它會一直等著用戶輸入文本,此時如果要退出程序,只需按下 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 文件的主目錄數(shù)據(jù)字段(字段變量 $6),以及 userid 數(shù)據(jù)字段(字段變量 $1)。注意,在程序文件中,也可以指定多條命令,只要一條命令放一行即可,之間不需要用分號。
awk BEGIN關(guān)鍵字
awk 中還可以指定腳本命令的運行時機(jī)。默認(rèn)情況下,awk 會從輸入中讀取一行文本,然后針對該行的數(shù)據(jù)執(zhí)行程序腳本,但有時可能需要在處理數(shù)據(jù)前運行一些腳本命令,這就需要使用 BEGIN 關(guān)鍵字。
BEGIN 會強(qiáng)制 awk 在讀取數(shù)據(jù)前執(zhí)行該關(guān)鍵字后指定的腳本命令,例如:
[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 命令處理數(shù)據(jù)前運行,而真正用來處理數(shù)據(jù)的是第二段腳本命令。
awk END關(guān)鍵字
和 BEGIN 關(guān)鍵字相對應(yīng),END 關(guān)鍵字允許我們指定一些腳本命令,awk 會在讀完數(shù)據(jù)后執(zhí)行它們,例如:
[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
可以看到,當(dāng) awk 程序打印完文件內(nèi)容后,才會執(zhí)行 END 中的腳本命令。
到此這篇關(guān)于Linux中的awk命令使用詳解的文章就介紹到這了,更多相關(guān)Linux中的awk命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux mysql-5.6如何實現(xiàn)重置root密碼
這篇文章主要介紹了Linux mysql-5.6如何實現(xiàn)重置root密碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08Linux 字符設(shè)備驅(qū)動框架詳細(xì)介紹
這篇文章主要介紹了Linux 字符設(shè)備驅(qū)動框架詳細(xì)介紹的相關(guān)資料,字符設(shè)備就是字節(jié)流形式通訊的I/O設(shè)備,絕大部分設(shè)備都是字符設(shè)備,這里提供簡單的實例,需要的朋友可以參考下2016-12-12ubuntu下搭建php開發(fā)環(huán)境(nginx+(cgi)php5fpm+memcached+xdebug)
這篇文章主要介紹了ubuntu下搭建php開發(fā)環(huán)境(nginx+(cgi)php5fpm+memcached+xdebug),需要的朋友可以參考下2014-05-05Linux中對lvm邏輯卷分區(qū)大小的調(diào)整教程(針對xfs與ext4不同文件系統(tǒng))
這篇文章主要給大家介紹了關(guān)于Linux中對lvm邏輯卷分區(qū)大小的調(diào)整教程(針對xfs與ext4不同文件系統(tǒng))的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10