Back
Featured image of post awk 学习记录

awk 学习记录

awk 处理方式

  • awk 一次处理一行内容

  • awk 对每行可以切片处理

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

使用 awk-格式

  • 命令行格式
awk [options] 'command' files
  • 脚本格式
awk -f awk-script-file files
  • awk 内置变量 1
$0  表示整个当前行
$1  每行第一个字段
$2  每行第二个字段
NR  每行的记录号
NF  字段数量变量/字段总数
FILENAME    正在处理的文件名
  • awk 内置参数 分隔符
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

  • 逻辑判断式
~   !~  匹配正则表达式

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

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)

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....)

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

找出服务器日志中的报错

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

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

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

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

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

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

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

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

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

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

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 的连接数

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

统计连接数
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus