您好我正在寻找解析日志文件并获取以下数据并分配给变量并在满足条件时执行if语句:
以下是日志文件的输入:
host123.src_dist.serviceGenerator.srcPrdServicePool.1234_REC.dataStreams.activeStale:0
host123.src_dist.serviceGenerator.srcPrdServicePool.YYY_CONTROL.dataStreams.activeStale: 5
host123.src_dist.serviceGenerator.srcPrdServicePool.TPSG.dataStreams.activeStale: 0
host123.src_dist.serviceGenerator.srcPrdServicePool.LDN_ABC.dataStreams.activeStale: 10
host123.src_dist.serviceGenerator.srcPrdServicePool.SSS_BOR.dataStreams.activeStale: 0
逻辑
if activeStale is > 0
then
echo YYY_CONTROL >> filenamex
echo LDN_ABC >> filenamexz
endif
生成的文件为cat filenamex
YYY_CONTROL
LDN_ABC
我可以执行if部分但不确定如何从该行中取出服务名称YYY_CONTROL? srcPrdServicePool.YYY_CONTROL.dataStreams
所以简单的问题是,我怎样才能从满足条件的行中抽出服务名称?
提前谢谢
答案 0 :(得分:3)
从您的问题来看,您可能希望将它们打印到同一个文件中(请注意,在您的伪代码中并非如此)。我会用awk:
awk -F':' '$2 > 0 { split($1, a, "."); print a[5]}' file
这会在冒号大于0
后测试值,如果是,则打印您感兴趣的部分。
bash-4.2$ awk -F':' '$2 > 0 { split($1, a, "."); print a[5]}' file
YYY_CONTROL
LDN_ABC
答案 1 :(得分:2)
以下是GNU awk
的另一种方式:
awk -F: '$2>0 && match($0,/Pool[.]([^.]+)[.]dataStreams/,ary) && $0=ary[1]' file
$ awk -F: '$2>0 && match($0,/Pool[.]([^.]+)[.]dataStreams/,ary) && $0=ary[1]' file
YYY_CONTROL
LDN_ABC
答案 2 :(得分:1)
使用awk
和cut
(假设您的日志文件的格式始终相同):
awk -F: '$NF>0' my_file.log | cut -d. -f5 > filenamex
awk
查看最后一个冒号后面的所有内容,如果它大于0则打印该行。 cut
使用.
作为分隔符将行拆分为字段,然后查看第5个字段,这是您想要的值。
答案 3 :(得分:0)
您也可以通过设置FS
进行隐式拆分来执行此操作,例如:
awk '$2>0 { FS="."; $0=$0; print $5; FS=":" }' FS=: file
输出:
YYY_CONTROL
LDN_ABC