|
awk [选项] '[条件]{指令}' 文件 多条编辑指令,可用分号分隔
默认将空格、制表符等作为分隔符
(cut sort 也是是默认空格Tab)
grep sed 不能直接打印某列要结合字符串的截取工具使用
-F 可指定分隔符 识别多种单个的字符
awk -F [:/] '{print $1,$10}' /etc/passwd
awk常用内置变量:
$0 文本当前行的全部内容
$1 文本的第1列
$3 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列
awk -F: '{print NR,NF}' passwd.txt
awk -F: '{print NR,$NF}' /etc/passwd 永远打印最后一行!
awk -F: '{print NR,$NR}' /etc/passwd 第几行的时候就打印第几列!
可以打印常量:
awk -F: '{print $1,"的解释器:",$7}' /etc/passwd
打印常量必须要加双引号, 加逗号有空格,不加逗号无空格!
案例:
free |awk '/Mem/{print $NF}' 查看目前可用内存
ifconfig eth0 | awk '/RX p/{print $5}' 查看接收流量!
ifconfig eth0 | awk '/TX p/{print $5}' 查看发送流量!
df -h | awk '/\/$/{print $4}' #:\/$代表对/转义!!看跟分区可用空间。
df | awk '/\/$/{print $4}' 故意不加单位 在脚本中好当成数值比较!!!
df -h / | tail -1 | awk '{print $4}' 第一个/ 代表要看/(根)的情况 提取最后一行 给awk
在网页中查看脚本:远程监控服务器网卡 内存等等情况(相当于动态页面了)
rpm -qa | grep httpd
cp /root/share/test5-19-1.sh /var/www/cgi-bin/test5-19-1.html 必须放在脚本专用目录下
chmod +x /var/www/cgi-bin/test5-19-1.html 必须要加X不然访问不了要报404. 看到404就检查有没有X
systemctl stop firewalld
setenforce 0
ip/cgi-bin/test5-19-1.html 访问验证!!!
tips:
要想使访问时换行显示,要在/var/www/cgi-bin/test5-19-1.html 给这个文件加然后再重启服务!!
而不是改之前的脚本文件,思路一定要清晰啊小伙子。
tips:
如果cp -P test5-19-1.html /var/www/html/
http://192.168.4.20/test5-19-1.html
访问到的就不是脚本执行的结果了,就是html 代码执行的结果了。如下
#!/bin/bash echo "Content-type: text/html" echo "" ifconfig eth0 | awk '/netmask/{print "Ip:"$2}' echo "
" ifconfig eth0 | awk '/RX p/{print "接收流量:"$5}' echo "
" ifconfig eth0 | awk '/TX p/{print "发送流量:"$5}' echo "
" df | awk '/\/$/{print "根分区可用:"$4}' echo "
" free |awk '/Mem/{print "内存可用:"$NF}'
路径一定要是/var/www/cgi-bin/test5-19-1.html 才能访问到脚步执行结果。(在未修改配置文件前提下)
格式化输出:
awk处理的时机:
处理第一行之前做准备工作 只做预处理的时候,可以没有操作文件
awk 'BEGIN{print x+1}' #x可以不定义,直接用,默认值位0
中间进行逐行处理
处理完最后一行做总结
awk [选项] ' BEGIN{指令} {指令} END{指令}' 文件
BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
{ } 逐行处理,读取文件过程中执行,指令执行n次
END{ } 行后处理,读取文件结束后执行,指令执行1次
统计系统中使用bash作为登录Shell的用户总个数
awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd
awk '/bash$/{x++} END{print x}' /etc/passwd 与上条命令等效 x未定义默认为0
格式化输出/etc/passwd
awk -F: 'BEGIN{print "User\tUID\tHome"} \
{print $1 "\t" $3 "\t" $6} \ 使用“\t”显示Tab制表位
END{print "Total",NR,"lines."}' /etc/passwd
awk -F: 'BEGIN{print "用户名 家目录 UID"} {print $1,$6,$3 x++} END{print "总共"x"行"}' /etc/passwd
awk -F: 'BEGIN{print "用户名","家目录","UID"} {print $1,$6,$3} END{print "总共"NR"行"}' /etc/passwd
awk -F: 'BEGIN{print "用户名","家目录","UID"} {print $1,$6,$3 x++} END{print "总用户量:"x }' /etc/passwd
END{print "总共"NR"行"} END{print "总共"x"行"} 打印最后的时候:注意变量不要引号,常量要引号,这是个坑啊!!!
awk -F: 'BEGIN{print "用户名\t家目录\tUID"} {print $1"\t"$6"\t"$3 x++}END{print "总用户量:"x }' /etc/passwd | column -t
column -t 自动排版对齐!!!awk -F: '{print $1,$2,$3 }' /etc/passwd | column -t
awk处理条件:
正则
awk -F: '/bash$/{print}' /etc/passwd
awk -F: '$1~/(zhangsan|root)/{print $7}' /etc/passwd (支持扩展的正则)
~代表匹配:$1匹配后面的正则。并且是包含就算,模糊匹配 #第一列包含root或zhangsan的打印第7列。
[root@D share]# awk -F: '$1~/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
roota:x:1004:1024::/home/roota:/bin/bash 模糊匹配
awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd !~不匹配
使用数值/字符串比较设置条件
比较符号:== != > >= < |
|
|