如何使用sed查找具有特定字符串的行并输出到新文件

时间:2018-02-18 00:26:17

标签: regex linux sed

我正在学习sed,所以请耐心等待。我正在尝试使用sed来查找包含" install"的所有文件。在日志中并输出到新文件。这是搜索文件的一个示例:

2016-05-04 07:38:46 install libcairomm
2016-05-05 07:38:47 status half-installed libcairomm
2016-05-05 07:39:49 status unpacked libcairomm

所以,它只输出第一行。以下是我一直尝试的其他一些变化:

sed -n '/[0-9]{2} install/p' > new.txt

我尝试的所有变化都没有做任何事情。它会创建一个空文件。

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:1)

使用sed

注意以下内容不返回任何内容:

$ sed -n '/[0-9]{2} install/p' file

但是,这有效:

$ sed -n '/[0-9]\{2\} install/p' file
2016-05-04 07:38:46 install libcairomm

问题在于,在sed的默认基本正则表达式中,{}被视为普通字符。为了使它们与众不同,必须使用反斜杠进行转义。

或者,可以指定-E,以便sed使用更现代的扩展正则表达式:

$ sed -En '/[0-9]{2} install/p' file
2016-05-04 07:38:46 install libcairomm

保存到文件

要将输出保存在文件中,而不是在终端中显示,请重新添加重定向> new.txt

sed -n '/[0-9]\{2\} install/p' file > new.txt

或者:

sed -En '/[0-9]{2} install/p' file > new.txt

兼容性

在非常旧版本的GNU sed上,不能使用-E。必须使用-r代替:

sed -rn '/[0-9]{2} install/p' file > new.txt

使用grep

此任务不需要sed的许多高级功能。 grep就足够了:

$ grep -E '[0-9]{2} install' file
2016-05-04 07:38:46 install libcairomm

或者:

grep -E '[0-9]{2} install' file >new.txt

答案 1 :(得分:0)

您的命令sed -n '/[0-9]{2} install/p' > new.txt正在使用Basic RegEx或BRE。 The GNU Sed手册解释了BRE与扩展RE或ERE之间的区别。

要解决您的问题,请使用带有-E-r标记的ERE:

sed -rn '/[0-9]{2} install/p' > new.txt

或者,使用反斜杠来转义BRE中的花括号:

sed -n '/[0-9]\{2\} install/p' > new.txt