回顾
正则表达式
基本正则 ^ $ [] [^] . * {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 "
u交给for循环处理dow=‘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