SHELL脚本编程:sed高级应用和awk基本用法(SHELL----DAY31)

回顾
正则表达式
基本正则 ^ $ [] [^] . * {n,m} {n} {n,} ()
扩展正则 + ? {n,m} ( ) | \b

sed
前置命令 | sed 选项 (定址符)指令
sed 选项 (定址符)指令 被处理的文件

选项 -n -r -i
指令 p d s

a 行下追加
i 行上添加
c 替换行

sed ‘1a XXXX’ user 第1行下追加字母
sed ‘1,3a XXXX’ user 第1~3行下追加
sed ‘1,+1a XXXX’ user 第1行以及后面1行下追加
sed ‘/root/a XXXX’ user 有root的行下追加
sed ‘1i XXXX’ user 第1行上添加
sed ‘1a XXXX’ user 第1行下追加
sed ‘2i XXXX’ user 效果同上
sed ‘/^bin/i XXXX’ user 以bin开头的行上添加
sed ‘c XXXX’ user 所有行替换
sed ‘1c XXXX’ user 第1行替换
sed ‘1,2c XXXX’ user 第1~2行替换
sed ‘/root/c XXXX’ user 有root的行替换

按照 用户名 --> 密码 的格式,显示使用bash做解释器的用户信息

#!/bin/bash
u=sed -n '/bash$/s/:.*//p' /etc/passwd 找到使用bash的用户
for i in u 交 给 f o r 循 环 处 理 d o w = ‘ g r e p " u 交给for循环处理 do w=`grep " ufordow=grep"i:" /etc/shadow` 找到每个用户对应的shadow记录
w1=KaTeX parse error: Expected '}', got '#' at position 3: {w#̲*:} 掐头 w2={w1%%😗} 去尾 得到纯粹的密码信息
echo “$i --> $w2”
done


vim
grep
sed
awk 逐行处理
使用方式:
1, 前置命令 | awk 选项 (条件)指令
2,awk 选项 (条件)指令 被处理文件

选项 -F 定义分隔符
指令 print 输出

awk ‘{print}’ test 输出所有行所有列
awk ‘{print $1}’ test 输出所有行第1列
awk ‘{print $2}’ test 输出所有行第2列
awk ‘{print $1,$2}’ test 输出所有行第1列 第2列
awk ‘{print $3,$1}’ test 输出所有行第3列 第1列
awk ‘{print $0}’ test 输出所有行所有列
awk ‘{print $3,$0}’ test 输出所有行第3列 所有列
awk ‘{print $4}’ test 文件中没有第4列,无输出
awk -F: ‘{print $1}’ user 定义:作为分隔符,然后输出第1列
awk -F[😕] ‘{print $1}’ user 定义:或者/作为分隔符

awk内置变量 $0 $1 $2 … NR行 NF列

ifconfig eth0 |awk ‘/RX p/{print $4,$5}’ 找到网卡信息中的接收流量

awk -F: ‘{print $1"的解释器是"$7}’ user awk可以加双引号输出常量
awk -F: ‘{print $1"的家目录是"$6}’ user

ifconfig eth0 | awk ‘/RX p/{print “eth0网卡接收的流量是”$5"字节"}’
ifconfig eth0 | awk ‘/TX p/{print “eth0网卡发送的流量是”$5"字节"}’

如何输出"根分区剩余容量是XXX"
df -h | awk ‘//$/{print “根分区剩余容量是”$4}’

找到对本机访问失败(密码输错)的ip地址
awk ‘/Failed/{print $11}’ /var/log/secure


逐行任务,执行n次
awk [选项] ‘[条件]{指令}’ 文件

BEGIN,END 额外的任务,执行1次
awk [选项] ’ BEGIN{指令} {指令} END{指令}’ 文件

tab 制表符 \t 在输出过程中起到一定的排版效果

按一定格式输出用户信息:
awk -F: ‘BEGIN{print “USER\tUid\tHome”}{print$1"\t"$3"\t"$6}END{print “总计"NR"行”}’ user


awk的条件

1,使用正则作为条件:
awk ‘/root/{print}’ user 输出有root的行,print可以省略
awk ‘/root|bin/{print}’ user 输出有root或者bin的行
awk ‘/root|bin/{print}’ user 输出以root开头或bin开头的行
awk ‘/root|bin/’ user 效果同上
awk -F: ‘$1~/root/{print}’ user 输出第1列包含root的行
awk -F: ‘$1~/root/’ user 效果同上
awk -F: ‘$6~/root/’ user 输出第6列包含root的行
awk -F: ‘$1!~/root/’ user 输出第1列不包含root的行

2,数字或者字符串作为条件
== != > < >= <=

awk ‘NR2’ user 输出第2行
awk -F: '$1
"root"’ user 输出第1列是root的行
awk -F: ‘$1~/root/’ user 输出第1列包含root的行
awk -F: ‘$1!=“root”’ user 输出第1列不是root的行
awk ‘NR>2’ user 输出大于2的行
awk ‘NR>=2’ user 输出大于等于2的行
awk ‘NR<2’ user …
awk ‘NR<=2’ user …
awk -F: ‘$3<=10’ /etc/passwd 输出第3列小于等于10的行


3, 逻辑组合
&& 并且 || 或者
awk ‘NR>=1&&NR<=3’ user 输出1~3行
awk -F: ‘$3>=10&&$3<=20’ /etc/passwd 输出第3列是10~20的行
awk -F: ‘$3<=5||$3>=1000’ /etc/passwd 输出第3列小于等于5或者大于等于1000的行
awk -F: ‘$3<10||$3>1000’ /etc/passwd 输出第3列小于10或者大于1000的行
awk -F: ‘$3<10&&$3>1000’ /etc/passwd 不存在的数字,逻辑错误

输出/etc/hosts文件内以127或172开头的记录
awk -F. ‘$1127||$1172’ /etc/hosts

4,运算

列出100以内整数中7的倍数或是含7的数
seq 100 | awk ‘$1%7==0||$1~/7/’

awk ‘BEGIN{print 1+1}’ 加
awk ‘BEGIN{print 1-1}’ 减
awk ‘BEGIN{print 2*2}’ 乘
awk ‘BEGIN{print 2/2}’ 除
awk ‘BEGIN{print 2%2}’ 取余数
awk ‘BEGIN{a=10;print a}’ 定义变量,然后输出
awk ‘BEGIN{a=10print a}’ 报语法错误
awk ‘BEGIN{a=10;a++;print a}’ 定义变量,运算,再输出
awk ‘BEGIN{a=10;a++;print a+=10}’ 定义变量,运算,输出时再运算

使用awk按 用户名 --> 密码 的格式输出使用bash的用户
#!/bin/bash
u=awk -F: '/bash$/{print $1}' /etc/passwd
for i in $u
do
grep $i /etc/shadow | awk -F: ‘{print $1"–>"$2}’
done

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值