linux中的awk
awk
更适合编辑,处理匹配到的文本
[root@hecs-98663 ~]# which awk
/usr/bin/awk
[root@hecs-98663 ~]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 2月 10 2022 /usr/bin/awk -> gawk
语法
awk [option] 'pattern[action]' file
简单用法
[root@hecs-98663 myxxx]# cat 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
#把第一列取出
#默认空格分隔
[root@hecs-98663 myxxx]# awk '{print $1}' 1.txt
chris111
chris444
chris777
#把整行取出
[root@hecs-98663 myxxx]# awk '{print $0}' 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
[root@hecs-98663 myxxx]# awk '{print}' 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
awk内置变量
$n 第n个字段
$0 完整的输入记录
FS 字段分隔符,默认是空格
NF 分割后,当前一共有多少个字段
NR 当前记录数
man awk
awk必须外层单引号,内层双引号
awk参数
-F 指定分割字段
-v 定义或修改一个awk内部变量
-f 从脚本中读取awk命令
[root@hecs-98663 myxxx]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@hecs-98663 myxxx]# awk '{print $1}' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@hecs-98663 myxxx]# awk -F: '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@hecs-98663 myxxx]# awk 'NR==2{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@hecs-98663 myxxx]# awk 'NR==2,NR==4{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@hecs-98663 myxxx]# awk 'NR==2,NR==4' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@hecs-98663 myxxx]# awk 'NR==2' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
#显示每一行并输出行号
[root@hecs-98663 myxxx]# awk '{print NR,$0}' passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
#取出第一列和倒数第一列
[root@hecs-98663 myxxx]# awk -F: '{print $1,$(NF)}' passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
输出分隔符
[root@hecs-98663 myxxx]# cat 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
[root@hecs-98663 myxxx]# awk -v OFS="#" '{print $1,$2}' 1.txt
chris111#chris222
chris444#chris555
chris777#chris888
[root@hecs-98663 myxxx]# awk -v OFS="\t" -v FS=":" '{print$1,$2}' passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
awk变量分为内置与自定义变量
FS:输入字符风隔符,默认为空白字符
OFS:输出字段分隔符,默认为空白 字符
RS:输入记录分隔符(输入换行符),指定输入时的额换行符
ORS:
NF:number of Field,当前行的字段的个数,字段数量
NR:行号,当前处理的文本行的行号
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
[root@hecs-98663 myxxx]# awk -v RS=" " '{print}' 1.txt
chris111
chris222
chris333
chris444
chris555
chris666
chris777
chris888
chris999
[root@hecs-98663 myxxx]# awk -v OFS="#" 'BEGIN{print "xxx"} {print ARGV[0],ARGV[1],ARGC,$0}' 1.txt
xxx
awk#1.txt#2#chris111 chris222 chris333
awk#1.txt#2#chris444 chris555 chris666
awk#1.txt#2#chris777 chris888 chris999
[root@hecs-98663 myxxx]# awk -v myname=chris 'BEGIN{print "i am ",myname}'
i am chris
printf
%c
%d ,%i
%e ,%E 科学技术法显示数值
%f显示浮点数
%g ,%G 以科学计数法或浮点数显示数值
%s 显示字符串
%u 无符号整数
%% 自身
-左对齐,默认右对齐
+显示数值符号,printf "%+d"
[root@hecs-98663 myxxx]# awk '{printf $0}' 1.txt
chris111 chris222 chris333chris444 chris555 chris666chris777 chris888 chris999[root@hecs-98663 myxxx]#
[root@hecs-98663 myxxx]# awk '{printf "%s\n",$0}' 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
格式化输出案例
[root@hecs-98663 myxxx]# awk 'BEGIN{printf "%-25s\t %-25s\t %s\n","第一列","第二列","第三列"}{printf "%-25s\t %-25s\t %s\n",$1,$2,$3}' 1.txt
第一列 第二列 第三列
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
begin end
[root@hecs-98663 myxxx]# awk 'BEGIN{print "xxxxx"}{print $0}END{print "yyyyy"}' 1.txt
xxxxx
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
yyyyy
awk模式
<
<=
==
!=
>=
>
~ 匹配正则
!~ 不匹配正则
[root@hecs-98663 myxxx]# awk 'NR<3{print $0}' 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
[root@hecs-98663 myxxx]# awk 'NR!=2{print $0}' 1.txt
chris111 chris222 chris333
chris777 chris888 chris999
[root@hecs-98663 myxxx]# awk '/chris555/{print $0}' 1.txt
chris444 chris555 chris666
[root@hecs-98663 myxxx]# awk '{print 111}{print $0}' 1.txt
111
chris111 chris222 chris333
111
chris444 chris555 chris666
111
chris777 chris888 chris999
[root@hecs-98663 myxxx]# awk '/chris111/,/chris777/{print $0}' 1.txt
chris111 chris222 chris333
chris444 chris555 chris666
chris777 chris888 chris999
案例:查看访问ip数量
awk '{print $1}' access.log | sort -n | uniq | wc -l
案例:访问网站数量前10的ip
awk '{print $1}' access.log | sort -n | uniq -c | sort -nr | head -10
案例:统计⽂本信息
姓名 区号 电话 三个⽉捐款数量
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
显示所有电话号码
提示:
awk -F "[:]" '{print $1,$2}' tel.txt #⻅到冒号就切⼀⼑
awk -F "[ ]" '{print $1,$2}' tel.txt #⻅到空格就切⼀⼑
awk -F "[ :]" '{print $1,$2,$3,$4}' tel.txt #⻅到空格或冒号,都切
答案:
awk -F "[ :]" '!/^$/{print $4}' tel.txt #排除空⾏,取出电话
显示Tom的电话
[root@chaogelinux tmp]# awk -F "[ :]+" '/^Tom/{print $4}' tel.txt
926-3456
显示Nancy的姓名、区号、电话
[root@chaogelinux tmp]# awk -F "[ :]" '/^Nancy/{print $1,$2,$4}' tel.txt
Nancy McNeil 548-1278
显示所有D开头的姓
[root@chaogelinux tmp]# awk -F "[ :]" '/^D/{print $2}' tel.txt
Savage
[root@chaogelinux tmp]# awk -F "[ :]" '$2~/^D/{print $2}' tel.txt
Dobbins
Dalsass
显示所有区号是916的⼈名
#针对第三列匹配正则,打印第⼀列
[root@chaogelinux tmp]# awk -F "[ :]" '$3~/\[916\]/{print $1}' tel.txt
Guy
John
Elizabeth
显示Mike的捐款信息,在每⼀款前加上美元符
[root@chaogelinux tmp]# awk -F "[ :]" '/^Mike/{print "$"$(NF-2),"$"$(NF-1),"$"$NF}' tel.txt
$250 $100 $175
删除⽂件的空⽩⾏(awk不修改源⽂件),替换后的内容重定向写⼊新⽂ 件
root@chaogelinux tmp]# awk '!/^$/{print $0}' tel.txt > tel2.txt
[root@chaogelinux tmp]# awk '!/^$/' tel.txt > tel2.txt

浙公网安备 33010602011771号