這篇文章主要介紹linux中的Awk命令怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,公司以網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶數(shù)千家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計、獨特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。
Awk 是一個強大的工具,可以執(zhí)行某些可能由其它常見實用程序(包括
sort)來完成的任務(wù)。
Awk 是個普遍存在的 Unix 命令,用于掃描和處理包含可預(yù)測模式的文本。但是,由于它具有函數(shù)功能,因此也可以合理地稱之為編程語言。
令人困惑的是,有不止一個 awk。(或者,如果你認為只有一個,那么其它幾個就是克隆。)有 awk(由Aho、Weinberger 和 Kernighan 編寫的原始程序),然后有 nawk 、mawk 和 GNU 版本的 gawk。GNU 版本的 awk 是該實用程序的一個高度可移植的自由軟件版本,具有幾個獨特的功能,因此本文是關(guān)于 GNU awk 的。
雖然它的正式名稱是 gawk,但在 GNU+Linux 系統(tǒng)上,它的別名是 awk,并用作該命令的默認版本。 在其他沒有帶有 GNU awk 的系統(tǒng)上,你必須先安裝它并將其稱為 gawk,而不是 awk。本文互換使用術(shù)語 awk 和 gawk。
awk 既是命令語言又是編程語言,這使其成為一個強大的工具,可以處理原本留給 sort、cut、uniq 和其他常見實用程序的任務(wù)。幸運的是,開源中有很多冗余空間,因此,如果你面臨是否使用 awk 的問題,答案可能是肯定的“隨便”。
awk 的靈活之美在于,如果你已經(jīng)確定使用 awk 來完成一項任務(wù),那么無論接下來發(fā)生什么,你都可以繼續(xù)使用 awk。這包括對數(shù)據(jù)排序而不是按交付給你的順序的永恒需求。
在探索 awk 的排序方法之前,請生成要使用的樣本數(shù)據(jù)集。保持簡單,這樣你就不會為極端情況和意想不到的復(fù)雜性所困擾。這是本文使用的樣本集:
Aptenodytes;forsteri;Miller,JF;1778;EmperorPygoscelis;papua;Wagler;1832;GentooEudyptula;minor;Bonaparte;1867;Little BlueSpheniscus;demersus;Brisson;1760;AfricanMegadyptes;antipodes;Milne-Edwards;1880;Yellow-eyedEudyptes;chrysocome;Viellot;1816;Sothern RockhopperTorvaldis;linux;Ewing,L;1996;Tux
這是一個很小的數(shù)據(jù)集,但它提供了多種數(shù)據(jù)類型:
屬名和種名,彼此相關(guān)但又是分開的
姓,有時是以逗號開頭的首字母縮寫
代表日期的整數(shù)
任意術(shù)語
所有字段均以分號分隔
根據(jù)你的教育背景,你可能會認為這是二維數(shù)組或表格,或者只是行分隔的數(shù)據(jù)集合。你如何看待它只是你的問題,而 awk 只認識文本。由你決定告訴 awk 你想如何解析它。
如果你只想按特定的可定義字段(例如電子表格中的“單元格”)對文本數(shù)據(jù)集進行排序,則可以使用 sort 命令。
無論輸入的格式如何,都必須在其中找到模式才可以專注于對你重要的數(shù)據(jù)部分。在此示例中,數(shù)據(jù)由兩個因素定界:行和字段。每行都代表一個新的記錄,就如你在電子表格或數(shù)據(jù)庫轉(zhuǎn)儲中看到的一樣。在每一行中,都有用分號(;)分隔的不同的字段(將其視為電子表格中的單元格)。
awk 一次只處理一條記錄,因此,當(dāng)你在構(gòu)造發(fā)給 awk 的這指令時,你可以只關(guān)注一行記錄。寫下你想對一行數(shù)據(jù)執(zhí)行的操作,然后在下一行進行測試(無論是心理上還是用 awk 進行測試),然后再進行其它的一些測試。最后,你要對你的 awk 腳本要處理的數(shù)據(jù)做好假設(shè),以便可以按你要的數(shù)據(jù)結(jié)構(gòu)提供給你數(shù)據(jù)。
在這個例子中,很容易看到每個字段都用分號隔開。為簡單起見,假設(shè)你要按每行的第一字段對列表進行排序。
在進行排序之前,你必須能夠讓 awk 只關(guān)注在每行的第一個字段上,因此這是第一步。終端中 awk 命令的語法為 awk,后跟相關(guān)選項,最后是要處理的數(shù)據(jù)文件。
$ awk --field-separator=";" '{print $1;}' penguins.listAptenodytesPygoscelisEudyptulaSpheniscusMegadyptesEudyptesTorvaldis因為字段分隔符是對 Bash shell 具有特殊含義的字符,所以必須將分號括在引號中或在其前面加上反斜杠。此命令僅用于證明你可以專注于特定字段。你可以使用另一個字段的編號嘗試相同的命令,以查看數(shù)據(jù)的另一個“列”的內(nèi)容:
$ awk --field-separator=";" '{print $3;}' penguins.listMiller,JFWaglerBonaparteBrissonMilne-EdwardsViellotEwing,L我們尚未進行任何排序,但這是良好的基礎(chǔ)。
awk 不僅僅是命令,它是一種具有索引、數(shù)組和函數(shù)的編程語言。這很重要,因為這意味著你可以獲取要排序的字段列表,將列表存儲在內(nèi)存中,進行處理,然后打印結(jié)果數(shù)據(jù)。對于諸如此類的一系列復(fù)雜操作,在文本文件中進行操作會更容易,因此請創(chuàng)建一個名為 sort.awk 的新文件并輸入以下文本:
#!/bin/gawk -f BEGIN {        FS=";";}這會將該文件建立為 awk 腳本,該腳本中包含執(zhí)行的行。
BEGIN 語句是 awk 提供的特殊設(shè)置功能,用于只需要執(zhí)行一次的任務(wù)。定義內(nèi)置變量 FS,它代表字段分隔符,并且與你在 awk 命令中使用 --field-separator 設(shè)置的值相同,它只需執(zhí)行一次,因此它包含在 BEGIN 語句中。
你已經(jīng)知道如何通過使用 $ 符號和字段編號來收集特定字段的值,但是在這種情況下,你需要將其存儲在數(shù)組中而不是將其打印到終端。這是通過 awk 數(shù)組完成的。awk 數(shù)組的重要之處在于它包含鍵和值。 想象一下有關(guān)本文的內(nèi)容;它看起來像這樣:author:"seth",title:"How to sort with awk",length:1200。諸如作者、標(biāo)題和長度之類的元素是鍵,跟著的內(nèi)容為值。
在排序的上下文中這樣做的好處是,你可以將任何字段分配為鍵,將任何記錄分配為值,然后使用內(nèi)置的 awk 函數(shù) asorti()(按索引排序)按鍵進行排序。現(xiàn)在,隨便假設(shè)你只想按第二個字段排序。
沒有被特殊關(guān)鍵字 BEGIN 或 END 引起來的 awk 語句是在每個記錄都要執(zhí)行的循環(huán)。這是腳本的一部分,該腳本掃描數(shù)據(jù)中的模式并進行相應(yīng)的處理。每次 awk 將注意力轉(zhuǎn)移到一條記錄上時,都會執(zhí)行 {} 中的語句(除非以 BEGIN 或 END 開頭)。
要將鍵和值添加到數(shù)組,請創(chuàng)建一個包含數(shù)組的變量(在本示例腳本中,我將其稱為 ARRAY,雖然不是很原汁原味,但很清楚),然后在方括號中分配給它鍵,用等號(=)連接值。
{   # dump each field into an array    ARRAY[$2] = $R;}在此語句中,第二個字段的內(nèi)容($2)用作關(guān)鍵字,而當(dāng)前記錄($R)用作值。
除了數(shù)組之外,awk 還具有一些基本函數(shù),你可以將它們用作常見任務(wù)的快速簡便的解決方案。GNU awk中引入的函數(shù)之一 asorti() 提供了按鍵(索引)或值對數(shù)組進行排序的功能。
你只能在對數(shù)組進行填充后對其進行排序,這意味著此操作不能對每個新記錄都觸發(fā),而只能在腳本的最后階段進行。為此,awk 提供了特殊的 END 關(guān)鍵字。與 BEGIN 相反,END 語句僅在掃描了所有記錄之后才觸發(fā)一次。
將這些添加到你的腳本:
END {    asorti(ARRAY,SARRAY);    # get length    j = length(SARRAY);       for (i = 1; i <= j; i++) {        printf("%s %s\n", SARRAY[i],ARRAY[SARRAY[i]])    }}asorti() 函數(shù)獲取 ARRAY 的內(nèi)容,按索引對其進行排序,然后將結(jié)果放入名為 SARRAY 的新數(shù)組(我在本文中發(fā)明的任意名稱,表示“排序的 ARRAY”)。
接下來,將變量 j(另一個任意名稱)分配給 length() 函數(shù)的結(jié)果,該函數(shù)計算 SARRAY 中的項數(shù)。
最后,使用 for 循環(huán)使用 printf() 函數(shù)遍歷 SARRAY 中的每一項,以打印每個鍵,然后在 ARRAY 中打印該鍵的相應(yīng)值。
要運行你的 awk 腳本,先使其可執(zhí)行:
$ chmod +x sorter.awk
然后針對 penguin.list 示例數(shù)據(jù)運行它:
$ ./sorter.awk penguins.listantipodes Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyedchrysocome Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopperdemersus Spheniscus;demersus;Brisson;1760;Africanforsteri Aptenodytes;forsteri;Miller,JF;1778;Emperorlinux Torvaldis;linux;Ewing,L;1996;Tuxminor Eudyptula;minor;Bonaparte;1867;Little Bluepapua Pygoscelis;papua;Wagler;1832;Gentoo
如你所見,數(shù)據(jù)按第二個字段排序。
這有點限制。最好可以在運行時靈活選擇要用作排序鍵的字段,以便可以在任何數(shù)據(jù)集上使用此腳本并獲得有意義的結(jié)果。
你可以通過在腳本中使用字面值 var 將命令變量添加到 awk 腳本中。更改腳本,以使迭代子句在創(chuàng)建數(shù)組時使用 var:
{ # dump each field into an array    ARRAY[$var] = $R;}嘗試運行該腳本,以便在執(zhí)行腳本時使用 -v var 選項將其按第三字段排序:
$ ./sorter.awk -v var=3 penguins.listBonaparte Eudyptula;minor;Bonaparte;1867;Little BlueBrisson Spheniscus;demersus;Brisson;1760;AfricanEwing,L Torvaldis;linux;Ewing,L;1996;TuxMiller,JF Aptenodytes;forsteri;Miller,JF;1778;EmperorMilne-Edwards Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyedViellot Eudyptes;chrysocome;Viellot;1816;Sothern RockhopperWagler Pygoscelis;papua;Wagler;1832;Gentoo以上是“l(fā)inux中的Awk命令怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
以上是“l(fā)inux中的Awk命令怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
                網(wǎng)站欄目:linux中的Awk命令怎么用
                
                網(wǎng)址分享:http://www.chinadenli.net/article36/jdhspg.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站維護、用戶體驗、企業(yè)網(wǎng)站制作、網(wǎng)頁設(shè)計公司、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
