shell脚本之sed详解(sed命令,)(⼀)
Sed是⼀个⾮交互性⽂本流编辑器。它编辑⽂件或标准输⼊导出的⽂本拷贝。vi中的正则表达式命令在sed中⼤多可以通⽤。##sed常⽤选项
-e script 指定sed编辑命令
-f scriptfile 指定的⽂件中是sed编辑命令
-n 寂静模式,抑制来⾃sed命令执⾏过程中的冗余输出信息,⽐如只显⽰那些被改变的⾏。
-i[SUFFIX], –in-place[=SUFFIX] 替换和备份源⽂件
edit files in place (makes backup if extension supplied)
##1.参数p: 打印匹配⾏
$ sed -n ’2p’/etc/passwd 打印出第2⾏
$ sed -n ’1,3p’/etc/passwd 打印出第1到第3⾏
$ sed -n ‘$p’/etc/passwd 打印出最后⼀⾏
$ sed -n ‘/user/p’ /etc/passwd 打印出含有user的⾏
$ sed -n ‘/\$/p’ /etc/passwd 打印出含有$元字符的⾏,$意为最后⼀⾏
$ sed -n ‘$=’ ok.txt 打印总⾏数
##2.参数a和i: 插⼊⽂本和附加⽂本(插⼊新⾏)
$ sed -n ‘/FTP/p’/etc/passwd 打印出有FTP的⾏
$ sed ‘/FTP/a\ 456′ /etc/passwd 在含有FTP的⾏后⾯新插⼊⼀⾏,内容为456
$ sed ‘/FTP/i\ 123′ /etc/passwd在含有FTP的⾏前⾯新插⼊⼀⾏,内容为123
$ sed ‘/FTP/i\ “123″’ /etc/passwd在含有FTP的⾏前⾯新插⼊⼀⾏,内容为”123″
$ sed ’5 a\ 123′ /etc/passwd 在第5⾏后插⼊⼀新⾏,内容为123
$ sed ’5 i\ “12345″’ /etc/passwd 在第5⾏前插⼊⼀新⾏,内容为”123表达式45″
sed-搜索结果后⾯增加嵌⼊代码
#!/bin/bash
#export LANG=zh_CN
find ./ -name “*.html” -exec grep 10000008/100 ‘{}’ \; -exec sed -i ‘/10000008/a\<\!--\# include file=\"\/code.html\"--\>‘ {} \; #
##3.参数d:删除⽂本
删空格
sed -i ‘s/[ ]*//g’ ~/$
删除⽆内容空⾏
sed ‘/^$/d’ f > f
sed -i ‘/^$/d’ ~/$
删第⼀⾏
sed -i ’1d’ ~/$
删前两⾏
sed -i ’1,2d’ ~/$
del多⾏
cat SCTP.log |sed ’1d;2d;$d’
删除最后⼀⾏:
sed -e ‘$d’ file
删除最后两⾏:
sed ‘N;$!P;D’ file
sed ‘N;$!P;$!D;$d’ file
删除最后n⾏:
$vi sed.sh
$!/bin/bash
A=$(sed -n ‘$=’ file)
sed $(($A-n+1)),${A}d file
$ sed ‘/user/d’/etc/passwd
删除带有string的⾏(del include love row head)
sed -i ‘/^love/d’ file
sed -i ‘/love/d’ file
vi删除包含strings前4⾏,后34⾏
:/strings/-4,+34d
删除配置⽂件中#号注释⾏
sed ‘s#\#.*##’ f > f
sed ‘s,\#.*,,’
删除配置⽂件中//号注释⾏
sed ‘s#//.*##’ f > f
sed ‘s@//.*@@’
删除由空格和Tab⽽成的空⾏
sed ‘/^[[:space:]]*$/d’ f > f
sed ‘/^[[:space:]]*$/d’
删除尾⾏的空格
sed -e ‘s/.$//’ file > f
在尾⾏添加1个空格
sed ‘s/[0-9]$/& /g’ file > f
##4.参数s:替换⽂本,替换命令⽤替换模式替换指定模式,格式为:
[ a d d r e s s [,address]] s/pattern-to-find/replacement-pattern/[g p w n]
$ sed ‘s/user/USER/’/etc/passwd 将第1个user替换成USER,g表明全局替换
$ sed ‘s/user/USER/g’/etc/passwd 将所有user替换成USER
$ sed ‘s/user/#user/’/etc/passwd 将第1个user替换成#user,如⽤于屏蔽作⽤
$ sed ‘s/user//’/etc/passwd 将第1个user替换成空
$ sed ‘s/user/&11111111111111/’/etc/passwd 如果要附加或修改⼀个很长的字符串,可以使⽤( &)命令,&命令保存发现模式以便重新调⽤它,然后把它放在替换字符$ sed ‘s/user/11111111111111&/’/etc/passwd 这⾥是将&放后⾯在包含字符串test的任意⾏上,将111替换成222
$ sed ‘/test/s/111/222/g’
##5. 快速⼀⾏正则表达式命令下⾯是⼀些⼀⾏命令集。([ ]表⽰空格,[TAB]表⽰t a b键)
‘s/\ . $//g’ 删除以句点结尾⾏
‘-e/abcd/d’ 删除包含a b c d的⾏
‘s/[ ] [ ] [ ] */[ ]/g’ 删除⼀个以上空格,⽤⼀个空格代替
‘s/^ [ ] [ ] *//g’ 删除⾏⾸空格
‘s/\ . [ ] [ ] */[ ]/g’ 删除句点后跟两个或更多空格,代之以⼀个空格
‘/^ $/d’ 删除空⾏
‘s/^ .//g’ 删除第⼀个字符
‘s/COL \ ( . . . \ )//g’ 删除紧跟C O L的后三个字母
‘s/^ \///g’ 从路径中删除第⼀个\
‘s/[ ]/[TAB]//g’ 删除所有空格并⽤t a b键替代
‘S/^ [TAB]//g’ 删除⾏⾸所有t a b键
‘s/[TAB] *//g’ 删除所有t a b键
##6、⽤sed删除⽂件中的换⾏符,杀鸡哪需⽜⼑?
tr -d ‘\n’ file
真的需要sed
sed -nr ‘ H;
$ {
x;
s/\n//g;
p
}’
##7、sed获取ip
[root@c01 ~]# ifconfig eth0|sed -ne ‘s/^.*addr:\([0-9.]*\).*$/\1/p’
192.168.100.180
[root@c01 ~]# ifconfig eth0 | sed -e ‘/inet/!d’ -e ‘s/.*addr://’ -e ‘s/[ ].*//’
192.168.100.180
##8、\/转义字符
echo /usr/local/bin | sed ‘s/\/usr\/local\/bin/\/common\/bin/’
find . -name “*.html” |xargs sed -i ‘s#/canApp/evaluation/html/ index.html#www.wallcopper/eva/#g’
都可以把当前⽬录下的.c .h⽂件中的TAB替换成4个空格。
find . -name “*.[c|h]” | xargs sed -i ‘s/\t/ /g’
##9、参数f:
以下三个命令相等,先在包含字符串test的任意⾏上,将111替换成222,再将字符f替换成hello
$ sed ‘/test/s/111/222/g ; s/f/hello/g’
$ sed -e ‘/test/s/111/222/g’ -e ‘s/f/hello/g’
选项-f: 将要执⾏的所以编译命令放⼊在⽂件中
$ more scher
/test/s/111/222/g
linux循环执行命令脚本s/f/hello/g’
$ sed -f
##10、参数q:表⽰跳离sed。最多与⼀个地址参数配合。
打印出含有a或b字符的⾏,⼀旦遇到数字,即刻停⽌打印。
$ sed -n -e ‘/[0-9]/q’ -e ‘/[a b]/p’
到china quit
sed ‘china/q’
##11、参数-i后缀:替换并将源⽂件备份改后缀
$ sed -i.bak ‘s/123/efg/g’ a.txt 备份源⽂件
##12、参数r:在某⾏插⼊⽂件
$ sed -i ’2 ’
##13、参数w:读⼊⽂件中的内容存⼊到另⼀⽂件中()。最多与⼀个地址参数配合。
将⽂件中含test字符串的数据⾏,copy⾄档中储存(原中⽆内容)
$ sed -e ‘/test/’
##14、参数y:转换数据中的字符。最多与两个地址参数配合。
1.将⽂件中的⼩写字母替换成⼤写字母。
$ sed -e ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’
其中前后字符个数必须相同.
##15、参数!:表⽰不执⾏函数参数。将⽂件中除了important字符串,其余全删除。
$ sed -e ‘/important/!d’
##16、参数=:表⽰印出资料的⾏数。最多与两个地址参数配合。 1.印出⽂件资料并显⽰⾏数。
$ sed -e ‘=’
计算总⾏数
$ sed -n ‘$=’ a.txt
##17、其它参数参数#:表⽰对⽂字的注释。
参数N:表⽰添加下⼀笔资料到pattern space内。最多与两个地址参数配合。(添加下⼀笔:添加⼀笔资料后,继续添加这个资料的下⼀⾏数据到pattern space内) 1,将⽂件中的数据合并。⽂件内容如下: UNIX LINUX
$ sed -e ‘N’ -e’s/\n/\,/g’
结果如下: UNIX,LINUX
参数D:表⽰删除pattern space内的第⼀⾏资料。最多与两个地址参数配合。
参数P:打印出pattern space内的第⼀⾏资料。
$ sed -n -e ‘N’ -e ‘P’
利⽤N将下⼀⾏资料(即:偶数⾏)添加到pattern space内,在利⽤P打印出奇数⾏。解释过程:由于N的作⽤,使得每次添加⼀条资料到pattern space后,先不执⾏操作,⽽是继续添加这个资料的下⼀⾏到pattern space内,然后P参数打印出第⼀⾏资料。
参数h:表⽰暂存pattern space的内容⾄hold space(覆盖)。最多与两个地址参数配合。
参数H:表⽰暂存pattern space的内容⾄hold space(添加)。最多与两个地址参数配合。
参数g:表⽰将hold space的内容放回⾄pattern space内。(覆盖掉原pattern space内的数据)
参数G:表⽰将hold space的内容放回⾄pattern space内。(添加⼤到原pattern space数据之后)
将⽂件中所有空⾏删除,并在每⼀⾏后⾯增加⼀个空⾏。
$ sed ‘/^$/d;G’
将⽂件中所有空⾏删除,并在每⼀⾏后⾯增加两个空⾏。
$ sed ‘/^$/d;G;G’
参数x:表⽰交换hold space与pattern space内的数据。
将⽂件第三⾏的数据替换成第⼀⾏的数据。
$ sed -e ’1h’ -e ’3x’
参数b:
参数t:
如果使⽤sed对⽂件进⾏过滤,最好将问题分成⼏步,分步执⾏,且边执⾏边测试结果。
经验告诉我们,这是执⾏⼀个复杂任务的最有效⽅式。
参考:
www.2cto/os/201111/112217.html
/download.xqy?id=w5pncjwnrs77lz3s&number=2
ire/Unix/Sed.html
sed.
转⾃:
www.wallcopper/linux/769.html
( ⼆ )
⼀,基本概述
(1)基本介绍
sed是⼀款流编辑⼯具,⽤来对⽂本进⾏过滤与替换⼯作, sed通过输⼊读取⽂件内容,但⼀次仅读取⼀⾏内容进⾏某些指令处理后输出,sed更适合于处理⼤数据⽂件。
(2)⼯作原理
sed在处理⽂本⽂件的时候,会在内存上创建⼀个模式空间,然后把这个⽂件的每⼀⾏调⼊模式空间⽤相应的命令处理,处理完输出;接着处理下⼀⾏,直到最后。
(3)与vim的区别
vim需要通知处理⽂件的哪⼏⾏才会去处理,sed默认会处理⽂件的所有⾏,除⾮你告诉它不处理哪⼏⾏。
⼆, sed的基本语法
(1)sed [选项] [定址commands] [inputfile]
关于定址:
定址可以是0个、1个、2个;通知sed去处理⽂件的哪⼏⾏。
0个:没有定址,处理⽂件的所有⾏
1个:⾏号,处理⾏号所在位置的⾏
2个:⾏号、正则表达式,处理被⾏号或正则表达式包起来的⾏
(2)
选项:
--version 显⽰sed版本hao
--help 显⽰帮助⽂档
-n 关闭默认输出,默认将⾃动打印所有⾏
-e 多点编辑,允许多个脚本指令被执⾏。
-r ⽀持扩展正则+ ? () {} |
-i 可以修改原⽂件,慎⽤!
-f ⽀持使⽤脚本
命令:
p打印⾏
d 删除⾏
s 替换
n替换第⼏个匹内容
w另存为
a 之后添加⼀⾏
i 当前⾏之前插⼊⽂本
y 替换匹配内容
三,实际案例讲解
(1)p(与-n合⽤)
查看passwd⽂件的1~3⾏
@1,打印⼀到三⾏
[root@tx3 ~]# cp /etc/passwd /t1
[root@tx3 ~]# cat -n t1 | sed -n '1,3p'
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin
@2,查看passwd⽂件的lp~halt⾏
[root@tx3 ~]# cat -n t1 |sed -n '/lp/,/halt/p'
5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
@3,打印基数⾏(从第⼀⾏开始,每隔⼀⾏⼀输出)
@4,打印uid是0或1的⾏
[root@tx3 ~]# sed -n '/x:[01]:/p' t1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(2)d 删除
@1,删除第⼀⾏
@2,删除第⼀⾏和第三⾏(与-e选项合⽤)
@3,;选项的使⽤和-e⼀样
@4,取反:!
[root@tx3 ~]# cat -n t1 | sed '1!d'
1root:x:0:0:root:/root:/bin/bash
(3)s 查替换 s///
语法:
'[address]s/pattern/replacement/flags'
old new
flags:
n:1-512 之间的正整数,表⽰替换模式⾥⾯出现的第⼏次内容 p:打印
g:全局修改
w:另存为
这⼏个选项是可以复合使⽤的,但是写的要有意义。(pg ;nw)注:这⾥为部分截取
@1默认会替换⾏⾥⾯的第1个匹配
[root@tx3 ~]# sed 's/root/ROOT/' t1
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论