【发布时间】: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