用sed或grep解析日志

PH.*_*PH. 4 shell grep sed tail

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

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"query ="| sed -e"s /.*query = //"| sed -e"s/\"// g"| sed -e"s /.$/ /"

请建议或加强

sar*_*old 6

我希望你的多个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/.$/ /"
Run Code Online (Sandbox Code Playgroud)

(我没有找到任何类似的选项tail(1),但即使它发送数据块给了别人,使更改grep(1),并sed(1)会极大地帮助.)


Joh*_*web 5

尝试通过更换多个呼叫减少管道的数量grepsed一个用awk:

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

...使每一行匹配"query ="并在最后一个'='之后抓取所有内容,替换第一个'''和尾随'.''并打印结果.