Shell程式設計5_文字處理三劍客(awk)
文字處理三劍客(awk)
1.awk介紹
AWK:三位創造者Aho、Weinberger和Kernighan統稱
官方定義:一個優秀的樣式掃描與處理工具
定位:AWK是一種用於處理文字的程式語言工具,主要用於格式化報文或從一個大的文字檔案中抽取資料。提取原來文字中行的某些域進行計算組合顯示,出結果
【掃描檔案中的每一行,查詢與命令列中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個程式設計步驟。如果找不到匹配內容,則繼續處理下一行,直到檔案末尾】
優點:
1.處理檔案中的記錄(與資料庫相比)
2.簡單,解釋執行,不必編譯(與C相比)
3.容易獲得,unix自帶(whereis awk)
2.awk引數格式
語法組成:【查詢 -à 執行處理】
awk ‘pattern{action}’ filename
【注意,pattern在非括號中,用於查詢篩選匹配行,action在括號中,action是在找到匹配內容時所執行的一系列命令,用於對篩選後的內容進行處理】
其中action內容可擴充,也可以有多個action。
執行順序:awk一行行讀入輸入檔案,順序執行‘’內內容,按模式匹配來採取動作。
其他呼叫:awk可用內部變數和函式,條件與迴圈語句,也可執行數學運算和字串操作。此外,可以使用BEGIN和END來執行處理前預操作和處理後後繼操作。
格式:
awk [ -F re] [parameter…] [‘prog’] [-f progfile]
3.處理機制
3-1.逐行處理
(1)會在記憶體中開闢一塊awk處理文字的記憶體空間
(2)每一次讀入檔案中的一行文字到記憶體空間進行處理
(3)自帶迴圈:處理完第一行並輸出,然後再讀入第二行,以此類推
3-2.切割欄位
(1)可以根據指定的分隔符,把讀入的一行文字切割成若干的欄位
(2)每個欄位都有對應的變數來表示
變數 | 含義 |
---|---|
$0 | 讀入的整行 |
$1 | 第一個欄位 |
$2 | 第n個欄位 |
(3)預設的欄位分隔符是 空白符 (空格、tab鍵)
(4)而且個數不限,多個連續的空白符被識別為一個空白符
4.語句塊使用場景
4-1.BEGIN語句塊
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如:變數初始化、列印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中
4-2.END語句塊
END語句塊在awk從輸入流中讀取完所有的行之後即被執行,它也是一個可選語句塊,比如:列印所有行的分析結果這類資訊彙總都是在END語句塊中完成
4-3.pattern語句塊
pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則預設執行{ print },即列印每一個讀取到的行,awk讀取的每一行都會執行該語句塊
5.操作練習
awk '{print FILENAME}' filename ##filename有幾行將打印出幾個filename檔名
檔案內容
檔案內容
此處將/etc/passwd檔案複製到當前目錄
計數:
第幾行(NR)有幾列(NF)
awk {print NR,NF} filename
awk 'BEGIN{print "NAME"}' 輸入開始列印內容NAME,END在最後
awk ‘BEGIN{print “Username”}{print NR,NF,FILENAME}’ file
【練習】查詢系統中可互動式登陸系統的所有使用者並以表頭Username,Uid打印出來,末尾說明All can login system by x11
第一步:互動登陸使用者使用的是bin/bash
awk '/\<bin\/bash\>/{print}' /etc/passwd 查詢含bin/bash的行\<bin\/bash\>精確查詢
第二步:過濾使用者名稱和UID
awk -F : '/\<bin\/bash\>/{print $1,$3}' /etc/passwd
第三步:列印開頭資訊
第四步:列印末尾資訊
6.過濾
方法與grep大體一致
查詢passwd中以root開頭的行
awk '/^root/' passwd 查詢passwd中以root開頭的行
查詢系統使用者所用目錄不是home下的可互動式登陸使用者
awk -F : '/\<bin\/bash\>/&&!/\<home\>/{print $1,$6}' passwd
列印passwd 中行首不是a-d的行
awk '/^[^a-d]/' {print} passwd 其實不加{print}的時候相當於過濾,結果都一樣
7.包含
awk -F : '$n~/root/{print}' passwd passwd中第n列含root單詞的行
awk -F : '$n!~/root/{print}' passwd passwd中第n列不含root單詞的行
awk -F : '$n~/root/{print $m}' passwd passwd中第n列含root單詞的行列印第m列
【練習】實驗:列印eth0的ip
ifconfig team0 | awk '/inet\>/{print $6}'
ifconfig team0 | awk '/\<inet\>/{print $6}'
8.三劍客結束語:
awk grep sed其三者的應用豐富多樣,文字處理是比較靈活的,只要符合規則,可以任意組合;面對不同的問題,寫出多樣的,符合實際情況的策略