AWK是linux下對文本及數據進行掃描處理,數據可以來自標準輸入、文件、管道。把文件中讀取到的每一行的每個字段分別進行格式化,而後進行顯示;支持使用變量、條件判斷、循環、數組
awk [options] 'script' FILE ...
awk [options] '/pattern/{action}' FILE ...
AWK有兩處特殊的模式:GEGIN和END,被放置在沒有讀取任何數據之前以及在所有數據讀取完後執行
模式:
地址定界:/pat1/,/pat2/
/pattern/
!/pattern/ 取反匹配的
BEGIN:執行前的做準備工作
END: 執行後的收尾工作
awk -F: 'BEGIN{print "UserName:\n------------"}$3>500{print $1}END{print "---------------"}' /etc/passwd
awk 'BEGIN {FS=":"}$3>=500{print $1}' /etc/passwd ### 執行前把分隔符改爲冒號
1、AWK的分隔符與記錄字段
(a)、分隔符:
輸入分隔符:
行分隔符 默認是$符、字段分隔符 默認是空白。
輸出分隔符:
行分隔符 默認是$符、字段分隔符 默認是空白。
如果想修改默認的分隔符,可以通過-F指定,或在BEGIN重新對FS進行賦值。
# awk 'BEGIN{FS = ":"}{print $1}' /etc/passwd
# awk -F : '{print $1}' /etc/passwd
# echo 'hello world:is work' | awk -F "[:, ]" '{print $3}' \\ 指定多個分隔符
(b)、記錄字段:
AWK以分隔符把從文件中讀取一條記錄,記錄在$0中,分割後的多個字段分別存儲在$1....$NF,字段的個數爲NF。
# awk -F : '{print $1}' /etc/passwd \\ 輸出該文件的第一個字段
# awk -F : '{print $NF}' /etc/passwd \\ 輸出該文件的最後一個字段
# awk -F : '{print NF}' /etc/passwd \\ 輸出該文件的字段的個數
2、awk內置變量
ARGC:命令行參數的個數
FILENAME:當前輸入文檔的名稱
FNR:輸入文件的當前記錄編號,當有多個文檔時有用
NR:輸入流的當前記錄編號
NF:字段數,可以說最後一個字段
FS: 讀入行時使用的字段分隔符,默認爲空白
OFS: 輸出時使用字段分隔符,默認爲空白
ORS:輸出記錄分隔符,默認爲換行\n
RS:輸入記錄分隔符,默認爲換行\n
3、表達式與操作符
+
-
*
/
%
^ 冪運算
--
++
+=
-=
/=
<
>
<=
>=
==
!= 不等於
~ 匹配
!~ 不匹配
&& 與
|| 或
# awk -F : '$3>500{print $1,$3}' /etc/passwd
# awk -F : '$NF~/bash$/{print $NF}' /etc/passwd
# awk '/^$/ {x+=1} END {print x}' /etc/rc.d/init.d/functions
72
*****************高級應用**********************************
1、if條件判斷
格式:
if (表達式) 動作1; else動作2
awk -F : '{if ($3>500) print $1,"user";else print $1,"ADMIN"}' /etc/passwd
2、while循環
格式1:
while (條件) 動作
# awk 'i=1 {} BEGIN { while (i<=10) {++i;print i}}'
格式2:
do 動作 while (條件)
# awk 'BEGIN { do {++x;print x} while (x<=10)}'
3、for循環
格式:
for (變量;條件;計數器)
動作
# awk 'BEGIN{for(i=1;i<=10;i++) print i}'
4、break與contiue
for (i=1;i<=10;i++) { if (i=5) continue \\ 這裏用contiue,當符合條件時就會跳出循環,只有=5時不會打印,換成break則只會打印4行。 print i }
5、函數
getline函數
作用,從輸入中讀取下一行內容,從下面df -h 輸出結果可以看出,有的剩餘餘量在第3列,有的在第4列,這樣只有通過判定NF字段數來截獲數據,如果遇到NF爲1的可以通過getline函數跳過當前行。
[root@zibbix ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_system-root \\ 一行 29G 1.9G 26G 7% / tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 194M 27M 158M 15% /boot /dev/mapper/vg_system-var \\一行 20G 584M 18G 4% /var
[root@zibbix ~]# df -h | awk '{if(NF==1){getline;print $3};if(NF==6)print $4}'
26G
504M
158M
18G
練習:
1、顯示GID小於500的組;
# awk -F : '$3<500{print $1}' /etc/group
# awk -F : 'BEGIN{print "group name\n============="}$3<500{print $1}' /etc/group
2、顯示默認shell爲nologin的用戶;
# awk -F : '$7~/nologin$/{print $1}' /etc/passwd
3、顯示eth0網卡文件的配置信息,注意,只顯示等號後面的值;
# awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
4、顯示/etc/sysctl.conf文件中定義的內核參數;只顯示名稱;
# awk -F = '!/^#|^$/{print $1}' /etc/sysctl.conf
# awk -F = '/^[^#]/{print $1}' /etc/sysctl.conf
5、顯示eth0網卡的ip地址;通過ifconfig的命令結果進行過濾
# ifconfig eth0 | awk '/inet addr/{print $2}' | awk -F: '{print $2}'
# ifconfig eth0 | awk -F "[:, ]" '/inet addr/{print $13}'
192.168.0.28 \\ 第二種結果的缺點是,如果空白字符有多個也算在內