正则表达三剑客(grep+sed+awk)

什么是正则表达式

正则表达式是一种描述一组字符串的模式为处理大量文本、字符串而定义的一套规则和方法,以行为单位进行处理。正则表达式分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。在linux中使用正则表达式较多的有三个工具,分别为grep,sed和awk,这三个工具被称为linux文本处理的三剑客。

  • grep 文本过滤命令
  • sed 行编辑器
  • awk 报告生成器

grep文本搜索工具

grep(Global search regular expression and print out the line)
全面搜索研究正则表达式并显示出来 grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查,默认输出匹配行
由正则表达式或者字符及基本文本字符所编写的过滤条件 egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的扩展,支持更多的元字符,fgrep就是fixed

grep或fast
grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能

扩展使用egrep=grep -E 支持更多的元字符
在这里插入图片描述
在这里插入图片描述

位置确定

^关键字:行首锚定
关键字$:行尾锚定
^$:匹配空白行
\<关键字:词首锚定
关键字 \>: 词尾锚定

grep 的格式

grep 匹配条件 处理的文件  

例如

  grep root passwd 过滤出含有root的行
  grep ^root passwd  过滤出root的首行
  grep root$ passwd 过滤出root结尾的行
  grep -E "root|ROOT" passwd 过滤出含有root/ROOT的行
  grep -Ei root passwd  不区分大小写 过滤出含有root的行

在这里插入图片描述

grep ROOT passwd -n2 ##过滤出含有ROOT的行及其上下各2行且标明行号
grep ROOT passwd -1 ##过滤出含有ROOT的行及其上下各一行
grep ROOT passwd -A1 ##过滤出含有ROOT的行及其下一行
grep ROOT passwd -1 ##过滤出含有ROOT的行及其上一行

在这里插入图片描述
在这里插入图片描述

grep -i root passwd -v(反向过滤)
cat -b passwd  查看文件并且显示列数

在这里插入图片描述
在这里插入图片描述

grep 中字符的匹配次数设定

grep xy westos
grep x.y westos ##点匹配到任意字符
grep x..y westos
grep x...y westos

在这里插入图片描述
在这里插入图片描述

x*y ##y字符前x字符出现 [0- 任意次 ] 高亮显示满足条件的xy
x?y ##x字符出现 [0-1 次 ]
x+y ##x字符出现 [1- 任意次 ]
x{n}y ##x字符出现 [n 次 ]
x{m,n}y ##x字符出现 [ 最少出现 m 次,最多出现 n 次 ]
x{0,n}y ##x字符出现 [0-n 次 ]
x{m,}y ##x字符出现 [ 至少 m 次 ]
(xy){n}xy ##xy关键字出现 [n 次 ]
x.*y  ##关键字之间匹配任意字符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

屏蔽贪婪模式

grep -E "\<x{1}y" westos
grep -E "x{1}y\>" westos
grep -E "\<x{1}y\>" westos

在这里插入图片描述
sed 行编辑器

stream editor 用来操作纯 ASCII 码的文本处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间”(pattern space) 可以指定仅仅处理哪些行, sed 符合模式条件的处理
不符合条件的不予处理,处理完成之后把缓冲区的内容送往屏幕 接着处理下一行 , 这样不断重复 , 直到文件末尾Sed 命令格式

调用 sed 命令有两种形式:

sed [options] 'command' file(s) 
sed [options] -f scriptname file(s)

**sed 对字符的处理 **

p显示
d删除
a添加
c替换
w写入
i插入

p 模式操作 (加-n屏蔽掉模式空间)

sed -n ‘/UUID$/p’ fstab ##显示文件fstab中以UUID开头的行
sed -n ‘/^UUID/p’ fstab ##显示文件fstab中以UUID结尾的行
sed -n ‘2,6p’ fstab ##显示文件fstab的2到6行
sed -n ‘2,6!p’ fstab ##不显示文件fstab的2到6行
sed -n ‘2p’ fstab ##显示文件fstab的2行
 sed -n ‘2p;6p’ fstab ##显示文件fstab的第2行和第6行

在这里插入图片描述

在这里插入图片描述
d 模式操作(不加-n不屏蔽掉模式空间)

sed '/^UUID/d' /etc/fstab ##去掉文件fstab中以UUID开头的行
sed '/^$/d'/etc/fstab   ##去掉文件fstab中以UUID开头的行
sed '1,4d'/etc/fstab   ##去掉文件fstab中的1-4行
 sed '1d;4d'/etc/fstab   ##去掉文件fstab中的第1行和第4行
sed '/^UUID/!d' /etc/fstab ##显示文件fstab中以UUID开头的行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
a/i/c 模式操作

sed '/^UUID/a \hello  /etc/fstab ##给文件fstab中以UUID开头的行后添加hello
sed '/^UUID/a \hello \nwestos /etc/fstab ##给文件fstab中以UUID开头的行后添加hello 换行后再添加westos
sed '/^UUID/i \hello \nwestos /etc/fstab ##给文件fstab中以UUID开头的行前添加hello 换行后再添加westos
sed ‘/^#/c \hello  /etc/fstab’ ##给文件fstab中以#开头的行更改为hello

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
w 模式操作

sed '/^UUID/w haha' /etc/fstab ##将文件fstab中以UUID开头的行写入到文件haha中 不屏蔽缓存空间
sed -n'/^UUID/w /tmp/fstab.txt' /etc/fstab ##将文件fstab中以UUID开头的行写入到文件haha中 屏蔽缓存空间
sed '/^#/='/etc/fstab ##将文件fstab中以#开头的行前加入行号
sed '6r haha' /etc/fstab ##将文件haha里的内容写到文件fstab的第6行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sed 的其他用法

sed -n -e '/^UUID/p' -e '/^UUID/=' fstab ## -e相当与;
sed 's/brown/green/; s/dog/cat/' data ##分隔符的使用规则
sed -f rulesfile file ##对文件file执行脚本rulesfile
sed 's/#/@/' /etc/fstab ##文件中的#替换为@
sed '1,5s/#/@/' /etc/fstab ##文件1-5行中的#替换为@
sed 's/^\//#/'/etc/fstab  ##将文件fstab中的所有/替换为# /之前要使用转义字符\
sed 's/\//#/g/'/etc/fstab ##s///g=s/// 可以省略g
sed 's@^/@#@g'/etc/fstab  ##@与/分隔符功能相同
sed 'G' data ##文件每行前加空行  
sed '$!G' data ##文件每行前加空行 
sed '=' data | sed 'N; s/\n/ /' 

编辑脚本
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
如何给文件标上行号

在这里插入图片描述

在这里插入图片描述
如何保存文件更改
-i 文件名

在这里插入图片描述

awk 报告生成器

awk 处理机制:awk
会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作

在命令格式上分别体现如下

BEGIN{}读入第一行文本之前执行,一般用来初始化操作
‘{ xxxx }’逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令快
END{}处理完最后一行文本之后执行,一般用来输出处理结果
-F指定分隔符

awk 基本用法

awk '{print FILENAME}' passwd
awk '{print 第"NR"行,有"NF"列}'
awk 'BEGIN{print NAME}'  ##BEGIN执行命令之前执行的
awk 'END{print WESTOS}' ##END执行完所有命令之后执行的
awk -F : 'BEGIN{print NAME}{print $1}END{WESTOS}' ##-F指定分隔符
awk '/bash$/' passwd ##文件中以bash结尾的行
awk -F : '/bash$/{print $1}' ##打印文件中以bash结尾的行 以:为分隔符的第一列
awk -F : '/^[a-d]/{print $1,$6}' passwd.txt
awk -F : '/^a|nologin$/{print $1,$7}' passwd.txt 
awk -F : '$6~/bin/{print }' ##打印出以:为分隔符的第6列是bin的行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
小练习
统计出家目录是/home并且可以登陆的用户个数

在这里插入图片描述
在这里插入图片描述
尝试抓取自己的ip
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值