【问题标题】:How to use sed to find lines with a specific string and output to new file如何使用 sed 查找具有特定字符串的行并输出到新文件
【发布时间】:2018-07-28 13:43:59
【问题描述】:

我正在学习 sed,所以请多多包涵。我正在尝试使用 sed 在日志中查找所有包含“安装”的文件并输出到新文件。这是正在搜索的文件的示例:

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

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

任何帮助将不胜感激:)

【问题讨论】:

标签: regex linux sed


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    使用 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
    

    【讨论】:

    • 哦,我明白了,我也忘记了输入。谢谢!这是一个有用的解释
    • @rrfeva 很高兴有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多