awk使用詳解

一、awk基本用法

awk [options] 'scripts' file1,file2... 

awk [options] 'pattern {action}' file1,file2...

# -F選項指定分隔符,$num,代表第num個字段
[root@docker1 ~]# awk -F: '{print $1,$3}' /tmp/passwd 
root 0
bin 1
daemon 2
adm 3
......
#匹配正則表達式用:/正則表達式/,匹配以r開頭的行
[root@ju ~]# awk -F: '/^r/{print $1}' /tmp/passwd
root
rtkit
#匹配第三列大於400的
[root@ju ~]# awk -F: '$3>=400{print $1,$3}' /tmp/passwd
rtkit 499
saslauth 498
pulse 497
jenkins 496
#匹配第三列大於497的,支持加法
[root@ju ~]# awk -F: '$3>=400+97{print $1,$3}' /tmp/passwd
rtkit 499
saslauth 498
pulse 497
#第七列以bash結尾的行
[root@ju ~]# awk -F: '$7~"bash$"{print $1,$3,$7}' /tmp/passwd
root 0 /bin/bash
#第七列不以bash結尾的行
[root@ju ~]# awk -F: '$7!~"bash$"{print $1,$3,$7}' /tmp/passwd
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
......



二、awk內置變量

ARGC               命令行參數個數

ARGV               命令行參數排列

ENVIRON            支持隊列中系統環境變量的使用

FILENAME           awk處理的文件名稱

FS                 設置輸入域分隔符,等價於命令行 -F選項

NF                 瀏覽記錄的域的個數

NR                 awk命令已處理的行記錄數;如果有多個文件,它會把處理的多個文件中行統一計數

FNR                與NR不同的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數

OFS                輸出字段分隔符

ORS                輸出行分隔符

RS                 輸入文本信息所使用的換行符

[root@docker1 ~]# awk -F: 'BEGIN{OFS="-----";}/^s/{print $1,$3}' /tmp/passwd
sync-----5
shutdown-----6
saslauth-----498
sshd-----74
[root@docker1 ~]# awk 'BEGIN{FS=":";OFS="-----"}/^s/{print $1,$3}' /tmp/passwd
sync-----5
shutdown-----6
saslauth-----498
sshd-----74


三、printf的格式用法

format格式的指示符都以%開頭,後跟一個字符;如下:

%c: 顯示字符的ASCII碼

%d, %i:十進制整數

%e, %E:科學計數法顯示數值

%f: 顯示浮點數

%g, %G: 以科學計數法的格式或浮點數的格式顯示數值

%s: 顯示字符串

%u: 無符號整數

%%: 顯示%自身


修飾符:

N: 顯示寬度;

-: 左對齊;

+:顯示數值符號;

[root@docker1 ~]# awk -F: '/^s/{printf "%-12s -----  %s\n",$1,$3}' /tmp/passwd
sync         -----  5
shutdown     -----  6
saslauth     -----  498
sshd         -----  74


四、輸出重定向

print sth > outfile

print sth >> outfile

print sth | cmd


特殊文件描述符:

/dev/stdin:標準輸入

/dev/sdtout: 標準輸出

/dev/stderr: 錯誤輸出

/dev/fd/N: 某特定文件描述符,如/dev/stdin相當於/dev/fd/0

[root@docker1 ~]# awk -F: '/^r/{printf "%-13s bash is %s\n",$1,$7 > "/tmp/test" }' /tmp/passwd
[root@docker1 ~]# cat /tmp/test 
root          bash is /bin/bash
rtkit         bash is /sbin/nologin


五、BEGIN和END的使用

[root@ju ~]# awk -F: 'BEGIN{print "--------begin---------"}{printf "%-20s%-10s\n",$1,$3}END{print "-------over--------"}' /tmp/passwd
--------begin---------
root                0         
bin                 1         
daemon              2         
adm                 3         
lp                  4                
......
sshd                74        
tcpdump             72        
jenkins             496       
-------over--------


六、控制語句

1、if-else語句

[root@docker1 ~]# awk -F: '{if ($7=="/sbin/nologin") printf "%-20s is %s\n", $1,"Nologin User"; else printf "%-20s is  %s\n", $1, "Login User"}' /etc/passwd
root                 is  Login User
bin                  is Nologin User
daemon               is Nologin User
adm                  is Nologin User
lp                   is Nologin User
sync                 is  Login User
shutdown             is  Login User
halt                 is  Login User
mail                 is Nologin User
......


2、while語句

[root@docker1 ~]# awk -F: '{i=1;while(i<=NF){if (length($i)>=20) {print $i "  is too long"};i++}}' /tmp/passwd
virtual console memory owner  is too long
/var/lib/avahi-autoipd  is too long
PulseAudio System Daemon  is too long
Privilege-separated SSH  is too long
Jenkins Continuous Integration Server  is too long

3、do-while語句

[root@docker1 ~]# awk -F: '{i=1;do {print i;i++}while(i<=1)}' /etc/passwd
1
1
1
1
1
1
......


4、for語句

[root@docker1 ~]# awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=20) {print $i "  is too long"}}}' /etc/passwd
virtual console memory owner  is too long
/var/lib/avahi-autoipd  is too long
PulseAudio System Daemon  is too long
Privilege-separated SSH  is too long
Jenkins Continuous Integration Server  is too long


5、break和continue

[root@docker1 ~]# awk -F: '{i=1;while(i<=NF){print $i;i++;break }}' /tmp/passwd
root
bin
daemon
adm
lp
sync
shutdown
......


6、next語句

[root@docker1 ~]# awk -F: '{if($1!="daemon") next;print $1}' /tmp/passwd 
daemon


七、awk中使用數組

[root@docker1 ~]# awk -F: '{UID[/^s/]++}END{for (i in UID){print i ,UID[i]}}' /tmp/passwd#以s開頭的有4行,非s開頭的有27行
0 27
1 4
[root@docker1 ~]# netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 1
LISTEN 10


八、awk的內置函數


split(string, array [, fieldsep [, seps ] ])

功能:將string表示的字符串以fieldsep爲分隔符進行分隔,並將分隔後的結果保存至array爲名的數組中;數組下標爲從0開始的序列;


length([string])

功能:返回string字符串中字符的個數;


substr(string, start [, length])

功能:取string字符串中的子串,從start開始,取length個;start從1開始計數;


system(command)

功能:執行系統command並將結果返回至awk命令


systime()

功能:取系統當前時間



這裏只講到了awk的很小一部分功能,awk是一個非常強大的工具,以後有時間再慢慢研究吧,掌握以上這些已經足夠日常絕大部分情況下的使用了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章