awk 使用举例

awk基本用法

awk  '{print $1 $2 $3 }' 文件名  # 代表打印出第一列,第二列,第三列


-F 指定分割符

awk -F: '{print $1}' 文件名   # 以:分隔 打印第一列
awk '{print}' txt			//输出文档所有内容
awk '{print $1}' txt	//输出文档每行第1列,默认用空格做分隔符
awk '{print $1 $3}' txt  //输出文档每行第1列,第3列

head -1 /etc/passwd > txt2    //准备新素材
awk '{print $2}' txt2      //输出第2列,无显示,没有空格做默认分隔符,当前文档一整行算一列
awk -F: '{print $5}' txt2  //使用:做分隔符,显示第5列
awk -F: '{print $7}' txt2	//使用:做分隔符,显示第5列

awk内置变量
$1  $2  $3 .....  NR行   NF列

awk -F[:/] '{print $9}' txt2  //使用多个分隔符后显示第9列
awk -F[:/] '{print NF}' txt2   //显示有几列
awk -F[:/] '{print NR}' txt2    //显示第几行
awk -F[:/] '{print NR NF}' txt2   //都显示,看不清
awk -F[:/] '{print NR,NF}' txt2   //加逗号有空格效果
awk -F[:/] '{print NR" "NF}' txt2  //或把空格引起来
awk -F[:/] '{print "当前行有"NF"列"}' txt2  //常量配合变量输出
awk -F[:/] '{print "当前行有NF列"}' txt2   //变量不能在双引号内,否则变常量输出

ifconfig eth0 |awk '/RX p/{print "当前网卡接收的流量是"$5"字节"}'
ifconfig eth0 |awk '/TX p/{print "当前网卡发送的流量是"$5"字节"}'

df -h | awk '/vda1/{print "磁盘可用空间是"$4}'


awk '/Failed/{print $11}' /var/log/secure   //在安全日志中查找访问本机失败的ip地址记录

awk 高级用法

awk流程控制:
BEGIN任务 执行1次
逐行任务 执行多次,与文本有关
END任务 执行1次

awk [选项] ' BEGIN{指令} {指令} END{指令}' 文件

awk -F: 'BEGIN{print "user\tUID\tHOME"} {print $1"\t"$3"\t"$6} END{print "总计",NR,"行"}' 文件 txt3 //按需求的格式输出文档内容,有表头,有结尾统计


awk处理条件

**正则**
awk -F: '$1~/root/' /etc/passwd // ~ 包含
awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd // !~不包含
**使用数值/字符串毕竟设置条件**

比较符号:  ==、!=、>、>=、<、<=
awk -F: 'NR==3{print}' txt3  // 输出第3行
awk -F: '$3==0' txt3       // 输出第三列为0的行
awk -F: '$1==root' txt3    // 无效用法
awk -F: '$1=="root"' txt3   // 有效用法(由于其是字符串)
**使用逻辑符号&& ||**
awk -F: '$3<=10 || $3>1000' /etc/passwd //找小于等于10的或者大于1000的
awk -F: '$3>10 || $3<1000' /etc/passwd  //找大于10并且小于1000的
**数学运算**
awk 'BEGIN{x++;print x}'
awk 'BEGIN{e=8;e++;print e}'
awk 'BEGIN{e=0;e--;print e}'
awk 'BEGIN{a=2+3;print a}'
awk 'BEGIN{print 2+3}'
awk 'BEGIN{print 2*3}'
awk 'BEGIN{print 2%3}'
seq 20 | awk '$1%3==0' // 20以内3的整数倍

详情可以参考该文档awk命令详解

posted @ 2022-04-13 17:46  菜鸟成长历程  阅读(265)  评论(0编辑  收藏  举报