awk使用

awk处理方式:

     awk一次处理一行内容
     awk对每行可以切片处理
     awk '{print $1}'   //输出首个单词

awk-格式

    命令行格式
     awk [options] 'command' file(s)
     脚本格式
     awk -f awk-script-file file(s)

awk内置参数应用

     awk内置变量1
     $0: 表示整个当前行
     $1: 表示第一个字段
     $2: 表示第一个字段
     awk内置参数:分隔符
     options: -F field-separator (默认空格)
      awk -F ':' '{print $1}'
      awk -F ':' '{print "User:"$1"  uid:"$3}' passwd
     awk 内置变量2
        NR:每行的记录号
        NF:字段数量变量
        FILENAME:正在处理的文件名称
[root@186 tmp]#  awk -F ':' '{print NR,NF}' passwd
1 7(7个字段)
2 7
3 7
[root@186 tmp]# awk -F ':' '{print FILENAME}' passwd
passwd (文件名称)
passwd

案例一:显示passwd每行的行号,每行的列数,对应的用户名(print,printf)

[root@186 tmp]# awk -F ':' '{print "Line: "NR,"Col: "NF,"username: "$1}' passwd
Line: 1 Col: 7 username: root
Line: 2 Col: 7 username: bin
Line: 3 Col: 7 username: daemon
[root@186 tmp]# awk -F ':' '{printf("Line:%s Col:%s username:%s\n",NF,NR,$1)}' passwd
Line:7 Col:1 username:root
Line:7 Col:2 username:bin
Line:7 Col:3 username:daemon

案例二:显示passwd中的用户id大于100的行号和用户名(if..else...)

[root@186 tmp]# awk -F ':' '{if ($3>100) print "Line: "NR,"username: "$1}' passwd
Line: 14 username: systemd-network
Line: 16 username: polkitd
Line: 19 username: cs
Line: 20 username: user

案例三:在服务log日志中找出error的错误日期

[root@186 tmp]# awk '/Error/{print $1,$2,$3}' messages 
Apr 7 10:02:30
Apr 7 10:02:30
Apr 7 10:02:30

awk--逻辑判断式
command:pattern {awk 操作命令}
pattern:正则表达式;逻辑判断式
,! : 匹配正则表达式
==,!=,<,>: 判断逻辑表达式
例子:

#查询第一列以m开头的名称
[root@186 tmp]# awk -F ':' '$1~/^m.*/{print $1}' passwd
mail
#取反
[root@186 tmp]# awk -F ':' '$1!~/^m.*/{print $1}' passwd
root
bin
daemon
#大于100的uid
[root@186 tmp]# awk -F ':' '$3>100{print $1,$3}' passwd
systemd-network 192
polkitd 999
cs 1000
user 1001

awk-扩展格式
command2扩展:
BEGIN{PRINT "sart"} pattern{command}END{print "end"}
awk逐行读取并处理,循环的。
BEGIN是在读取之前,END是在读取之后,所以他们都没参加循环
例子:
制表显示passwd每行的行号,每行的列数,对应行的用户名。

[root@186 tmp]# awk -F ':' 'BEGIN{print "Line Col name"}{print NR,NF,$1}END{print "----"FILENAME"--"}' passwd
Line Col name  #BEGIN输出内容
1 7 root
2 7 bin
20 7 user
----passwd--   #END输出内容

统计当前文件夹下的文件/文件夹占用的大小
思路:循环前设置初始值,循环相加5列,最后输出结果

[root@186 tmp]# ll
total 200
-rw-------. 1 root root 198047 Apr  8 22:24 messages
-rw-r--r--. 1 root root    872 Apr  8 22:01 passwd
[root@186 tmp]# ls -l|awk 'BEGIN{size=0}{size+=$5}END{print "size is : "size/1024"k"}'
size is : 194.257k

统计passwd的总用户数
$1!~/^$/ 判断该行不为空行

[root@186 tmp]# awk 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' passwd 
20

统计显示uid大于100的用户名

[root@186 tmp]# awk -F ':' 'BEGIN{count=0}{if ($3 > 100) name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i]}' passwd 
0 systemd-network
1 polkitd
2 cs
3 user

统计netstat -anp状态下为LISTEN和CONNECTED的连接数

[root@186 tmp]# netstat -anp|awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'
LISTEN 2
CONNECTED 50

awk和sed比较
两者都是对文本进行处理
awk侧重于复杂逻辑处理
sed侧重于正则处理

posted @ 2021-04-08 17:37  苍茫宇宙  阅读(57)  评论(0编辑  收藏  举报