Linux之awk命令

  • awk是一种可以处理数据,产生格式化报表看的语言;
  • awk认为文件中的每一行是一条记录,记录与记录一般用换行符分割;
  • awk认为文件中的每一列是一个字段,字段与字段一般用空格或\tab分割;

FS 指定输入字段分隔符;
OFFS 指定输出字段分隔符;

RS 指定输入行分隔符
ORS 指定输出行分隔符

1.awk 打印硬盘设备名称,默认以空格为分割
df -h|awk '{print $1}'
2.awk 以空格,冒号,\t,分号为分割
awk -F '[ :\t;]' '{print $1}' /data/old.txt
3.awk 以冒号为分割,打印第一列,同时将内容追加到/tmp/awk.log 文件中
awk -F: '{print $1>>"/tmp/awk.log"}' /data/dks.txt
4.打印/data/old.txt 文件中第 3 行至第 5 行,NR 表示打印行,$0 表示文本所有域
awk 'NR==3,NR==5{print}' /data/old.txt
awk 'NR==3,NR==5{print $0}' /data/old.txt
5.打印/data/old.txt 文件中第 3 行至第 5 行的第一列与最后一列
awk 'NR==3,NR==5{print $1,$NF}' /data/old.txt
6.打印/data/old.txt 文件中,长度大于 80 的行号
awk 'length($0)>80 {print NR}' /data/old.txt
7.AWK 引用 Shell 变量,使用-v 或者双引号+单引号即可
awk -v name=zhangsan '{print name,$NF}' /data/old.txt
name=zhangsan;echo |awk '{print "'${name}'";}'
8.awk 以冒号切割,打印第一列同时只显示前 5 行
awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
9.awk 指定文件 awk.sum 第一列的总和
awk '{sum+=$1} END{print sum}' awk.sum
10.awk NR 行号除以 2 余数为 0 则跳过该行,继续执行下一行,打印在频幕上
awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd
11.awk 添加自定义字符 ip_ ,并打印出 ip 地址
ifconfig eth0 |grep "inet "|awk '{print "ip_"$2} '
12.awk 与 if 组合,判断数字比较
echo 3 2 1| awk '{if(($1>$2)||($1>$3)){print $2}else{print $1}}'
13.awk 与数组组合,统计 passwd 文件用户数
awk -F: 'BEGIN{count=0;} {name[count]=$1;count++;};END{for(i=0;i<NR;i++)print i,name[i]}' /etc/passwd
14.awk 分析 Nginx 访问日志的状态码 404、502 等错误信息页面,统计次数大于 20 的 IP 地址
awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'
15.awk 统计服务器状态连接数
netstat -an |awk '/tcp/ {s[$NF]++} END{for(a in s) {print a,s[a]}}'
netstat -an |awk '/tcp/ {print $NF}' | sort | uniq -c
16.打印文本最后一行
awk -n '$=' file.txt
17.打印行数
awk 'END{print NR}' file.txt
18.打印列数
awk 'END{print NF}' file.txt 
19.awk流程控制
awk '{if($1>5) print $0}' file.txt

#实现$1+$2+$3
awk '{sum=0;for(i=1;i<4;i++){sum+=$i}print sum}' file.txt

awk '{sum=0;i=1;while(sum<150){sum+=$i;i++}print sum}' file.txt
posted @ 2020-01-10 11:07  IMSCZ  阅读(873)  评论(0编辑  收藏  举报