SHELL脚本编程:awk高级应用和综合案例(SHELL----DAY32)

grep 模糊搜索
vim  增删改查,交互式
sed     增删改查,非交互式
awk  精确搜索

1, 前置命令 | awk 选项  (条件)指令
2, awk 选项  (条件)指令  被处理的文件

选项 -F  指令 print
awk内置变量   $1  $2  $3 ... $0   NR NF  "常量"

awk条件
1, 使用正则
    / /    ~   !~
2, 使用数字和字符串
    ==   !=    >  <   >=  <=
3, 逻辑组合
    &&     ||
4,运算
    +  -  *  /   %   a++   a+=x
-------------------------------------------------------
if(条件){指令}
if(条件){指令1}else{指令2}
if(条件1){指令1}else if(条件2){指令2}else{指令n}

awk -F: '{if($3==0){print}}' user   如果第3列是0,则输出该行

awk -F: '{if($3<=2){print "abc"}else{print "xyz"}}' user  如果第3列小于等于2,则输出abc,否则输出xyz 

统计用户uid 小于10的和大于1000的数量
awk -F: 'BEGIN{x=0;y=0}{if($3<10){x++}else if($3>1000){y++}}END{print x,y}' /etc/passwd

统计用户uid 小于10的和大于1000的数量,以及其他的数量
awk -F: 'BEGIN{x=0;y=0;z=0}{if($3<10){x++}else if($3>1000){y++}else{z++}}END{print x,y,z}' /etc/passwd
--------------------------------------------------------------------

分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数:


awk -F: '{if($7=="/bin/bash"){x++}else{y++}}END{print x,y}' /etc/passwd

---------------------------------------------------------------------

数组 能够存储多个不同值的特殊变量

数组名称[下标]=值

a[1]=100
a[2]=200

awk 'BEGIN{a[1]=100;a[2]=200;print a[1],a[2]}'  定义数组a,下标分别是1与2,然后输出该数组对应下标的值

awk 'BEGIN{a[1]=100;a[2]=200;print a[2],a[1]}'

awk 'BEGIN{a[1]=100;a[1]++;print a[1]}'  对定义好的数组做运算
-------------------
遍历数组
for(变量 in 数组名){print 变量, 数组名[变量]}

awk 'BEGIN{a[1]=100;a[2]=200;for(i in a){print i,a[i]}}

abc      a[abc]=1  ip[192.168.0.1]=1
abc        a[abc]=2  ip[192.168.0.1]=2
xyz        a[xyz]=1  ip[192.168.0.2]=1
opq        a[opq]=1  ip[192.168.0.3]=1
xyz        a[xyz]=2  ip[192.168.0.2]=2
abc        a[abc]=3  ip[192.168.0.1]=3

awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc  

{a[$1]++} 逐行任务,相当于收集数据,然后在END任务中用for循环查看数组的所有内容

awk '{ip[$2]++}END{for(i in ip){print i,ip[i] }}' abc
------------------------------------------------------

yum -y install httpd
curl http://server0            以字符形式查看网站
/var/log/httpd/access_log   httpd服务的访问日志

awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log |sort -nr    查看网站的被访问次数,与对应的ip地址, 然后降序排列

------------------------------------------------------------

uptime |awk '{print "当前主机cpu平均负载是 "$NF}'
ifconfig eth0 | awk -F[\(\)] '/RX p/{print "eth0 网卡的接收流量是 "$2}'
ifconfig eth0 | awk -F[\(\)] '/TX p/{print "eth0 网卡的发送流量是 "$2}'
free -h |awk '/Mem/{print "当前主机内存剩余空间是 "$4}'
df -h | awk '/vda1/{print "当前主机根分区剩余空间是 "$4}'
awk 'END{print "当前主 机用户数量总共是 "NR"个" }' /etc/passwd
x=`who | wc -l`
echo "当前主机登录账户 的数量是 $x 个"
p=`ps aux |wc -l`
echo "当前主机开启的进程数量是 $p 个"
n=`rpm -aq | wc -l`
echo "当前主机安装的软件包数量是 $n 个"

-------------------------------------------------------
uptime |awk '{print "当前主机cpu平均负载是 "$NF}'
ifconfig eth0 | awk -F[\(\)] '/RX p/{print "eth0 网卡的接收流量是 "$2}'
ifconfig eth0 | awk -F[\(\)] '/TX p/{print "eth0 网卡的发送流量是 "$2}'
free -h |awk '/Mem/{print "当前主机内存剩余空间是 "$4}'
df -h | awk '/vda1/{print "当前主机根分区剩余空间是 "$4}'
awk 'END{print "当前主 机用户数量总共是 "NR"个" }' /etc/passwd
x=`who | wc -l`
echo "当前主机登录账户 的数量是 $x 个"
p=`ps aux |wc -l`
echo "当前主机开启的进程数量是 $p 个"
n=`rpm -aq | wc -l`
echo "当前主机安装的软件包数量是 $n 个"
-----------------------------------------------------------------------


 

发布了55 篇原创文章 · 获赞 0 · 访问量 406

猜你喜欢

转载自blog.csdn.net/weixin_45533230/article/details/104284313