指点成金-最美分享吧

登录

Day05 egrep&正则表达式&sed

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了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复制粘贴功能
模式空间:存放当前处理的行,将处理结果输出。若当前行不符合处理条件,则原样输出。处理完当前行之后再读入下一行
保持空间:作用类似于粘贴板,默认存放一个空行( )
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/()/ um/

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

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

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

把第二个字符和倒数第二个字符对调
sed -r "s/^(.)(.)(.*)(.)(.)$/14325/" 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的主要内容,如果未能解决你的问题,请参考以下文章