您的位置:首页 > 其它

[一文一命令]sed命令详解

2013-12-20 20:53 225 查看

sed

简介sed是非交互式的编辑器。它不会修改文件除非使用shell重定向来保存结果。默认情况下所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件或输入并将结果发送到屏幕。具体过程如下首先sed把当前正在处理的行保存在一个临时缓存区中也称为模式空间然后处理临时缓冲区中的行完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除然后将下一行读入进行处理和显示。处理完输入文件的最后一行后sed便结束运行。sed把每一行都存在临时缓冲区中对这个副本进行编辑所以不会修改原文件。
语法格式sed [参数] [位址function] [file]
定址[定址就是用于决定对哪些行进行编辑。]地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址sed将处理输入文件的所有行。地址是逗号分隔的那么需要处理的地址是这两行之间的范围包括这两行在内。范围可以用数字、正则表达式、或二者的组合表示。
选项
-e
进行多项编辑即对输入行应用多条sed命令时使用
-n
取消默认的输出---因为默认sed是会对档案进行默认的输出的。有时未避免重复输出就需要加上-n选项。
-f
指定sed脚本的文件名
-r
use extended regular expressions in the script
在脚本中使用扩展正则表达式
命令
命令
功能
a\
在当前行之后添加一行或多行。多行时除最后一行外每行末尾需用“\”续行。注意a后面需要加上\\ 两个\\多的那个\会注释掉\后的东西。如果要显示\那么需要3个\\\
c\
用此符号后的新文本替换当前行中的文本。多行时除最后一行外每行末尾需用"\"续行
i\
在当前行之前插入文本。多行时除最后一行外每行末尾需用"\"续行
d
删除行
h
把模式空间里的内容复制到暂存缓冲区
H
把模式空间里的内容追加到暂存缓冲区
g
把暂存缓冲区里的内容复制到模式空间覆盖原有的内容
G
把暂存缓冲区的内容追加到模式空间里追加在原有内容的后面
l
列出非打印字符
p
打印行
n
读入下一输入行并从下一条命令而不是第一条命令开始对其的处理
q
结束或退出sed
r
从文件中读取输入行如sed ‘/test/r file’ 1.log 在匹配test行之后从file读入文件
!
对所选行以外的所有行应用命令
s
用一个字符串替换另一个
g
在行内进行全局替换
i
将所选的行写入文件
x
交换暂存缓冲区与模式空间的内容
y
将字符替换为另一字符不能对正则表达式使用y命令
w
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
正则表达式元字符:与grep一样sed也支持特殊元字符来进行模式查找、替换。不同的是sed使用的正则表达式是括在斜杠线"/"之间的模式。
sed 命令就是包含两部分1操作 2选址
使用实例
p命令
[root@LiWenTong ~]# ifconfig eth0 | sed -n '/inet addr:/ p' –》如果不加n选项默认会把所有输入重新打印一遍。
inet addr:192.168.1.104 Bcast:192.168.1.255 Mask:255.255.255.0

[root@linux-lwt tmp]# sed -n '1p' 1.txt --->指定输入行
root:$1$OSqWjVsf$Lebv2EkKzV0AA2ps.hTTk1:16058:0:99999:7:::

d命令

命令d用于删除输入行。sed先将输入行从文件复制到模式空间里然后对该行执行sed命令最后将模式空间里的内容显示在屏幕上。如果发出的是命令d当前模式空间里的输入行会被删除不被显示。
只取出eth0的ip地址
实例
1删除行打印行替换行

[root@linux-lwt tmp]# sed -n 'p' 1.txt
hello atong
bin:*:16058:0:99999:7:::
[root@linux-lwt tmp]# sed -i '1d' 1.txt
[root@linux-lwt tmp]# sed -n 'p' 1.txt
bin:*:16058:0:99999:7:::
[root@linux-lwt tmp]# sed '1,2c tidaihang' 1.txt
tidaihang
daemon:*:16058:0:99999:7:::
adm:*:16058:0:99999:7:::
2在某行后面增加内容--->可用于在脚本中向某个配置文件添加内容。
[root@linux-lwt tmp]# cat 1.txt
bin:*:16058:0:99999:7:::
daemon:*:16058:0:99999:7:::
[root@linux-lwt tmp]# sed -in '1a hello this is atong' 1.txt
[root@linux-lwt tmp]# cat 1.txt
bin:*:16058:0:99999:7:::
hello this is atong
如果要增加多行的话可以加上\n 然后后面接上下一行的内容。
3查询某个字串并输出

[root@linux-lwt tmp]# sed -n '/hell/p' 1.txt
hello this is atong
daemon:*:16058:0:99999:7:::
甚至可以再指定的行内进行搜索
[root@linux-lwt tmp]# head -n 5 1.txt
bin:*:16058:0:99999:7:::
hello this is atong
daemon:*:16058:0:99999:7:::
adm:*:16058:0:99999:7:::
hello atong
[root@linux-lwt tmp]# sed -n '1,4p' 1.txt | sed -n '/hello/p'
hello this is atong

4实例获取IP地址
[root@LiWenTong ~]# ifconfig eth0 |grep "inet"
inet addr:192.168.1.104 Bcast:192.168.1.255 Mask:255.255.255.0
[root@LiWenTong ~]# ifconfig eth0 |grep "inet" | sed '/^.*addr:/d'—》一开始想着将前面那部分删除掉结果却是没有任何显示瞬间明白了删除时是删除整行的内容。所以改成替换了。
[root@LiWenTong ~]# ifconfig eth0 |grep "inet" | sed 's/^.*addr://g'
192.168.1.104 Bcast:192.168.1.255 Mask:255.255.255.0
[root@LiWenTong ~]# ifconfig eth0 |grep "inet" | sed 's/^.*addr://g'| sed 's/Bcast.*$//g'---》再进行一次sed的筛选。
192.168.1.104

5-e 进行多项操作
[root@LiWenTong ~]# man man | sed -e '10,$d' -e '/^$/d'--->保留man的前10行并且将空白行删除。在使用d命令的时候不是知道什么时候应该加上/来隔开。
man(1) man(1)
NAME
man -format and display the on-line manual pages
SYNOPSIS
man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file]

-i直接将修改档案内的内容[root@LiWenTong~]# sed -i '$a this is end'1.log | sed -n '$p' 1.logthis isend6)a命令追加内容[root@LiWenTong ~]# sed -n '/belive/a you can do it' 1.log
you can do it
[root@LiWenTong ~]# grep 'can' 1.log---->可以看到在之后一行插入了
i belive i can fly
you can do it
7标记字符串
$ sed –n 's/\(love\)able/\1rs/p' example love被标记为1所有loveable会被替换成lovers而且替换的行会被打印出来。并且不论什么字符紧跟着s命令的都被认为是新的分隔符。这里的\1就是替换\(love\)的部分。如果把p换成g的话就是全局搜索并且i进行替换。而黄色的三个/本来就是s///g就应该要有的结构。
说明在sed的替换命令中可以通过\n 来替换前面正则表达搜索的字段。
如sed -n 's/\(haha\|xixi\)hao/\1buhao/gp' 1.txt那么就表示用\1标记前边的haha或者是xix都会被标识为\1那么实际上被替换的hao-->buhao的其中一个。
实例

[root@linux-lwt tmp]# sed -n 's/\(haha\|xixi\)hao/\1buhao/gp' 1.txt
hahabuhao
xixibuhao
[root@linux-lwt tmp]# cat 1.txt
nonohao
hahahao

8指定sed脚本文件 [此部分还未验证]
Sed脚本文件就是写在文件中的一列sed命令。脚本中要求命令的末尾不能有任何多余的空格和文本。如果一行中有多个命令要用分号分隔。执行脚本时--------------------------sed脚本的内容--------------------
#handle datafile
3i\
~~~~~~~~~~~~~~~~~~~~~
3,$s/\(hrwang\) is \(mjfan\)/\2 is \1/--->此处用\1提高hrwang 用\2替代mjfan 然后通过s/再将\1 \2进行对调。
$a\
We will love eachother forever
-----------------------------------------------------------

9在命令中使用正则表达式
[root@LiWenTong ~]#cat aa.txt
ad i am atong hah aha
hah i am liwentong haha
ad i amatonghah aha
hah i amliwentonghaha
[root@LiWenTong ~]#sed -n -r's/.*(atong|liwentong).*/\1/gp' aa.txt
atong
liwentong
atong
liwentong
小结从一个文本中去查找匹配指定文本的行并只输出匹配的文本。

《sed搜索显示》
Sed 指定结果中的某一行输出或类似grep命令的输出。
Sed –n ‘4p’ 输出第4行。

-----------------------------后续的自我小结------------------------------
sed命令是一个十分强大的命令行可以对文本的内容进行的动作有显示、替换、查询、删除、插入操作。并且不能够针对输入|出内容进行操作而且能够对某个文件的内容进行以上的操作。那么这样就很方便我们在脚本中以命令行的方式去对某写配置文件进行修改了。所以说这样命令用得熟悉的话是非常有用处的。
而且个人觉得如果要和正则表达式结合得好的话那么运用起来就更加强劲了。哈哈 突然有点小兴奋有没有呀好啦。其实根本就没有肚子饿了回家吃饭吧。卡卡卡卡

对了附上一个好的sed文章 http://oldboy.blog.51cto.com/2561410/949365 --------------------------------------------------------------------------

本文出自 “从头开始” 博客,请务必保留此出处http://atong.blog.51cto.com/2393905/1343377
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: