awk命令

Linux小菜鸟發表於2024-11-14

awk

【1】、awk作用

1.取行
2.取列
3.模糊過濾
4.判斷比較
字串比對
數字比對
5.支援if for while 陣列
6.格式化輸出

GNU/AWK
程式語言

語法結構:
	    awk '模式'     file  # 預設就是輸出 不需要加動作
		awk '模式+動作' file
	    其他命令的輸出|作為awk命令的輸入
	    df -h|awk 'NR==2'   

【2】、awk取行

語法結構:
		awk 'NR==3' file
NR awk的內建變數,儲存著每行的行號
符號
== 等於第幾行
>  大於第幾行
>= 大於等於第幾行
<  小於第幾行
<= 小於等於第幾行
!= 不等
&& 並且 類似sed的 1,3
|| 或者 
案例1:awk取出檔案的第三行
[root@kylin-xu ~]# awk 'NR==3' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin

案例2:awk取出檔案行數大於77的行
[root@kylin-xu ~]# awk 'NR>7' passwd 
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
root:x:11:0:operator:/root:/sbin/nologin

案例3:awk取出檔案中行數小於3 的行
[root@kylin-xu ~]# awk 'NR<3' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

案例4:awk取出文中行數不等於1的行
[root@kylin-xu ~]# awk 'NR!=1' passwd 

案例5:查詢大於3小於5的行
[root@kylin-xu ~]# awk 'NR>3&&NR<5' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin

案例6:查詢第3行或第5行
[root@kylin-xu ~]# awk 'NR==3||NR==5' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

【3】、awk模糊過濾

語法結構: 支援正則
	    sed -n '//p' file
	    awk '//' file    # 模糊查詢檔案中的字串
	    awk '//,//' file # 區間範圍
案例1:找出root的行
[root@kylin-xu ~]# awk '/root/' passwd 
root:x:0:0:root:/root:/bin/bash
root:x:11:0:operator:/root:/sbin/nologin

案例2:找出包含bash的行
[root@kylin-xu ~]# awk '/bash/' passwd 
root:x:0:0:root:/root:/bin/bash

案例3:找出以a開頭的行
[root@kylin-xu ~]# awk '/^a/' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin

案例4:找出檔案中包含root或adm的行
[root@kylin-xu ~]# awk '/root|adm/' passwd 
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:11:0:operator:/root:/sbin/nologin

案例5:查詢中包含b或s開頭的行
[root@kylin-xu ~]# awk '/^[bs]/' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

案例6:過濾adm開頭的行,到halt開頭的行
[root@kylin-xu ~]# awk '/^adm/,/^halt/' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

[root@kylin-xu ~]# df -h | awk '/run$/,/\/$/' 
tmpfs                    979M   22M  957M    3% /run
tmpfs                    979M     0  979M    0% /sys/fs/cgroup
/dev/mapper/klas-root     39G  3.7G   35G   10% /

【4】、awk取列

語法結構:
		 awk '{print $1}' file # 取出檔案中的第1列
預設按照空格或者tab鍵分隔成列
如果沒有空格或者tab鍵,awk會將整行看成一列
在awk中一切在動作中的字串都被看做是變數,加上雙引號則視為普通的字串

awk內建變數
$0  # 表示整行
$1  # 表示檔案的第1列 
$2  # 表示檔案的第2列
,   # 逗號表示空格
NF  # 表示每一行最後一列的列號
案例1:取出第一列
[root@kylin-xu ~]# awk '{print $1}' 4.txt 
a
d
a
a

案例2:取出第一列和第二列,雙引號視為普通字串
[root@kylin-xu ~]# awk '{print $1,$2}' 4.txt 
a b
d e
a s
a x
[root@kylin-xu ~]# awk '{print $1" "$2}' 4.txt 
a b
d e
a s
a x
[root@kylin-xu ~]# awk '{print $1","$2}' 4.txt 
a,b
d,e
a,s
a,x

案例3:取出第二列和第一列,反著來
[root@kylin-xu ~]# awk '{print $2","$1}' 4.txt 
b,a
e,d
s,a
x,a

案例4:取出檔案中最後一列,NF是表示每一行有多少列是具體的數字
[root@kylin-xu ~]# awk '{print NF}' 4.txt 
3
3
4
5
[root@kylin-xu ~]# awk '{print $NF}' 4.txt 
c
f
g
b

[root@kylin-xu ~]# df -h| awk '{print $NF}' 
掛載點
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/tmp
/backup
/boot
/run/user/0

指定分隔符

awk指定分隔符
語法結構:
	     awk -F: '{print $1}'    # 第一種指定分隔符方法
	     awk -F ":" '{print $1}' # 第二種指定分隔符方法
案例1:取出passwd檔案中第一列
awk -F: '{print $1}' passwd 

案例2:統計成績
[root@kylin-xu ~]# cat sorce.txt 
張三  Linux96  100
李四  Linux96  22
老王  Linux96  33
趙六  Linux96  44
[root@kylin-xu ~]# awk '{print $1,$3}' sorce.txt | sort -rn -k2
張三 100
趙六 44
老王 33
李四 22

案例3:萬物皆可分割
[root@kylin-xu ~]# echo abca | awk -Fc  '{print $1}'
ab

[root@kylin-xu ~]# awk -F ":/" '{print $2}' passwd 
root
bin
sbin
var/adm
var/spool/lpd
sbin
sbin
sbin
var/spool/mail
root

案例4:指定兩個分隔符
[root@kylin-xu ~]# awk -F ":|/" '{print NF}' passwd 
10
10
10
11
12
10
10
10
12
10 

案例5:任意字元作為分隔符
[root@kylin-xu ~]# awk -F "[:/]" '{print NF}' passwd 

案例6:
[root@kylin-xu ~]# cat 5.txt 
--:-/test--/::oldboy-oldgirl
[root@kylin-xu ~]# awk -F "[-:/]" '{print $6}' 5.txt 
test
[root@kylin-xu ~]# awk -F "[-:/]+" '{print $2}' 5.txt 
test

awk模式+動作

模式: 透過NR找出指定的行  awk 'NR==5'
	 透過模糊過濾的方式找出行 awk '/root/'
awk 'NR==5{print $1}'
案例1:輸出檔案中第二行第二列
[root@kylin-xu ~]# awk -F: 'NR==2{print $2}' passwd 
x

案例2:輸出檔案中大於第六行的最後一列
[root@kylin-xu ~]# awk -F: 'NR>6{print $NF}' passwd 
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

案例3:輸出第一行的第一列和最後一列
[root@kylin-xu ~]# awk -F: 'NR==1{print $1,$NF}' passwd 
root /bin/bash

案例4:輸出包含adm的行的第三列
[root@kylin-xu ~]# awk -F: '/^adm/{print $3}' passwd 
3

面試題 我有一個文件,取出檔案中的第5行的第3列

awk 'NR==5{print $3}'

比較表示式

按照字元比對查詢行
案例1:查詢第一列等於root的行
[root@kylin-xu ~]# awk -F: '$1=="root"' passwd 
root:x:0:0:root:/root:/bin/bash
root:x:11:0:operator:/root:/sbin/nologin

案例2.使用正則匹配字串,匹配第一列以n結尾的行
[root@kylin-xu ~]# awk -F: '$1 ~ "n$"' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

案例3:匹配最後一列以n結尾的行
awk -F: '$1!="root"' passwd 

案例4:對開頭是r的行進行取反
awk -F: '$1 ~ "^[^r]"'  passwd 

案例5:數字比對
[root@kylin-xu ~]# awk -F: '$3==0'  passwd 
root:x:0:0:root:/root:/bin/bash

案例6:第三列大於5的行
awk -F: '$3>=5'  passwd 

[root@kylin-xu ~]# awk '$3>=50'  sorce.txt 
張三  Linux96  100

【5】、awk算術運算

案例1:
[root@kylin-xu ~]# awk 'BEGIN {print 10+1}'
11

案例2:輸出倒數第二列
[root@kylin-xu ~]# awk '{print NF-1}' 4.txt 
2
2
3
4
[root@kylin-xu ~]# awk '{print $(NF-1)}' 4.txt 
b
e
f
v

[root@kylin-xu ~]# awk '{print $(NF-1)}' 4.txt 
a
e
f
v

相關文章