sell 5
回顾
正则表达式
基本正则 ^ $ [abc] [^] . * \{n,m\} \{n\} \{n,\} \(\)
扩展正则 + ? {n,m} a|b|c () \b
sed 非交互式编辑文本
前置命令 | sed 选项 (定址符)指令
sed 选项 (定址符)指令 被处理的文档
选项 : -n -r -i
指令: p d s
==============================
a 行下添加 i 行上添加 c 替换整行
找到使用 bash 的用户, 按照 用户名 --> 密码的方式显示
- #!/bin/bash
- n=`sed -n '/bash$/s/:.*//p' /etc/passwd`
for i in $n 将找到的使用 bash 的用户名交给 for 循环
do
p=`grep $i: /etc/shadow` 将名字与 shadow 对比
p1=${p#*:} 找到对应的行, 掐头
p2=${p1%%:*} 去尾, 得到纯粹的密码
echo "$i --> $p2" 输出最后结果
done
awk 精确搜索文档
用法:
awk 选项 (条件)指令 被处理的文档
前置指令 | awk 选项 (条件)指令
awk '{print}' test 输出所有
awk '{print $2}' test 输出每行第 2 列
awk '/hello/{print $2}' test 找到有 hello 的行, 输出他的第 2 列
awk 的内置变量 $1 $2 $3..... $0 所有列 NR 行号 NF 列号
awk 默认分隔符为空格, 可以使用 - F 修改分隔符
awk -F: '{print $1}' user 定义分隔符为冒号, 输出第一列
awk -F[:/] '{print $10}' user 定义分隔符为冒号或者斜线, 输出第 10 列
awk -F: '{print $1" 的解释器是 "$7}' user 输出特定列, 常量 + 变量
ifconfig eth0 | awk '/RX p/{print" 本机 eth0 的接收流量是 "$5" 字节 "}' 获取网卡接收流量
ifconfig eth0 | awk '/TX p/{print" 本机 eth0 的发送流量是 "$5" 字节 "}' 获取网卡发送流量
df -h | awk '/vda1/{print" 当前主机跟分区剩余空间是 "$4}' 获取根分区剩余空间
awk '/Failed/{print"*** 者的 ip 是 "$11}' /var/log/secure
awk 的工作时机
BEGIN 任务 执行 1 次
逐行任务 执行 N 次
END 任务 执行 1 次
BEGIN{ }{ }END{ }
awk 'BEGIN{指令} {指令} END{指令}' 文件
awk 'BEGIN{print"ABCD"}{print}END{print NR}' user
tab 键 \t 制表符
- awk -F: 'BEGIN{print"User\tUid\tHome"}{print $1"\t"$3"\t"$6 }END{print" 总计 "NR" 行 "}' user
- ========================================
awk 处理条件
1, 使用正则作为条件
awk -F: '/^root/{print $1}' user 找以 root 开头的行, 输出第 1 列
awk -F: '/^root|^bin/{print $1}' user 找以 root 或者 bin 开头的行, 输出第 1 列
awk -F: '/^(root|bin)/{print $1}' user 同上
awk -F: '$1~/root/{print $1}' user 找第一列包含 root 的行, 并且输出第 1 列
awk -F: '$1!~/root/{print $1}' user 第一列不包含 root
2, 数字与字符串做条件 == !=>>= <<=
awk -F: 'NR==1{print}' user 输出第 1 行
awk -F: 'NR>2{print}' user 输出行号大于 2 的行
awk -F: 'NR>=2{print}' user 输出行号大于等于 2 的行
awk -F: '$1=="root"{print}' /etc/passwd 输出第 1 列是 root 的行
awk -F: '$1~/root/{print}' /etc/passwd 输出第 1 列包含 root 的行
awk -F: '$1~/oot/{print}' /etc/passwd 输出第 1 列包含 oot 的行
awk -F: '$3>1000{print}' /etc/passwd 输出第三列大于 1000 的行
3, 使用逻辑符号 && 并且 || 或者
awk 'NR>=2 && NR<=4{print}' user 输出 2~4 行
awk 'NR<=1 || NR>4{print}' user 输出第 1 行, 或者大于 4 的行
awk -F: '$3>=1000 && $3<=1005' /etc/passwd 当任务只是 print 时可以省略{print}
输出所有普通用户的家目录与解释器
例如: 张三的家目录是 XXX , 解释器是 XXX
awk -F: '$3>=1000 && $3<=1100{print $1" 的家目录是 "$6", 解释器是 "$7 }' /etc/passwd
4, 运算
awk 'BEGIN{x++;print x}' 把 x+1 然后输出 x 的值
awk 'BEGIN{x=8;print x+=2}' 定义变量 x=8, 然后 + 2 再输出结果
awk 'BEGIN{x=8;x--;print x}' x 定义好, 然后减 1, 输出
- awk 'BEGIN{print 2+3}'
- awk 'BEGIN{print 2*3}'
- awk 'BEGIN{print 2*3}'
- shell 6
回顾
awk 精确搜索文档
-F 定义分隔符 print
$1 $2 $3 .... $0 NR NF ""
正则表达式 // ~ !~
字符串与数字 == !=>>= <<=
逻辑符号 && ||
运算 x++
=============================
在 awk 中使用 if 判断
单分支:
awk '{if(/bash$/){x++}}END{print x}' user 如果找到以 bash 结尾的行, 就把 x+1, 最后输出 x 的值
awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd 如果第 3 列 (UID) 大于等于 1000, 则把 x+1,, 最后输出 x 的值
双分支:
awk -F: '{if($3>=1000){x++}else{y++}}END{print x,y}' /etc/passwd 如果第 3 列 (UID) 大于等于 1000, 则把 x+1, 否则把 y+1, 最后输出 x 与 y 的值
awk 数组, 数组可以理解为能保存多个值的特殊变量
数组名[下标]= 元素值
- awk 'BEGIN{a[1]=100;a[2]=200;print a[2],a[1]}'
- awk 'BEGIN{a["x"]=100;a["y"]=200;print a["y"],a["x"]}'
- awk 'BEGIN{a["x"]="abc";a["y"]="xyz";print a["y"],a["x"]}'
在 awk 中使用数组 + for 循环实现遍历数组
- awk 'BEGIN{a[1]=100;a[2]=200;a[3]=300;for(i in a){print i,a[i]}}'
- awk '{a[$1]++}END{for(i in a){print a[i],i}}' abc
- a[abc]=3
- a[xyz]=2
- a[zxc]=1
- a[192.168.0.1]=3
- a[172.10.10.10]=2
- a[100.100.100.100]=1
使用 awk 统计网站访问量:
/var/log/httpd/access_log 是 httpd 服务的访问日志
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log 最终显示访问的次数与对应的 ip 地址
ab -c 1 -n 10000 http://172.25.0.11/ 访问 10000 次
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -nr 统计完之后再排序, 访问量最大的在第一行
- #!/bin/bash
- n=`uptime |sed -n 's/.*://p'`
echo 主机平均负载是 $n
- ifconfig eth0 | awk '/RX p/{print" 主机的 eth0 网卡接收流量是 "$5" 字节 "}'
- ifconfig eth0 | awk '/TX p/{print" 主机的 eth0 网卡发送流量是 "$5" 字节 "}'
- free -h |awk '/^Mem/{print" 主机剩余内存容量是 "$4}'
- df -h | awk '/\/$/{print" 根分区剩余容量是 "$4}'
- awk 'END{print" 当前主机用户总数是 "NR}' /etc/passwd
- w=`who | wc -l`
echo 当前登录的账户数量是 $w 个
p=`ps aux | wc -l`
echo 当前主机开启的进程数量是 $p 个
r=`rpm -qa | wc -l`
echo 当前主机安装的软件包数量是 $r 个
来源: http://www.bubuko.com/infodetail-3285453.html