awk 学习记录

awk处理方式

  • awk一次处理一行内容

  • awk对每行可以切片处理

1
awk '{print $1}'  #输出首个单词

使用awk-格式

  • 命令行格式
1
awk [options] 'command' files
  • 脚本格式
1
awk -f awk-script-file files
  • awk 内置变量1
1
2
3
4
5
6
$0  表示整个当前行
$1 每行第一个字段
$2 每行第二个字段
NR 每行的记录号
NF 字段数量变量/字段总数
FILENAME 正在处理的文件名
  • awk 内置参数 分隔符
1
2
3
4
5
6
7
8
9
10
11
12
13
options : -F field-separator(默认为空格)

awk -F ':' '{print $3}' /etc/passwd

下面的花式加东西

awk -F ':' '{print $1,$3}' passwd

awk -F ':' '{print $1" "$3}' passwd

awk -F ':' '{print $1"\t"$3}' passwd

awk -F ':' '{print "USER:"$1,"\t""UID:"$3}' passwd
  • 逻辑判断式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
~   !~  匹配正则表达式

== != < > 判断逻辑表达式

awk -F ':' '$1~/^m.*/{print $1}' passwd
匹配m开头的,并输出第一个字符串


awk -F ':' '$1!~/^m.*/{print $1}' passwd
不匹配m开头的,并输出第一个字符串

awk -F ':' '$3==100{print $1,$3}' passwd
第三个字符串等于100 的输出第一个字符串和第三个字符串


awk -F ':' '$3!=100{print $1,$3}' passwd
第三个字符串不等于100 的输出第一个字符串和第三个字符串

案例

  • 案例一

显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print,printf)

1
2
3
4
5
6
7
awk -F ':' {'print "Line: "NR, "Col: "NF,"User:"$1}' passwd

awk -F ':' '{printf("Line:%s Col:%s User:%s",NR,NF,$1)}' passwd

awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' passwd #增加\n

awk -F ':' '{printf("Line:%3s Col:%s User:%s\n",NR,NF,$1)}' passwd #字符数%3s
  • 案例二

显示/etc/passwd中用户ID大于100的行号和用户名(if....else....)

1
awk -F ':' '{if ($3>100) print "Line:  "NR,"User: "$1}' passwd
  • 案例三

找出服务器日志中的报错

1
awk '/Error/{print $1}' log中先定位Error所在行
  • 案例四

制表显示/etc/passwd每行的行号,每行的列数,对应行的用户名

1
2
3
awk -F ':' 'BEGIN{print "line Colun user"}{print NR,NF,$1}END{print "--------"FILENAME"--------"}' passwd

BEGIN{}可以看成是循环的开始,作初始化用,END{ }代表结束前的处理,中间是循环体
  • 案例五

统计当前文件夹下的文件/文件夹占用的大小

1
2
3
ls -l|awk 'BEGIN{size=0}{size+=$5}END{print "size is:"size/1024/1024"M"}'

定义变量统计当前目录下的文件/目录占用的大小
  • 案例六

统计显示/etc/passwd的账户总人数

1
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print " count = "count}' passwd
  • 案例七

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

1
2
3
awk -F ':' 'BEGIN{count=0}{if($3>100)name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i]}'

passwd统计显示/etc/passwd的账户总人数,用数组存用户名再循环打印
  • 案例八

统计netstat -anp 的连接数

1
2
3
netstat -anp|awk '$6~/CONNECTED/{sum[$6]++}$7~/LISTENING/{sum[$7]++}END{for(i in sum) print i,sum[i]}'

统计连接数
0%