【问题标题】:Oneline file-monitoring在线文件监控
【发布时间】:2015-05-12 15:52:56
【问题描述】:

我有一个日志文件不断填充内容。

我希望监控此文件,grep 查找特定行,然后在 curl 命令中提取并使用该行的部分内容。

我看了How to grep and execute a command (for every match)

这可以在脚本中工作,但我想知道是否可以使用下面的 oneliner 使用 xargs 或其他东西来实现这一点?

示例:

Tue May 01|23:59:11.012|I|22|Event to process : [imsi=242010800195809, eventId = 242010800195809112112, msisdn=4798818181, inbound=false, homeMCC=242, homeMNC=01, visitedMCC=238, visitedMNC=01, timestamp=Tue May 12 11:21:12 CEST 2015,hlr=null,vlr=4540150021, msc=4540150021 eventtype=S, currentMCC=null, currentMNC=null teleSvcInfo=null camelPhases=null serviceKey=null gprsenabled= false APNlist: null SGSN: null]|com.uws.wsms2.EventProcessor|processEvent|139

提取我想要的字段并用分号分隔它们:

tail -f file.log | grep "Event to process" | awk -F'=' '{print $2";"$4";"$12}' | tr -cd '[[:digit:].\n.;]'

卷曲命令,例如类似:

http://user:pass@www.some-url.com/services/myservice?msisdn=...&imsi=...&vlr=...

谢谢!

【问题讨论】:

  • 请参阅mywiki.wooledge.org/BashFAQ/001,了解如何逐行和逐字段读取值。然后在循环中使用它们来做你想做的事情。
  • 清理:用一个命令替换从grep 开始的所有内容:awk -F'=' '/Event to process/{$0=$2";"$4";"$12; gsub(/[^[:digit:].;]/,""); print}'。我从tr 中删除了\n 和第二个.,因为它们什么都不做。
  • 我离开了 grep 等,因为上面的解决方案在 Linux 中运行良好,但不适用于 Solaris。我相信这只是引号,但我又没有尝试..完整的答案是:tail -f file.log | grep "Event to process" | awk -F'=' '{print $2";"$4";"$12}' | tr -cd '[[:digit:].\n.;]' | while IFS=";" read -r imsi msisdn vlr; do echo "IMSI is: $imsi"; echo "MSISDN is: $msisdn"; echo "VLR is: $vlr"; done

标签: bash curl awk


【解决方案1】:

试试这个:

tail -f file.log | grep "Event to process" | awk -F'=' '{print $2" "$4" "$12; }' | tr -cd '[[:digit:].\n. ]' |while read msisdn imsi vlr ; do curl "http://user:pass@www.some-url.com/services/myservice?msisdn=$msisdn&imsi=$imsi&vlr=$vlr" ; done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多