Back
Please upgrade your browser or check your network connection.

awk 学习记录

awk 处理方式

  • awk 一次处理一行内容

  • awk 对每行可以切片处理

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

使用 awk-格式

  • 命令行格式
1awk [options] 'command' files
  • 脚本格式
1awk -f awk-script-file files
  • awk 内置变量 1
1$0  表示整个当前行
2$1  每行第一个字段
3$2  每行第二个字段
4NR  每行的记录号
5NF  字段数量变量/字段总数
6FILENAME    正在处理的文件名
  • awk 内置参数 分隔符
 1options : -F field-separator(默认为空格)
 2
 3awk -F ':' '{print $3}' /etc/passwd
 4
 5下面的花式加东西
 6
 7awk -F ':' '{print $1,$3}' passwd
 8
 9awk -F ':' '{print $1"  "$3}' passwd
10
11awk -F ':' '{print $1"\t"$3}' passwd
12
13awk -F ':' '{print "USER:"$1,"\t""UID:"$3}' passwd
14
  • 逻辑判断式
 1~   !~  匹配正则表达式
 2
 3==  !=  <   >   判断逻辑表达式
 4
 5awk -F ':' '$1~/^m.*/{print $1}' passwd
 6匹配m开头的,并输出第一个字符串
 7
 8
 9awk -F ':' '$1!~/^m.*/{print $1}' passwd
10不匹配m开头的,并输出第一个字符串
11
12awk -F ':' '$3==100{print $1,$3}' passwd
13第三个字符串等于100 的输出第一个字符串和第三个字符串
14
15
16awk -F ':' '$3!=100{print $1,$3}' passwd
17第三个字符串不等于100 的输出第一个字符串和第三个字符串

案例

  • 案例一

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

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

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

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

找出服务器日志中的报错

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

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

1awk -F ':' 'BEGIN{print "line Colun user"}{print NR,NF,$1}END{print "--------"FILENAME"--------"}' passwd
2
3BEGIN{}可以看成是循环的开始,作初始化用,END{ }代表结束前的处理,中间是循环体
  • 案例五

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

1ls -l|awk 'BEGIN{size=0}{size+=$5}END{print "size is:"size/1024/1024"M"}'
2
3定义变量统计当前目录下的文件/目录占用的大小
  • 案例六

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

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

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

1awk -F ':' 'BEGIN{count=0}{if($3>100)name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i]}'
2
3passwd统计显示/etc/passwd的账户总人数,用数组存用户名再循环打印
  • 案例八

统计 netstat -anp 的连接数

1netstat -anp|awk '$6~/CONNECTED/{sum[$6]++}$7~/LISTENING/{sum[$7]++}END{for(i in sum) print i,sum[i]}'
2
3统计连接数
Licensed under CC BY-NC-SA 4.0