基本正则表达式
扩展正则表达式
grep 使用
查找包含 ‘root’ 的行显示行号
grep -i 'root' pwd.txt -n
查找包含 ‘root’ 的行统计行数
grep -i 'root' pwd.txt -c
查找空行显示行数
grep '^$' test.txt -n
查找非空行显示行数
grep '^$' test.txt -n -v
查找排除 #开头 的非空行
grep '^#' test.txt -v | grep '^$' -v
查找 .结尾 的行
grep '\.$' test.tx
匹配 包含5 字符,只有两位数
grep '.5' test.txt
匹配到 f 的字符,不管前面有什么
grep '.*f' test.txt
按照条件匹配字符
grep '[a-z0-5]' test.txt
按照条件排除字符
grep '[^a-z]' test.txt
sed 使用
打印文件的2、3行内容
sed '2,3p' pwd.txt -n
打印包含“lp”的行
sed '/lp/p' pwd.txt -n
删除包含“daemon”的行并写入文件中
sed '/daemon/d' pwd.txt -i
删除1~5行并写入文件中
sed '1,5d' pwd.txt -i
删除10到最后一行并写入文件中
sed '10,$d' pwd.txt -i
将 dbus 替换成 abcd 并写入文件
sed 's/dbus/abcd/g' pwd.txt -i
将 abcd替换成 1234,nologin 替换成 123456 并写入文件
sed -e 's/abcd/1234/g' -e 's/nologin/123456/g' pwd.txt -i
在指定行后面(2a 第二行后)插入内容并写入文件
sed '2a 12345' pwd.txt -i
在指定行前面(10i 第十行前)插入内容并写入文件
sed '10i 12345' pwd.txt -i
换行符\n,同时插入asdfghj、nasdfghj多行内容
sed '2a asdfghj\nasdfghj' pwd.txt -i
在每行后插入指定内容,a 不加数字
sed 'a ---------' pwd.txt -i
提取 ip 地址
# 找指定行,删除开头和结尾的内容
ip addr | sed '/101/p' -n | sed 's/^.*brd //g' | sed 's/ scope.*$//g'
# 使用 -e 参数多次匹配
ip address show ens33 | sed -e '3s/^.*inet //' -e '3s/ brd.*$//p' -n
awk 使用
打印指定列
# 列出所有列
awk '{print $0}' docker.txt
awk '{print}' docker.txt
# 列出第一列
awk '{print $1}' docker.txt
# 列出倒数第二列
awk '{print $(NF-1)}' docker.txt
# 列出最后一列
awk '{print $(NF)}' docker.txt
打印多列
awk '{print $1,$2,$3}' docker.txt
打印自定义列
awk '{print "第一列:"$1,"第二列:"$2,"第三列:"$3}' docker.txt
打印指定行或多行
# 打印第五行
awk 'NR==5{print $0}' docker.txt
# 打印五~七行
awk 'NR==5,NR==7{print $0}' docker.txt
awk 'NR==5,NR==7' docker.txt
打印行号
# 打印所有行行号
awk '{print NR,$0}' docker.txt
# 打印5~7行行号
awk 'NR==5,NR==7{print NR,$0}' docker.txt
打印第一行,倒数第二行,倒数第三行
awk '{print $1,$(NF-1),$(NF-2)}' docker.txt
提取 ip 地址
ifconfig ens33 | awk 'NR==2{print $2}'
指定输入分割符
awk -F ":" '{print $1,$NF}' pwd.txt
awk -v FS=":" '{print $1,$NF}' pwd.txt
指定输出分割符
awk -v FS=":" -v OFS=">>>>" '{print $1,$NF}' pwd.txt
awk -v FS=":" '{print $1,">>>>>",$NF}' pwd.txt
awk -v FS=":" -v OFS="\t" '{print $1,$NF}' pwd.txt
内置变量使用
# NR 打印行数,NF 打印字段数
awk -v FS=":" '{print NR,NF,$1}' pwd.txt
分开打印多个文件的行号
awk -v FS=":" '{print FNR,$1}' pwd.txt gr.txt
指定换行符
awk -v RS=":" '{print NR,$0}' pwd.txt
指定每行结尾输出内容
awk -v ORS="########" '{print NR,$0}' pwd.txt
FILENAME 变量使用
awk '{print FILENAME,$0}' pwd.txt
格式化输出打印
awk '{printf $0}' test.txt
处理文件之前执行动作
# 先打印"自我介绍开始:",在处理文本
awk 'BEGIN{print "自我介绍开始:"} {printf $0}' test.txt
处理文件之后执行动作
# 先处理文本,在打印"自我介绍完毕"
awk '{printf $0} END{print "自我介绍完毕"}' test.txt
连在一起的执行效果
awk 'BEGIN{print "自我介绍开始:"} {print $0} END{print "自我介绍完毕。"}' test.txt
格式化输出表格
awk -F ":" 'BEGIN{printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %s\n","用户名","密码","UID","GID","用户注释","用户家目录","用户使用的注释器"} {printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %s\n",$1,$2,$3,$4,$5,$6,$7}' pwd.txt
效果:
正则匹配
# 打印以 /sbin/nologin 结尾的内容
awk '/\/sbin\/nologin$/{print NR,$0}' /tmp/pwd.txt
# 区间匹配以指定字符开头的内容
awk '/^lp/,/^ftp/{print NR,$0}' pwd.txt
实战演练
awk 统计 nginx 的访问 ip
awk '{print $1}' access.log |sort -n |uniq |wc -l
# 注释:
sort -n 排序
uniq 去重
wc -l 统计行数
awk 列出 nginx 访问频率最高的 10 位访客
awk '{print $1}' log.txt |sort -n |uniq -c |sort -nr |head -10
# 注释:
sort -n 排序
uniq -c 去重并显示出现次数
sort -nr 根据数值大小反向排序
head -10 显示前10行