![在存在 grep 的世界中,是否有 `sed -n "/regexp/p"` 的用例?](https://linux22.com/image/171334/%E5%9C%A8%E5%AD%98%E5%9C%A8%20grep%20%E7%9A%84%E4%B8%96%E7%95%8C%E4%B8%AD%EF%BC%8C%E6%98%AF%E5%90%A6%E6%9C%89%20%60sed%20-n%20%22%2Fregexp%2Fp%22%60%20%E7%9A%84%E7%94%A8%E4%BE%8B%EF%BC%9F.png)
sed -n "/regexp/p"
将仅打印匹配的行regexp
而不打印其他行。这似乎与所做的完全等同grep
。我看到使用此构造的唯一用例是,grep
如果您已经在 sed 内部执行某些操作并且通过管道传输到另一个程序会很笨拙。
有人能想到他们会使用这个构造的其他原因吗grep
?
答案1
该命令sed -n '/re/p'
(或sed '/re/!d'
,不使用-n
在每个循环结束时抑制默认输出)与 相同grep -e 're'
,并且两者都可以追溯到ed
编辑器的g/re/p
命令(“全局匹配re
并打印”);以像这样的基本方式使用sed
and就像在.grep
g
ed
如果您只想打印与特定正则表达式匹配的行,请使用grep
.这就是作用grep
。这是它最基本的任务。如果您使用grep
而不是sed
用于此任务,它将使您的 shell 代码更清晰、更易于理解和维护。
如果它是某个较长编辑脚本的一部分,请使用/re/p
in 。除非您有一些非常特殊和古怪的要求,否则不要进行管道输入或反之亦然。sed
sed
grep
sed
请注意,命令/re/
中的sed
是地址。它寻址与特定正则表达式匹配的所有行。使用/re/p
,它会打印这些行。换句话说,/re/
是命令的地址p
。
地址也可以是行号,或者由两个行号、两个正则表达式或其组合描述的范围。例如,您可以使用sed -n '5,/re/p'
打印从第 5 行到任何匹配的行的所有行re
。该grep
实用程序不具备此功能,该功能是sed
从ed
编辑器继承的。
总之:grep
是更适合提取与特定正则表达式匹配的行的工具。要提取匹配更复杂条件(例如在某个范围内)的行,请使用sed
或awk
。
答案2
注意尺寸:
$ ls -lh /bin/grep /bin/sed
-rwxr-xr-x 1 root root 207K Apr 29 2016 /bin/grep
-rwxr-xr-x 1 root root 72K Feb 11 2016 /bin/sed
$
grep
使用的内存多于sed
以及执行时间(实际):
$ time date | grep Apr
Fri Apr 17 13:31:11 PDT 2020
real 0m0.035s
user 0m0.000s
sys 0m0.016s
$ time date | sed -n '/Apr/p'
Fri Apr 17 13:31:29 PDT 2020
real 0m0.028s
user 0m0.000s
sys 0m0.016s
$
看看怎么样sed
是不是快了一点?
在资源受限的嵌入式环境中,这可能很重要。