Day05 egrep&正则表达式&sed

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day05 egrep&正则表达式&sed相关的知识,希望对你有一定的参考价值。

一、egrep

1.1 定义

以行为单位,逐行进行处理。默认只输出与表达式相匹配的文本行

1.2 基本格式

egrep [选项] ‘正则表达式‘ 文件...
前置命令 | egrep [选项] ‘正则表达式‘

1.3 常用命令选项

1.3.1 egrep -i

忽略大小写

1.3.2 egrep -v

条件取反

1.3.3 egrep -c

统计匹配的行数
egrep -c "." /etc/passwd#统计passwd有多少行

1.3.4 egrep -q

静默,不输出任何信息。可通过$?看结果是否正确

1.3.5 egrep -n

显示出匹配结果所在的行号

1.3.6 egrep -o

只输出匹配的内容,不是一行

1.3.7 egrep -A n key

输出匹配key关键字及关键字下面的n行

1.3.8 egrep -B n key

输出匹配key关键字及关键字上面的n行

1.3.9 egrep -C n key

输出匹配key关键字及关键字上下的n行

1.4 正则表达式

正则表达式使用一串特殊符号来描述有共同属性的的数据,一共有11个符号。
它相当于计算机世界里面的英语,即计算机里面的通用语言!

1.4.1 基本正则元字符

优点:兼容性强
缺点:书写麻烦
技术分享图片

1.4.2 扩展正则元字符

优化基本正则、添加新的元字符。
优点:书写简单
缺点:兼容性差,grep就不支持
技术分享图片

1.4.3 转义元字符

技术分享图片

二、sed

2.1 概述

Stream EDitor,流式编辑器。
非交互,基于模式匹配过滤及修改文本。一行一行读取,逐行处理,并将结果输出到屏幕。可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作。

2.2 基本格式

sed [选项] ‘编辑指令‘ 文件
前置命令 | sed [选项] ‘编辑指令‘
选项:n,r,i
编辑指令:[定址符]处理动作
定址符:[条件1[,条件2]]
条件:行号或者/正则/
处理动作:p,d,s,a,i,c,r,w,H,h,G,g
举例:
sed -n ‘/^root/p‘ /etc/passwd #打印passwd文件中以root开头行

2.3 选项

2.3.1 sed -n

屏蔽默认输出

2.3.2 sed -r

支持扩展正则表达式,若与其他选项共用,必须作为首个选项

2.3.3 sed -i

对源文件进行实际操作

2.3.4 sed -e ‘‘ -e ‘‘ -e ‘‘ a.txt

同时对a.txt做三个操作

2.4 处理动作

2.4.1 p

打印
sed ‘3,5p‘ a.txt
打印a.txt的第3行,第5行

2.4.2 d

删除

2.4.3 s

替换关键字

2.4.4 a

在行号下面插入新的一行,如果行号为2,那么插入的行就是第3行
还可以插入多行,行之间用"\"连接
sed -i ‘1askip-networking‘ /etc/my.cnf#在第一行后面插入新行,内容为skip-networking

2.4.5 i

替换行号所在的一行,原来的行变成下一行,如果行号为2,那么插入的行就变成了第2行,原来的行变成了第3行

2.4.6 c

整行替换
sec ‘1c string‘ #把第一行替换为string

2.4.7 r

sed 3r c.txt
读取c.txt文件,把内容插入第3行之后

2.4.8 w

sed 1,3w c.txt#把1-3行另存为c.txt文件
sed ‘w a.txt‘ c.txt#全文复制c.txt的内容到a.txt

2.4.9 H h G g

sed复制粘贴功能
模式空间:存放当前处理的行,将处理结果输出。若当前行不符合处理条件,则原样输出。处理完当前行之后再读入下一行
保持空间:作用类似于粘贴板,默认存放一个空行(\n)
H命令的功能:拷贝模式空间的内容,追加粘贴到保持空间。保持空间里面的空行不会被覆盖
h命令的功能:拷贝模式空间的内容,覆盖粘贴到保持空间。保持空间里面的空行被覆盖
G命令的功能:拷贝保持空间的内容,追加粘贴到模式空间
g命令的功能:拷贝保持空间的内容,覆盖粘贴到模式空间
示例:
sed ‘1,3H;$G‘ reg.txt #把1-3行的内容追加粘贴到文件末尾
sed ‘1h;1d;$G‘ reg.txt #把第1行剪切到文件末尾
sed ‘1h;2H;1,2d;$G‘ reg.txt #把1,2行剪切,粘贴到原第3行后面

2.5 替换关键字动作详细解释

2.5.1 s/old/new/

替换每行的第1个old为new

2.5.2 s/old/new/3

替换每行的第3个old为new

2.5.3 s/old/new/g

替换全部的old为new

2.5.4 s/()/\num/

()保留,复制
\粘贴
最多可以记住9个

素材文件test.txt
ni hao nb
welcome to beijing

把第一个字符和最后一个字符对调
sed -r ‘s/^(.)(.*)(.)$/\3\2\1/‘ test.txt
把第一个字符括起来,把中间任意字符括起来,再把最后一个字符括起来。这样就有3个括号,序号从1-3,把3和1对调就实现了

把第二个字符和倒数第二个字符对调
sed -r ‘s/^(.)(.)(.*)(.)(.)$/\1\4\3\2\5/‘ test.txt

2.5.5 s/doc/&s/

把doc替换为docs

2.5.6 sed ‘4,7s/^/#/‘

将4-7行注释掉

2.6 sed命令示例

2.6.1 sed -n ‘4,+10p‘

输出第4行及后面的10行,一共11行

2.6.2 sed $d

删除最后一行

2.6.3 sed /^$/d

删除全部空行

2.6.4 sed ‘/xml/!d‘

删除不包含xml的行。!表示取反

2.6.5 sed -n /bash$/s#:.*##p /etc/passwd

查找能够登录系统的用户名

2.6.6 查找能够登录系统的用户名的密码

a=sed -n /bash$/s#:.*##p /etc/passwd
for i in $a
do
p1=grep "$i" /etc/shadow
p2=${p1:#:}
p3=${p2:%%:
}
echo $p3
done

以上是关于Day05 egrep&正则表达式&sed的主要内容,如果未能解决你的问题,请参考以下文章

12.26&12.27- 正则表达式

12.26&12.27 -正则表达式

day4迭代器&生成器&正则表达式

正则表达式与grep & sed

第五课-第一讲05_01_egrep及扩展正则表达式

学习之路浅谈:输出重定向,grep及正则表达式,egrep