AWK工具

1 篇文章 0 订阅
awk工具介绍

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

工作原理:

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

awk内置变量

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

常用选项:

-f:忽略大小写
-b:忽略每行前面的空格
-M:按照月份进行排序
-n:按照数字进行排序
-r:反向排序
-u:等同于uniq,表示相同的数据仅显示一行
-t:指定分隔符,默认使用[tab]键分隔
-o<输出文件>:将排序后的结果转存至指定文件
-k:指定排序区域

Uniq工具

用于报告或者忽略文件中的重复行
一般与sort命令结合使用

语法:

Uniq [选项] 参数

常用选项

·-c:进行计数
·-d:仅显示重复行
·-u:仅显示出现一次的行
Uniq示例:
·删除testfile文件中的重复行
Uniq testfile
·删除testfile文件中的重复行,并在行首显示改行重复出现次数
Uniq -c testfile
·查找testfile文件中的重复行
Uniq -d testfile

案例:

awk -F: ‘{print $0,NF}’ /etc/passwd //输出以冒号为分隔的/etc/passwd文件中记录的字段段数
df -hT |awk ‘{print $1,$6}’ //用awk截取命令df -hT输出的结果,不带任何条件,进行格式化,打印第1列和第6列数据
awk ‘{print $0}’ /etc/passwd //输出所有内容
cat /etc/passwd grep “” /etc/passwd sed -n ‘p’ /etc/passwd

打印文本内容:

awk ‘NR1,NR3{print}’ bfile //输出第1至第3行内容
awk ‘NR1||NR3{print}’ bfile //输出第1行、第3行内容
awk ‘/^root/{print}’ /etc/passwd //输出以root开头的行
awk ‘/nologin$/{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")&&(NF==7){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"admin@example.com
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;已登录的用户账号: (whowcl)"echo"(who | awk ‘{print $1}’)”
echo “根分区磁盘使用率: ( d f − h ∣ g r e p &quot; / (df -h | grep &quot;/ (dfhgrep"/" | 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} NADD{HADD} &> /dev/null //当有两块网卡的时候,要指定一块网卡去ARP扫描,(加-I 网卡编号)
if [ $? -eq 0 ];then
arp -n | grep N A D D {NADD} 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:// TARGETdowgetftp://IP/ $> /dev/null wget下载工具
if [ $? -eq 0 ]; then
echo $IP
rm -rf index.html #事先在ftp服务器上准备下载文件,测试后删除
fi
done

3、开发系统监控脚本:

编写名为sysmon.sh的shell脚本
监控内容包括CPU使用率、内存使用率、根分区的磁盘使用率
百分比只需精确到各位,如:7%、12%、23%等
出现以下任意情况时告警:磁盘占用率超过90%、CPU使用率超过80%、内存使用率超过90%,告警邮件通过mail命令发送到指定邮箱
结合crond服务,每半小时执行一次监控脚本
#!/bin/bash
#提取性能监控指标(磁盘占用、CPU使用、内存使用)
DUG= ( d f − h ∣ g r e p &quot; / (df -h | grep &quot;/ (dfhgrep"/" | awk ‘{print $5}’ | awk -F% '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲') echo "当前根分区的…{DUG}%"
CUG=$(expr 100 - $(mpstat | tail -l | awk ‘{print $12}’ | awk -F. '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲')) echo "当前CPU…{CUG}%"
MUG=$(expr $(free | grep “Mem:” | awk ‘{print $3}’) * 100 / $(free | grep “Mem:” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲')) echo "当前内存使…{MUG}%"
#设置告警日志文件、告警邮箱
ALOG="/tmp/alert.txt"
AMAIL=“root@localhost”
#判断是否记录告警
if [ D U G − g t 80 ] t h e n e c h o &quot; 磁 盘 占 用 率 : DUG -gt 80 ] then echo &quot;磁盘占用率: DUGgt80]thenecho"DUG" >> $ALOG
fi
if [ C U G − g t 80 ] t h e n e c h o &quot; C P U 占 用 率 : CUG -gt 80 ] then echo &quot;CPU占用率: CUGgt80]thenecho"CPUCUG" >> $ALOG
fi
if [ M U G − g t 80 ] t h e n e c h o &quot; 内 存 占 用 率 : MUG -gt 80 ] then echo &quot;内存占用率: MUGgt80]thenecho"MUG" >> $ALOG
fi
if [ -f $ALOG ]
then
cat $ALOG | mail -s “Host Alert” $AMAIL
rm -rf $ALOG
fi
代码

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值