Linux文本处理命令三剑客之——sed

sed命令

sed主要用来自动编辑一个或者多个文件,简化对文件的反复操作,编写转换程序等!

sed是一种流编辑器。处理时,把当前处理的行存储在临时缓冲区,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往到屏幕,接着处理下一行,这样不断重复,知道文件末尾。

除非缓冲区的内容被删除了,或者在输出时被取消,否则所有被处理的行都将会输出到屏幕。输出完一行后,模式空间被清空,并存入新的一行等待处理。

所以,sed是按行处理的,而awk是按列处理!!!!

sed工作流程图

Linux文本处理命令三剑客之——sed_第1张图片
缓冲区:每行内容都会放入缓冲区,也称“模式空间”,pattern space

sed语法

sed [-hnVi] [-e <script>] [-f <script-file>] [input-files]

选项说明
-h:帮助信息
-n:仅显示script处理的结果
-V:版本信息
-i:修改文件
-e:指定script来处理输入的文本文件,可指定多个-e选项
-f:指定script文件来处理输入的文本文件

动作说明
a:新增,a后面可以跟字符串,会新增在下一行
i:新增在上一行,和a恰恰相反
c:取代,c后面可以跟字符串,这些字符串可以取代 n1 n2之间的行内容
d:删除,删除匹配行
p:打印,通常可以和参数-n一起使用
s:替换,可以和正则表达式一起使用 1,20s/old/new/g
=:显示行号

h:拷贝莫板块的内容到内存中的缓冲区
H:追加莫板块的内容到内存中的缓冲区
g:获得内存缓冲区中的内容,并替代当前模版块中的文本
G:获得内存缓冲区中的内容,并追加到当前模版块中
n:读取下一个行输入,用下一个命令处理新的行
N:追加下一个输入行到模版块后面,并在2者之间嵌入一个新行
q:退出sed

前面的工作选项使用较多、较频繁,后面几个可以使用到时在看。

sed处理案例

1、删除第4行到最后一行

nl /etc/passwd | sed -e '4,$d'

2、打印5-7

sed -n '5,7p' /etc/passwd

3、查找以root字符串开头的行

sed -n '^root/p' /etc/passwd

4、多点编辑,删除从第3行到最后一行,并把bash替换为Hello

sed -e '3,$d' -e 's/bash/Hello/g' /etc/passwd

5、打印奇数/偶数行
奇数行

sed -n 'p;n' /etc/passwd
sed -n '1~2' /etc/passwd

偶数行

sed -n 'n;p' /etc/passwd
sed -n '2~2' /etc/passwd

1~2p:从第1行开始,每隔2行输出

6、打印匹配字符串的下一行

grep -A 1 xxxx /etc/passwd
sed -n '/xxxx/{n;p}' /etc/passwd
awk '/xxxx/{getline;print}' /etc/passwd

7、显示包含hhh的行到包含omc的行之间的行

sed -ne '/hhh/,/omc/p' log.txt

8、在文件第一行添加happy,最后一行添加new year

sed -e '1i happy' -e '$a new year' log.txt

9、匹配root后,读入/etc/passwd内容在匹配内容后面

sed '/root/ r /etc/passwd' log.txt

r:读命令,将一个文件中的内容追加到当前文件的特定位置
w:写命令,同上,真实写入,不用加-i选项

10、将匹配test的行追加到最后一行

sed -e '/test/h' -e '$G' log.txt

h:匹配到test之后,h命令会复制一份将其放入缓冲区
G:取出缓冲区的内容,然后把它放回模式空间,并追加到当前行的末尾

11、将包含hello行中的o替换为abc

sed -n '/hello/s/o/abc/g' log.txt

其他:
sed命令还可配合find命令一起使用

find ./ -type f -exec sed -i 's/aaa/xxx/g' {} \;

sed正则匹配的元字符集

^:行开头
$:行结尾
.:任意一个飞换行字符
*:零个或多个字符
[]:指定范围内的字符。如/[ab]cc/可以匹配acc或者bcc
[^]:不在指定范围内的字符
\(..\):匹配子串。s/\(love\)able/\1rsloveable替换为lovers1表示第一组括号
&:保留搜索字符,用来替换其他字符。s/love/*&*/结果为*love*
\<:匹配单词开头
\>:匹配单词结尾。/love\>/包含以love结尾的单词
x\{m\}:重复字符x出现m次。/a\{3\}/表示包含3a的行
x\{m,\}:至少m
x\{m,n\}m~n

sed总结

sed被誉为Linux下的文本处理三剑客之一,也是三剑客的第二个,它具有很强的文本处理能力,有些时候不一定要写很复杂的程序才能完成日志分析,其实用很简单的Linux命令就能完成需求,而且效率非常高。sed就是其中之一。

你可能感兴趣的:(Linux)