【问题标题】:log parsing with sed or grep使用 sed 或 grep 解析日志
【发布时间】:2011-12-27 13:14:31
【问题描述】:

我想从这种日志中获取数据。

11 月 12 日 13:46:14 主页 cxxd[8892]: 208 11/12 13:46:14| qc=IN (1), qt=A (1), query="www.yahoo.com."

实现了这个,它给了我 URL。但不适用于“TAIL -F”,因此我可以只监控网址。

tail -100 /var/log/system.log | grep“查询=”| sed -e "s/.*query=//" | sed -e "s/\"//g" | sed -e "s/.$/ /"

请建议或加强

【问题讨论】:

    标签: shell sed grep tail


    【解决方案1】:

    我希望您的多个 sed 脚本可以与 tail -F 输出一起工作,但与您的预期不同。

    C 标准 IO 库将执行缓冲以提高性能。 IO 库可以执行 (a) 无缓冲 (b) 行缓冲 (c) 块缓冲。如果输出到终端,通常会选择行缓冲。但是如果输出到文件或管道,则通常选择块缓冲。 (比这更复杂——如果有问题的文件描述符被用于 stdout 或 stderr 或其他文件,则行为会发生变化。有关详细信息,请参阅setvbuf(3)。)

    因此,虽然您现在看到的块缓冲对于性能 可能更好,但这确实意味着您可以等待一段时间才能看到任何输出,因为每个命令最终都会累积一个 数据块。至少grep(1) 允许--line-buffered 命令行选项使用行缓冲——并且sed(1) 允许--unbuffered 命令行选项更频繁地刷新输出缓冲区。所以试试这个:

    tail -f /var/log/system.log | grep --line-buffered "query=" | sed -u -e "s/.*query=//" | sed -u -e "s/\"//g" | sed -u -e "s/.$/ /"
    

    (我没有为tail(1) 找到任何类似的选项,但即使它向其他人发送数据块,对grep(1) 和sed(1) 的更改也会有很大帮助。)

    【讨论】:

    • 太棒了。对我来说,sed 的选项是 -l 而不是 -u。效果很好!谢谢!
    • 你的平台是什么?我对不同的选择感到惊讶。 (我的sed 是GNU sed version 4.2.1。)
    • 我在 Mac 上。我尝试了 sed -v 和 sed --version,但没有给我版本。奇怪! :)
    • 嘿,然后可能是 BSD 派生的 sed,尽管他们可能得到了 Unix 许可版本。谢谢!
    【解决方案2】:

    尝试通过将多个对grep 和sed 的调用替换为一个awk 来减少管道数量:

    tail -f /var/log/system.log | awk -F'=' '/query=/ { sub(/^"/, "", $NF); sub(/."$/, "", $NF); print $NF }'
    

    ...获取与“query=”匹配的每一行,并抓取最后一个“=”之后的所有内容,替换第一个“”和结尾的“。”,并打印结果。

    【讨论】:

    • 哇,干净多了。这也有效。但我已经找到了同样有效的答案。
    • 如果 StackOverflow 有某种机制来表明答案是有用的......
    【解决方案3】:

    试试 tail -f 和 grep 参数 --line-buffered

    【讨论】:

    • > tail -f /var/log/system.log | grep "query=" 工作正常,但使用 sed 仅提取 url 时遇到问题。也试过 tail -f /var/log/system.log | grep --line-buffered“查询=”。结果相同
    • 您的示例行确实为我使用了当前 sed 表达式的 www.yahoo.com。如果www.yahoo.com 不是,你会添加预期的输出吗?
    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 2013-03-13
    • 2020-09-13
    • 2011-07-19
    • 2011-11-04
    • 2021-05-01
    • 2017-06-18
    • 2016-01-15
    相关资源
    最近更新 更多