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