SHELL编程四剑客-awk

目录:

  1. awk简介
  2. awk基本参数语法
  3. awk实例

awk简介

awk是一个行级文本高效处理工具,AWK 经过改进生成的新的版本有 Nawk、Gawk,一般 Linux 默认为 Gawk,Gawk 是 AWK 的 GNU 开源免费版本

awk 基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式, 如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则 继续处理下一行

语法格式

awk -option 'pattern + {action}' file

一些注意事项

  • 单引号’ '是为了和 shell 命令区分开;
  • 大括号{ }表示一个命令分组;
  • pattern 是一个过滤器,表示匹配 pattern 条件的行才进行 Action 处理;
  • action 是处理动作,常见动作为 Print;
  • 使用#作为注释,pattern 和 action 可以只有其一,但不能两者都没有。

awk基本参数语法

awk内置变量

FS 分隔符,默认是空格;
OFS 输出分隔符;
NR 当前行数,从 1 开始;
NF 当前记录字段个数;
$0 当前记录;
$1~$n 当前记录第 n 个字段(列)

awk内置函数

gsub(r,s):在$0 中用 s 代替 r;
index(s,t):返回 s 中 t 的第一个位置;
length(s):s 的长度;
match(s,r):s 是否匹配 r;
split(s,a,fs):在 fs 上将 s 分成序列a;
substr(s,p):返回 s 从 p 开始的子串

awk常用操作符,运算符及判断符

++ --	增加与减少( 前置或后置);
^ **    指数( 右结合性);
! +	-   非、一元(unary) 加号、一元减号;
+ - * / 加、减、乘、除、余数;
< <= ==	!= > >=   数字比较;
&&		逻辑 and;
||	    逻辑 or;
= += -= *= /= = ^= **=	赋值

awk流程控制语句

if(condition) { } else { };
while { };
do{ }while(condition);
for(init;condition;step){ };
break/continue

回到目录

awk实例

# awk 打印硬盘设备名称,默认以空格为分割:
df -h|awk '{print $1}'

# awk 以空格、冒号、\t、分号为分割:
awk	-F '[ :\t;]' '{print $1}' test.txt

# awk 以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log 下:
awk	-F:	'{print $1 >>"/tmp/awk.log"}' test.txt

# 打印 test.txt 文件中的第 3 行至第 5 行,NR 表示打印行,$0 表示文本所有域:
awk 'NR==3,NR==5 {print}' test.txt
awk 'NR==3,NR==5 {print $0}' test.txt

# 打印 test.txt 文件中的第 3 行至第 5 行的第一列与最后一列:
awk 'NR==3,NR==5 {print $1,$NF}' test.txt

# 打印 test.txt 文件中,长度大于 80 的行号:
awk	'length($0)>80 {print NR}' test.txt

# awk 引用 Shell 变量,使用-v 或者双引号+单引号即可:
awk -v STR=hello '{print STR,$NF}' test.txt
STR="hello";echo| awk '{print "'${STR}'";}'

# awk 以冒号切割,打印第一列同时只显示前 5 行:
cat	/etc/passwd|head -5|awk	-F:	'{print $1}'
awk	-F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
awk -F: 'NR==1,NR==5 {print $1}' /etc/passwd

# awk 指定文件 jfedu.txt 第一列的总和:
cat test.txt |awk '{sum+=$1}END{print sum}'

# awk NR 行号除以 2 余数为 0 则跳过该行,继续执行下一行,打印在屏幕:
awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd

# awk 添加自定义字符:
ifconfig eno16777736|grep "broadcast"|awk '{print "ip_"$2}'

# awk 格式化输出 passwd 内容,printf 打印字符串, 格式化输出分隔符,s 表示字符串类型,-12 表示 12 个字符,-6 表示 6 个字符:
awk -F: '{printf " %-12s %-6s %-8s\n",$1,$2,$NF}' /etc/passwd

# awk OFS 输出格式化\t:
netstat -an|awk '$6 ~ /LISTEN/&&NR>=1&&NR<=10 {print NR,$4,$5,$6}' OFS="\t"

# awk 与 if 组合实战,判断数字比较:
echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'

# awk 与数组组合实战,统计 passwd 文件用户数:
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0;i < NR; i++) print i, name[i]}' /etc/passwd

# 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}'

# 用/etc/shadow 文件中的密文部分替换/etc/passwd 中的"x"位置,生成新的/tmp/passwd 文件。
awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print >>"/tmp/passwd"}' /etc/shadow /etc/passwd

# 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

回到目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值