Linux Shell脚本帮助需要从两个单词之间解析日志文件中的数据

时间:2014-04-01 15:14:30

标签: linux sed awk

您好我正在寻找解析日志文件并获取以下数据并分配给变量并在满足条件时执行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

所以简单的问题是,我怎样才能从满足条件的行中抽出服务名称?

提前谢谢

4 个答案:

答案 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)

使用awkcut(假设您的日志文件的格式始终相同):

 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