`
ych4865
  • 浏览: 6589 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

sed学习笔记-基础篇

    博客分类:
  • sed
sed 
阅读更多
sed学习笔记:
-----------

·一般形式:
操作行范围(行号或模式匹配行范围)-操作符-操作对象-操作结果-行内操作方式
(在操作符前加!号,则对操作行范围外的行进行操作)
简单的例子如下:
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56
匹配含lucy的行到结尾行之外的行,进行删除操作:
[root@localhost ~]# sed '/lucy/,$!d' grade.log
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 5
匹配含lucy的行到含xx的行,但是由于到结尾行都未匹配到xx的行,所以lucy行后的行都会进行删除操作:
[root@localhost ~]# sed '/lucy/,/xx/d' grade.log
andy 86 78 99 56
lily 66 70 59 56

·分组命令:
对于操作行范围之后的操作符命令可以有多个,多个操作命令使用大括号括起来,多个命令都对操作行范围的行进行操作;
一个简单的例子如下:
[root@localhost ~]# cp grade.log grade.log.bak
对于操作行范围内,进行两个操作:删除含Steve行和修改56为xx:
[root@localhost ~]# sed -i '/lucy/,/xx/{/steve/d;s/56/xx/}' grade.log
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 xx
ann 80 78 90 xx
[root@localhost ~]# cat grade.log.bak
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56

·sed一般使用的场景:
对于一个文件的多重处理;
对于多个文件的同一套策略处理;
获取范围行,对于相应行进行分别的处理。

·替换操作:
一般形式:
行地址/s/模式/替换符/标识
其中,
分割符:
可以不是/,可以是其他字符,但是选择的分割符,不要是正则表达式符和替换文本内的字符。

替换符:
有几点特殊的字符:
1.&,使用模式匹配部分的内容进行替换;
2.\n,n为数字,代表替换在模式匹配部分第n个“\(”和"\)"括起来的部分;
3.\,作为转义符,也可以转义换行符,从而产生多行的替换符。

标识:
可以为:
1.n(1-512),表示对一行内模式识别到的第几次进行替换处理;
2.g,对于全部模式识别到的,都进行替换处理;
3.p,打印匹配到模式空间的内容;
4.w file,模式空间的内容写入file

针对以上规则的几个例子:
使用#作为分割符:
[root@localhost ~]# echo "/dev/null" |sed 's#/dev/null#devnull#'
devnull

替换符:
使用&替换模式匹配到的字符,加入|plus|便于观察:
[root@localhost ~]# echo "one:two" |sed 's/.*:/&|plus|/'
one:|plus|two

使用\n复制模式匹配的内容作为替换符的一部分(为了便于查看,下例sed使用#作为分割符):
[root@localhost ~]# echo "one:two" |sed 's#\(.*\):\(.*\)#\2:\1#'
two:one

使用\在替换符中进行转义换行符,形成多行输出的例子;(较复杂,只想了解基本内容的话,可跳过)
[root@localhost ~]# cat nseptest.sed
{
s/one/\
\
3lineone/
s/://
s/two/\
\
5linetwo/
s/$/\
/
}
在one前加两行空行,去除:号,在two前加一行空行,在末尾再加入一行空行;
为了便于观察,将sed的结果赋予cat -A以便显示出结尾的$符:
[root@localhost ~]# echo "one:two" |sed -f nseptest.sed |cat -A -
$
$
3lineone$
$
5linetwo$
$

最后,标识符的规则比较简单,例子如下:
[root@localhost ~]# echo "one:two" |sed 's/o/x/g'
xne:twx
[root@localhost ~]# echo "one:two" |sed 's/o/x/2'
one:twx
[root@localhost ~]# echo "one:two" |sed 's/o/x/2w file'
one:twx
[root@localhost ~]# cat file
one:twx

·删除操作:
删除符合要求行,清空模式空间数据,重新读取新的数据行。
几个简单的例子:
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56
[root@localhost ~]# sed '/lily/,/steve/d' grade.log
andy 86 78 99 56
ann 80 78 90 56
删除空行:
[root@localhost ~]# cat name.log
andy,3233:xx
steve,77899:yy


end,0:z
[root@localhost ~]# sed '/^$/d' name.log
andy,3233:xx
steve,77899:yy
end,0:z
删除Steve以及之后的行:
[root@localhost ~]# sed '/steve/,$d' name.log
andy,3233:xx

·插入,追加,修改操作:
插入和追加操作只能对单行进行操作;而且加入的行对模式空间没有影响,也不会执行后面的执行语句。
修改操作可以对多行进行操作,相当于先将匹配的多行删除,然后,替换为输入数据。

一个综合的例子:
在含andy行前加入“insertline”;在含末尾行后追加“appendline”;将含82数据行,替换为“82changeline”:
[root@localhost ~]# sed -e '/andy/i insertline' -e '$a appendline' -e '/82/c 82changeline' grade.log
insertline
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
82changeline
ann 80 78 90 56
appendline
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56

·转换操作:
进行字符的转换操作,注意此操作和单词无关,只是相应位置的字符和字符的转换:
[root@localhost ~]# echo aBcde|sed 'y/abc/XYZ/'
XBZde

·next命令:
将模式空间的行移除,输入下一行,进行下一个执行命令;(和awk的next操作类似)
此操作改变了sed正常的控制流(读入一行,全部语句执行完成,再读取下一行);
产生的结果就是模式空间中的行,不再执行next之后的语句;读入的下一行,不会执行next之前的语句。
一个简单的例子:
将含“Steve”行后面的空行删除:
[root@localhost ~]# cat name.log
andy,3233:xx
steve,77899:yy

empty

end,0:z
[root@localhost ~]# sed '/steve/{n;/^$/d}' name.log
andy,3233:xx
steve,77899:yy
empty

end,0:z
#注意:empty行后面的空行未删除。

·读入文件,写入文件操作:
读入文件(r):适用于要将一个文件系统插入另一文件的特定行的情况:
写入文件(w):适用于将匹配行,分别写入单独文件的情况。
读入例子如下:
使用filename文件内的内容插入到FILENAME行后,此外可以删除FILENAME行:
[root@localhost ~]# sed -e '/FILENAME/r filename' -e '/FILENAME/d' grade.log
grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56
[root@localhost ~]# cat filename
grade.log
[root@localhost ~]# cat grade.log
FILENAME
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56

写出例子如下:
[root@localhost ~]# sed -e '/Sales/w salelist.log' -e '/Support/w suptlist.log' employees.txt
Emma Thomas:100:Sales
Alex Jason:200:Sales
Madison Randy:300:Support
Sanjay Gupta:400:Support
Nisha Singh:500:Sales
[root@localhost ~]# cat salelist.log
Emma Thomas:100:Sales
Alex Jason:200:Sales
Nisha Singh:500:Sales
[root@localhost ~]# cat suptlist.log
Madison Randy:300:Support
Sanjay Gupta:400:Support
[root@localhost ~]#

退出操作命令:
用于对于大文件进行操作,操作后即返回,不再继续查找以节省时间:
节省时间的例子如下:
[root@localhost ~]# time sed '10q' /var/log/anaconda.log
10:11:15 INFO    : 515308 kB are available
...
10:11:16 INFO    : loaded nfs_acl from /modules/modules.cgz

real    0m0.184s
user    0m0.000s
sys     0m0.017s
[root@localhost ~]# time sed -n '1,10p' /var/log/anaconda.log
10:11:15 INFO    : 515308 kB are available
...
10:11:16 INFO    : loaded nfs_acl from /modules/modules.cgz

real    0m0.525s
user    0m0.005s
sys     0m0.026s
当然,正常场景可能是匹配查找关键字,然后退出。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics