linux sed命令
作者:互联网
什么是sed
sed 是 stream editor 的缩写,中文称之为“流编辑器”。
sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。
sed的结构
sed 的命令格式:
sed command file
- command 部分:针对每行的内容所要进行的处理(这部分很重要很重要)。
- file 部分:要处理的文件,如果忽略 file 参数,则 sed 会把标准输入作为处理对象。
sed 的工作原理是什么
刚才我们说了,sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。
如前面所说,在这个处理过程中,sed 命令并不会对文件本身进行任何更改。
看一个最最简单的 sed 命令的例子
现看原文件 # cat test.txt test01 test02 test03 用sed命令,来删除文件中带符号“2”的行 # sed '/2/d' test.txt test01 test03 sed操作是在自己的模式空间中执行的,所以是不会改动test.txt原原文件 # cat test.txt test01 test02 test03 #
这个命令的 command 部分是/2/d
,而且它是用单引号括起来的。
用到 sed,别忘了用单引号将 command 部分括起来。
/2/d
中的 d 表示删除,意思是说,只要某行内容中含有字符 2,就删掉这一行。(sed 所谓的删除都是在模式空间中执行的,不会真正改动 roc.txt 原文件。)
用 sed 命令实现 cut 命令的效果
假如我们想实现类似于 cut-d:-f 1/etc/passwd 的效果,也就是以冒号为间隔符提取第 1 个域,用 sed 命令应该怎么操作呢?
# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync # head -n 5 /etc/passwd | sed 's/:.*$//' root bin daemon adm lp
command 部分指定成了's/:.*$//'
,表示我们要把每一行的第一个冒号到结尾的部分都清空,这样留下的便是第一个冒号前的内容啦。
这里 command用到的是s命令
,s命令
的语法格式如下:
s/regexp/replacement/[flags]
regexp是要查找匹配的正则 replacement是替换内容 [flags]是可选的,用来添加一些额外标记参数
sed 都有哪些好用的选项
说到 sed 命令的选项,就不得不提-n
选项,想把这个选项介绍清楚,还是要费一些脑子和笔墨的。
前面提到,sed 会将模式空间里的行经过处理后输出到标准输出,这是默认的处理方式。也就是说,除非你使用“d”来删除此行,否则经过“模式空间”处理的行都是会被输出到标准输出(屏幕)上的。我们一起来看下面的例子:
#还是先来看看原文件的内容
[roc@roclinux ~]$ cat roc.txt 1 2 3 4 5 #仔细看, 输出中出现了两个“4” [roc@roclinux ~]$ sed ‘/4/p’ roc.txt 1 2 3 4 4 5
看,所有的原始文件内容都被输出来了,而且含有字符4的行被输出了两遍。
但这就是 sed 命令的工作原理,它会不问青红皂白地把经过处理的行先输出出来,然后再执行后面的动作。(在这里我们设定了 p,表示打印此行。)这明显不符合我们的初衷,我们只是想让 sed 命令找到含有 4 的行再输出。
这时候,不妨加上-n
选项试一试,你会发现,结果变得如你所愿了。
[roc@roclinux ~]$ sed -n '/4/p' roc.txt 4
-n
选项会很严肃地警告 sed 命令:除非是明确表明要输出的行,否则不要给我胡乱输出。-n
选项经常和 p 配合使用,其含义就是,输出那些匹配的行。
标签:输出,处理,roc,命令,sed,linux,txt 来源: https://www.cnblogs.com/lei2017/p/16292915.html