sed
主要用来自动编辑一个或者多个文件,简化对文件的反复操作,编写转换程序等!
sed
是一种流编辑器。处理时,把当前处理的行存储在临时缓冲区,称为“模式空间”,接着用sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往到屏幕,接着处理下一行,这样不断重复,知道文件末尾。
除非缓冲区的内容被删除了,或者在输出时被取消,否则所有被处理的行都将会输出到屏幕。输出完一行后,模式空间被清空,并存入新的一行等待处理。
所以,sed
是按行处理的,而awk
是按列处理!!!!
缓冲区:每行内容都会放入缓冲区,也称“模式空间”,pattern space
!
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
前面的工作选项使用较多、较频繁,后面几个可以使用到时在看。
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' {} \;
^
:行开头
$
:行结尾
.
:任意一个飞换行字符
*
:零个或多个字符
[]
:指定范围内的字符。如/[ab]cc/
可以匹配acc
或者bcc
[^]
:不在指定范围内的字符
\(..\)
:匹配子串。s/\(love\)able/\1rs
,loveable
替换为lovers
。1
表示第一组括号
&
:保留搜索字符,用来替换其他字符。s/love/*&*/
结果为*love*
\<
:匹配单词开头
\>
:匹配单词结尾。/love\>/
包含以love
结尾的单词
x\{m\}
:重复字符x
出现m
次。/a\{3\}/
表示包含3
个a
的行
x\{m,\}
:至少m
次
x\{m,n\}
:m~n
次
sed
被誉为Linux下的文本处理三剑客之一,也是三剑客的第二个,它具有很强的文本处理能力,有些时候不一定要写很复杂的程序才能完成日志分析,其实用很简单的Linux命令就能完成需求,而且效率非常高。sed
就是其中之一。