1. 程式人生 > 其它 >三劍客之awk命令----------大漠孤煙直,長河落日圓。

三劍客之awk命令----------大漠孤煙直,長河落日圓。

三劍客之awk命令

一、簡介

awk命名源自於它的三大作者名字的首字母,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。(gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴充套件)。

awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正則表示式等先進功能,是linux/unix
下的一個強大程式設計工具。它在命令列中使用,但更多是作為指令碼來使用。

awk的處理文字和資料的方式是這樣的,它逐行掃描檔案,從第一行到最後一行,尋找匹配的特定
模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(
螢幕),如果沒有指定模式,則所有被操作所指定的行都被處理

awk 格式

-F  定義欄位分隔符 ,預設是空格
#兩種語法格式
awk [optinos]  'commands' filename
awk [optinos] -f awk-script-file  filename

# awk命令由三部分組成
GEGIN{} 	#讀取所有行之前做的事情
{}			#讀一行處理一行
END{}		#讀完之後要做的事情
可以省略BEGIN{}END{},只進行{}處理,並且{}可以加匹配,成功後在處理

示例:
awk -F: '/root/{print $1,$3}' /etc/passwd
df -P |awk '$4 > 999999{print $0}'
#{print $0}可以省略,有預設輸出

二、工作原理

1.awk會接收一行作為輸入,並將這一行賦給awk的內部變數$0,每一行也可稱為一個記錄,行的邊界是以換行符作為結束
2.讀入的行,分隔符分解成若干欄位,每個欄位儲存在編好的變數中,從$1開始,最多有100多個欄位
3.使用print函式列印,OFS預設空格,如果列印$1,$3逗號分開,就會預設打印出來進行空格分開。可以自行設定OFS

三、記錄與欄位相關內部變數

$0		當前行的內容
NR		記錄號,行號,處理完一條NR+1
NF		儲存記錄的欄位數,如$1,$2
FS		輸入欄位分隔符,預設空格
OFS		輸出欄位分割符,預設空格
$NF		最後一列

四、格式化輸出

%s 		字元型別
$d		數值型別
-		表示左對齊,預設是右對齊
printf預設不會再行尾自動換行,需要自行加\n

awk -F: '{printf "|%-15s|%-15s|%-15s|\n",$1,$2,$3}' /etc/passwd

五、模式pattern與動作action

1.正則表示式
awk -F: '/egon/{print $1,$3}' 
awk '$1 ~ /^root/'  /etc/passwd
awk '$7 !~ /bash$/'  /etc/passwd

2.比較表示式---條件為真,再執行
<		#小於
<=		#小於等於
>		#大於
>=		#大於等於
==		#等於
!=		#不等於
~		#匹配
!~		#不匹配

3.算數運算
+ - * / % ^

4.邏輯運算和複合運算
&&		#邏輯與
||		#邏輯或
!		邏輯非
# awk '!($2 < 100 && $3 < 20)' filename	

5.範圍模式
NR > 3 && NR < 5  NR==3
awk '/root/,/egon/' /etc/passwd
awk '/root/,/jerry/{print NR,$1}' /etc/passwd

七、流程控制

條件判斷:if  else if    else   == 
{if (表示式) {語句;語句;...}
awk -F: '{if ($3==0){i++} else if ($>499){k++}else {j++}} END{print "管理員個數:"i;print"普通使用者個數:"k;print"系統使用者:"j}' /etc/passwd

while 迴圈
awk -F: 'i=1;while(i<=10) {print $0;i++}' /etc/passwd

for迴圈
awk -F: '{for(i=1;i<=10;i++) print $0}' /etc/passwd

陣列(索引或key對應值)
# awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd

# awk -F: '{username[i++]=$1} END{print username[1]}' /etc/passwd 

# awk -F: '{username[i++]=$1} END{print username[0]}' /etc/passwd 

# awk -F: '{username[x++]=$1} END{for(i=0;i<NR;i++) print i,username[i]}' /etc/passwd

練習題

1. 取得網絡卡IP(除ipv6以外的所有IP)
2. 獲得記憶體使用情況
3. 獲得磁碟使用情況
4. 清空本機的ARP快取
5. 打印出/etc/hosts檔案的最後一個欄位(按空格分隔)
6. 列印指定目錄下的目錄名
7.已知一個變數 msg="I am a teacher, my name is egon",列印字元長度小於3的單詞