shell編程下的AWK文法小結_PHP教程

來源:互聯網
上載者:User
AWK 工具 + 生產力帶有其自己的自包含語言,它是Unix/Linux 中也是任何環境中現有的功能最強大的資料處理引擎之一。這種編程及資料操作語言(其名稱得自於它的創始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決於一個人所擁有的知識。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及產生報表,還有無數其他的功能。
AWK 是什嗎? 最簡單地說,AWK 是一種用於處理文本的程式設計語言工具。AWK 工具 + 生產力的語言在很多方面類似於 shell 程式設計語言,儘管 AWK 具有完全屬於其本身的文法。在最初創造 AWK 時,其目的是用於文本處理,並且這種語言的基礎是,只要在輸入資料中有模式比對,就執行一系列指令。該工具 + 生產力掃描檔案中的每一行,尋找與命令列中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,則繼續處理下一行。 儘管操作可能會很複雜,但命令的文法始終是: awk {pattern + action} 其中 pattern 表示 AWK 在資料中尋找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括弧 ({}) 不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 瞭解欄位 工具 + 生產力將每個輸入行分為記錄和欄位。記錄是單行的輸入,而每條記錄包含若干欄位。預設的欄位分隔符號是空格或定位字元,而記錄的分隔字元是換行。雖然在預設情況下將定位字元和空格都看作欄位分隔符號(多個空格仍然作為一個分隔字元),但是可以將分隔字元從空格改為任何其它字元。 為了進行示範,請查看以下儲存為 emp_names 的員工列表檔案: 46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AR46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN當 AWK 讀取輸入內容時,整條記錄被分配給變數 。每個欄位以欄位分隔符號分開,被分配給變數 、、 等等。一行在本質上可以包含無數個欄位,通過欄位號來訪問每個欄位。因此,命令 awk {print ,,,,} names 將會產生的列印輸出是 46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AR46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN值得注意的一項重要內容是,AWK 解釋由空格分隔的五個欄位,但當它列印顯示內容時,在每個欄位間只有一個空格。利用為每個欄位指定了唯一號碼的功能,您可以選擇只列印特定的欄位。例如,只列印每條記錄的姓名時,只需選擇第二個和第三個欄位進行列印: $ awk {print ,} emp_namesDULANEY EVANDURHAM JEFFSTEEN BILLFELDMAN EVANSWIM STEVEBOGUE ROBERTJUNE MICAHKANE SHERYLWOOD WILLIAMFERGUS SARAHBUCK SARAHTUTTLE BOB$您還可以指定按任何順序列印欄位,而無論它們在記錄中是如何存在的。因此,只需要顯示姓名欄位,並且使其順序顛倒,先顯示名字再顯示姓氏: $ awk {print ,} emp_namesEVAN DULANEYJEFF DURHAMBILL STEENEVAN FELDMANSTEVE SWIMROBERT BOGUEMICAH JUNESHERYL KANEWILLIAM WOODSARAH FERGUSSARAH BUCKBOB TUTTLE$使用模式 通過包含一個必須匹配的模式,您可以選擇只對特定的記錄而不是所有的記錄進行操作。模式比對的最簡單形式是搜尋,其中要匹配的項目被包含在斜線 (/pattern/) 中。例如,只對那些居住在阿拉巴馬州的員工執行前面的操作: $ awk /AL/ {print ,} emp_namesEVAN DULANEYJEFF DURHAMBILL STEENEVAN FELDMANSTEVE SWIM$如果您不指定要列印的欄位,則會列印整個匹配的條目: $ awk /AL/ emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL$對同一資料集的多個命令可以用分號 (;) 分隔開。例如,在一行中列印姓名,而在另一行中列印城市和州名: $ awk /AL/ {print , ; print ,} emp_namesEVAN DULANEYMOBILE ALJEFF DURHAMMOBILE ALBILL STEENMOBILE ALEVAN FELDMANMOBILE ALSTEVE SWIMUNKNOWN AL$如果沒有使用分號 (print ,,,),則會在同一行中顯示所有內容。另一方面,如果分別給出兩個列印語句,則會產生完全不同的結果: $ awk /AL/ {print ,} {print ,} emp_namesEVAN DULANEYMOBILE ALJEFF DURHAMMOBILE ALBILL STEENMOBILE ALEVAN FELDMANMOBILE ALSTEVE SWIMUNKNOWN ALPHOENIX AZPHOENIX AZUNKNOWN ARMUNCIE INMUNCIE INMUNCIE INMUNCIE IN$只有在列表中找到 AL 時才會給出欄位三和欄位二。但是,欄位四和欄位五是無條件的,始終列印它們。只有第一組花括弧中的命令對前面緊鄰的命令 (/AL/) 起作用。 結果非常不便於閱讀,可以使其稍微更清晰一些。首先,在城市與州之間插入一個空格和逗號。然後,在每兩行顯示之後放置一個空行: $ awk /AL/ {print , ; print ", ""n"} emp_namesEVAN DULANEYMOBILE, ALJEFF DURHAMMOBILE, ALBILL STEENMOBILE, ALEVAN FELDMANMOBILE, ALSTEVE SWIMUNKNOWN, AL$在第四和第五個欄位之間,添加一個逗號和一個空格(在引號之間),在第五個欄位後面,列印一個分行符號 (n)。在 AWK 列印語句中還可以使用那些可在 echo 命令中使用的所有特殊字元,包括: n(換行) t(製表) b(退格) f(進紙) r(斷行符號)因此,要讀取全部五個最初由定位字元分隔開的欄位,並且也利用定位字元列印它們,您可以編程如下 $ awk {print "t""t""t""t"} emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AR46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN$通過連續設定多項標準並用管道 (|) 符號將其分隔開,您可以一次搜尋多個模式比對: $ awk /AL|IN/ emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN$這樣可找到每個阿拉巴馬州和印第安那州居民的匹配記錄。但是在試圖找出居住在亞利桑那州的人時,出現了一個問題: $ awk /AR/ emp_names46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AZ46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN$員工 46026 和 46027 沒有住在亞利桑那州;但是他們的名字中包含所搜尋的字元序列。切記,當在 AWK 中進行模式比對時,例如 grep、sed 或者大部分其他 Linux/Unix 命令,將在記錄(行)中的任何位置尋找匹配,除非指定進行其他動作。為解決這一問題,必須將搜尋與特定欄位聯絡起來。通過利用代字型大小 (?) 以及對特定欄位的說明,可以達到這一目的,如下例所示: $ awk ? /AR/ emp_names46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AZ$代字型大小(表示匹配)的對應符號是一個前面帶有驚嘆號的代字型大小 (!?)。這些字元通知程式,如果搜尋序列沒有出現在指定欄位中,則找出與搜尋序列相匹配的所有行: $ awk !? /AR/ names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN$在這種情況下,將顯示第五個欄位中沒有 AR 的所有行 — 包括兩個 Sarah 條目,這兩個條目確實包含 AR,但卻是在第三個欄位而不是第五個欄位中。 花括弧和欄位分隔符號 括弧字元在 AWK 命令中起著很重要的作用。出現在括弧之間的操作指出將要發生什麼以及何時發生。當只使用一對括弧時: {print ,} 括弧間的所有操作同時發生。當使用多於一對的括弧時: {print }{print } 執行第一組命令,在該命令完成後執行第二組命令。注意以下兩列清單的區別: $ awk {print ,} namesEVAN DULANEYJEFF DURHAMBILL STEENEVAN FELDMANSTEVE SWIMROBERT BOGUEMICAH JUNESHERYL KANEWILLIAM WOODSARAH FERGUSSARAH BUCKBOB TUTTLE$$ awk {print }{print } namesEVANDULANEYJEFFDURHAMBILLSTEENEVANFELDMANSTEVESWIMROBERTBOGUEMICAHJUNESHERYLKANEWILLIAMWOODSARAHFERGUSSARAHBUCKBOBTUTTLE$要利用多組括弧進行重複尋找,執行第一組中的命令直到完成為止;然後處理第二組命令。如果有第三組命令,則在第二組命令完成後執行它,以此類推。在所產生的列印輸出中,有兩個分隔的列印命令,因此先執行第一個命令,隨後執行第二個命令,這樣導致每個條目顯示在兩行而不是一行中。 區分兩個欄位的欄位分隔符號不一定始終是空格;它可以是任何可識別的字元。為進行示範,假定 emp_names 檔案利用冒號而不是定位字元來分隔欄位: $ cat emp_names46012:DULANEY:EVAN:MOBILE:AL46013:DURHAM:JEFF:MOBILE:AL46015:STEEN:BILL:MOBILE:AL46017:FELDMAN:EVAN:MOBILE:AL46018:SWIM:STEVE:UNKNOWN:AL46019:BOGUE:ROBERT:PHOENIX:AZ46021:JUNE:MICAH:PHOENIX:AZ46022:KANE:SHERYL:UNKNOWN:AR46024:WOOD:WILLIAM:MUNCIE:IN4602

http://www.bkjia.com/PHPjc/531983.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/531983.htmlTechArticleAWK 工具 + 生產力帶有其自己的自包含語言,它是Unix/Linux 中也是任何環境中現有的功能最強大的資料處理引擎之一。這種編程及資料操作語言(...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.