awk工具使用介绍

awk工具介绍
awk也是一个功能强大的编辑工具,与sed一样,可在无交互的情况下实现相当复杂的文本操作
命令格式:
awk 选项 '模式或条件 {编辑指令}’ 文件1 文件2
awk -f 脚本文件 文件1 文件2

工作原理:
逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令

awk内置变量
FS:指定每行文本的字段分隔符,缺省为空格或制表位。 注:默认分隔符为空格
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
sort +自动排序

案例:
awk -F: ‘{print $0,NF}’ /etc/passwd //输出以冒号为分隔的/etc/passwd文件中记录的字段段 数
df -hT |awk ‘{print $1,$6}’ //用awk截取命令df -hT输出的结果,不带任何条件,进行格式化,打印第1列和第6列数据
awk ‘{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲' /etc/passwd …/{print}’ /etc/passwd //输出以nologin结尾的行
awk ‘(NR>=1)&&(NR<=3){print}’ /etc/passwd //输出第1行到第3行内容
awk "(NR%2)==1{print}’ /etc/passwd //输出所有奇数行的内容
awk ‘(NR%2)==0{print}’ /etc/passwd //输出所有偶数行的内容
awk -F: ‘!($3<900)’ /etc/passwd //输出第3个字段不小于900的行,“!”号表示取反

在使用awk的过程中,可以使用关系运算符作为“条件”,用于比较数字与字符串,运算符大于(>)、小于(<)、小于等于(<=)、等于(==)、不等于(!=)
也可使用逻辑操作符&&,表示“与”,||表示“或”,!表示“非”
还可以进行简单的数学运算加(+)、减(—)、乘(*)、除(/)、取余(%)、乘方(^)。
只有当条件为真,才执行指定的动作。

awk -F: ‘{if($3>200)print $0}’ /etc/passwd //输出第3个字段大于200的行
awk -F: ‘{max=($3>$4)?$3:$4;print max}’ /etc/passwd
//如果第3个字段的值大于第4个字段的值,则把问号前表达式的值赋给max,否则就将冒号后那个表达式的值赋给max
awk -F: ‘{max=($3>200)?$3:$1;print max}’ /etc/passwd // //如果第3个字段的值大于200,则把第3个字段的值赋给max,否则就将第1个字段的值赋给max
在使用awk过程中还可以使用条件表达式,条件表达式的运算涉及两个符号,冒号和问号,其实质就是if…else语句的捷径,有着if…else相同的结果

接字段输出文本
awk -F: ‘{print NR,$0}’ /etc/passwd //输出处理数据的行号,每处理完一条记录,NR值加1
awk -F":" ‘$3<5{print $1 $3}’/etc/passwd //输出第3列小于5的第1列与第3列数据
awk -F “:” ‘($1~"root")&&(NF7){print $1,$3}’/etc/passwd //输出包含7个字段,并且第1个字段中包含root的行第1与第2字段内容
awk -F":" 'NR
3,NR==7{print $1,$7}’ /etc/passwd //输出第3行到第7行中以冒号为分隔符的第1列与第7列的数据

输出数据时插入文本标签:
awk -F: ‘/^root/{print “Hi,” $1}’ /etc/passwd //输出以冒号为分隔符,以root开头的行第一列,且在前面插入“Hi,”
awk ‘{print $1"–"$3}’ 6.txt //输出第一列和第二列并加入普通字符 引号引用普通字符
awk -F":" ‘$7~"/bash"{print $1}’ /etc/passwd //输出冒号分隔且第7个字段中包含/bash的行的第1个字段
awk -F’:’’{print $1":"$2":"$3":"$4}’ /etc/passwd //保留原来的格式,输出以冒号为分隔,/etc/passwd文件的前4个字段
awk -F":" ‘{print $1,$3}’ /etc/passwd //输出以冒号为分隔符的第1列和第3列
awk ‘BEGIN{FS=":"} {print $1,KaTeX parse error: Expected 'EOF', got '}' at position 2: 3}̲' /etc/passwd …/{x++};END{printx}’ /etc/passwd //统计以/bin/bash为结尾的行数

awk执行顺序:首先执行BEGIN{}中的操作,然后从指定的文件中逐行读取数据,自动更新NF、NR、$0、$1等内建变量的值,去s执行’模式或条件{编辑指令}’;最后执行END{}操作

处理命令输出的结果:
date |awk ‘{print “Month:”$2"\nYear:"$6}’ //输出日期的第2列且在前面插入Month:,换行输出第6列并在前面插入Year

awk应用案例:
#!/bin/bash
#monitor available disk space
#截取以"/"为结尾的行,打印出第5个字段也就是跟分区使用百分比,截取掉“%”
SPACE='df | sed -ne ‘//$/p’ | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}̲' | sed 's/%//'…" | awk ‘{print $5}’ | awk -F% ‘{print $1}’
#截取出的数据与90进行相比,大于90给管理员发邮件报警
if [ $SPACE -ge 90 ] 现网磁盘使用率在80~85%
then
echo “Disk spaceis not enough” | mail -s "Disk Alarm"[email protected]
fi

shell脚本实战:
1、欢迎脚本
为root用户编写登录欢迎脚本,成功登陆后报告当前主机中的进程数、已登录用户数、登陆的用户名、根文件系统的磁盘使用率
"#!/bin/bash
"
#此脚本用于显示进程数,登录的用户数与用户名,根分区的磁盘使用率
echo “已开启进程数: ( ( (( (ps aux | wc -l)-1))” #注意要减1
echo “已登录用户数: ( w h o w c l ) &quot; e c h o &quot; (who | wc -l)&quot; echo &quot;已登录的用户账号: (who | awk ‘{print $1}’)”
echo “根分区磁盘使用率: ( d f h g r e p &quot; / (df -h | grep &quot;/ " | awk ‘{print $5}’)”

2、MAC记录与端口扫描脚本:
记录局域网中各主机的MAC地址,保存到/etc/ethers文件中,若文件已存在,应先转移进行备份;每行一条记录,第1列为Ip地址,第2列为对应的MAC地址。
检查有哪些主机开启了匿名FTP服务,扫描对象为/etc/ehters文件中的所有IP地址,扫描的端口为21.
#!/bin/bash
#定义网段地址、MAC列表文件
NADD=“192.168.80.”
FILE="/etc/ehters"
#发送ARP请求,并记录反馈结果
[ -f $FILE ] && /bin/cp -f $FILE $FILE.old
HADD=1 #定义起始扫描地址
while [ $HADD -lt 255 ]
do
arping -c 2 -w 1 N A D D {NADD} {HADD} &> /dev/null //当有两块网卡的时候,要指定一块网卡去ARP扫描,(加-I 网卡编号)
if [ $? -eq 0 ];then
arp -n | grep N A D D {NADD} {HADD} | awk ‘{print $1,$3}’ >> $FILE
fi
let HADD++
done

TARGET=$(awk ‘{print $1}’ /etc/ehters)
echo “以下主机已开放匿名FTP服务:”
for IP in T A R G E T d o w g e t f t p : / / TARGET do wget ftp:// IP/ $> /dev/null wget下载工具
if [ $? -eq 0 ]; then
echo $IP
rm -rf index.html #事先在ftp服务器上准备下载文件,测试后删除
fi
done

猜你喜欢

转载自blog.csdn.net/weixin_44381207/article/details/86527333