1. 程式人生 > >Shell程式設計5_文字處理三劍客(awk)

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其三者的應用豐富多樣,文字處理是比較靈活的,只要符合規則,可以任意組合;面對不同的問題,寫出多樣的,符合實際情況的策略