【问题标题】:Do a tail -F until matching a pattern (with no error)执行 tail -F 直到匹配模式(没有错误)
【发布时间】:2013-10-27 16:57:05
【问题描述】:

我有一行从this thread 开始工作,它跟踪文件直到找到匹配的模式。它运作良好,但我找不到抑制之后发生的输出的方法。 该行是:

sh -c 'tail -n +0 -f $logfile | { sed "/EOF/ q" && kill $$ ;}'

到 /dev/null 的管道不起作用,因为我根本没有从 tail 命令获得任何输出。另外,我在 OSX 上,由于语法原因,其他各种 sed 和 awk 建议都不起作用。

它总是以下面的结尾,而不是什么都没有:
sh:第 10 行:14285 终止:15 sh -c 'tail -n +0 -f $logfile | { sed "/EOF/ q" && kill $$ ;}'

我也不想显示匹配的文本(上例中的 EOF)。 欢迎提出任何建议。

【问题讨论】:

    标签: macos bash shell sed tail


    【解决方案1】:

    对于一个文件(例如日志)

    sed -u "/pattern/ q" YourFile
    

    对于管道

    ls -l | sed -u "/pattern/ q"
    

    sed 的 -u 告诉它作为流输入工作

    【讨论】:

    • OSX 给了我这个:sed: 非法选项 -- u
    • sed 默认使用缓冲区,因此在流输入中,如果部分操作将模式保留在内存中,它可以达到缓冲区限制。尝试不使用 -u 它仍然可以工作,但有时会在您的模式(缓冲区)之后在线输入
    • 没有 -u 它只是按原样读取文件,然后退出。它不会先等待任何模式。不知道为什么 OSX 不喜欢 -u 选项。还是谢谢。
    【解决方案2】:

    这是 shell 的工作监控弹出消息。

    nomonitor() {
        set +m
        "$@"
        set -m
    }
    nomonitor sh -c 'tail -n +0 -f $logfile | { sed "/EOF/ q" && kill $$; }'
    

    【讨论】:

    • 谢谢。我不太明白,但它给了我: sh: line 13: 17622 Terminated: 15 "$@"
    【解决方案3】:

    您实际上可以像这样丢弃标准错误:

    sh -c 'tail -n +0 -f $logfile | { sed "/EOF/q" && p=$$ && kill $((p+1)) ; }'
    

    【讨论】:

    • 谢谢,这值得一试,但不幸的是没有奏效。错误仍然显示: sh: line 11: 14864 Terminated: 15 sh -c 'tail -n +0 -f $logfile | { sed "/EOF/q" && kill $$ ;}' 2> /dev/null
    • sh:第 13 行:83905 终止:15 sh -c 'tail -n +0 -f $logfile 2>/dev/null | { sed "/EOF/ q" && kill $$ ;}' 最奇怪了!不过感谢您的帮助,不胜感激。
    • sh:第 14 行:92708 终止:15 sh -c 'tail -n +0 -f $logfile | { sed "/EOF/ q" && kill $$ > /dev/null 2>&1 ;}' 我想知道这是否与 sh 命令本身有关.. 很奇怪。不过再次感谢。我可能会再次寻找完全不同的方式。我不担心代码超过多行等。
    • 是的,谢谢,但不幸的是,这段代码实际上永远不会结束(尽管 EOF 已添加到文件中)。
    • 这很奇怪,因为我在我的 osx 上使用真实的日志文件对其进行了测试。
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2014-04-20
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多