awk打印第n个字符串实例

时间:2015-04-08 00:46:57

标签: awk

我有一个相当大的.dat文件,我想使用awk脚本来打印第二次出现的字符串。 .dat文件:

YCSB Client 0.1
Command line: -db com.yahoo.ycsb.db.MongoDbClient -s -P /home/james/YCSB/workloads/workloada -p mongodb.url=mongodb://192.168.0.8:27017 -p mongodb.database=ycsb -p recordcount=105 -t
new database url = 192.168.0.8:27017/ycsb
mongo connection created with 192.168.0.8:27017/ycsb
[OVERALL], RunTime(ms), 1086.0
[OVERALL], Throughput(ops/sec), 920.8103130755064
[UPDATE], Operations, 506
[UPDATE], AverageLatency(us), 988.4288537549407
[UPDATE], MinLatency(us), 410
[UPDATE], MaxLatency(us), 43786
[UPDATE], 95thPercentileLatency(ms), 2
[UPDATE], 99thPercentileLatency(ms), 6
[UPDATE], Return=1, 506
[UPDATE], 0, 432
[UPDATE], 1, 40
[UPDATE], 2, 9
[UPDATE], 3, 9
[UPDATE], 4, 4
[UPDATE], 5, 6

...

[UPDATE], 997, 0
[UPDATE], 998, 0
[UPDATE], 999, 0
[UPDATE], >1000, 0
[READ], Operations, 494
[READ], AverageLatency(us), 429.2004048582996
[READ], MinLatency(us), 177
[READ], MaxLatency(us), 9428
[READ], 95thPercentileLatency(ms), 1
[READ], 99thPercentileLatency(ms), 5
[READ], Return=1, 494
[READ], 0, 460
[READ], 1, 16
[READ], 2, 6
[READ], 3, 3
[READ], 4, 4

...

[READ], 995, 0
[READ], 996, 0
[READ], 997, 0
[READ], 998, 0
[READ], 999, 0
[READ], >1000, 0
[CLEANUP], Operations, 1
[CLEANUP], AverageLatency(us), 1397.0
[CLEANUP], MinLatency(us), 1397
[CLEANUP], MaxLatency(us), 1397
[CLEANUP], 95thPercentileLatency(ms), 1
[CLEANUP], 99thPercentileLatency(ms), 1

我一直在使用此命令尝试打印第二次出现的AverageLatencyOperations

awk -F'[,=]|://' '/^Command/{db=$2}/AverageLatency/{i=$3}/Operations/{t=$3}END{print t i,db}'

但是它似乎是从文件底部或第三次出现返回值:

1 1397.0 mongodb

我使用awk相对较新,但似乎它从文件底部开始向上工作?

我尝试在命令中使用awk /AverageLatency/{i++}i==2,因为它可以自行运行并返回正确的值。

为了清楚起见,此处所需的输出为494 429.2004048582996 mongodb

3 个答案:

答案 0 :(得分:2)

awk -F'[,=]|://' '/^Command/{db=$2}/AverageLatency/{i++}i==2{i=$3;exit}/Operations/{t=$3}END{prin‌​t t i,db}'

完美无缺。我使用的脚本继续查看整个文件,即使它匹配了我想要的字符串。

答案 1 :(得分:1)

使用if语句和计数器。 END {}块在处理所有输入结束时运行。因此它只会打印出与您的实现相匹配的最后一个值。

awk -F'[,=]|://' 'BEGIN{i=0} /^Command/{db=$2}/AverageLatency/{if(2 == ++i){ print t $3,db; exit; } }/Operations/{t=$3}'

答案 2 :(得分:1)

这应该做:

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=1;t=$NF} /AverageLatency/ && f {print t,$NF,db;exit}' file
494 429.2004048582996 mongodb

当找到第二个Operations时,获取其数据并设置标记f
如果标记f为真且AverageLatency打印数据

如果要查找的模式顺序不知道,并且您只想从中获取第二个数据:

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=1;t=$NF} /AverageLatency/ && ++j==2 {a=$NF} END {print t,a,db}' file
494 429.2004048582996 mongodb

如果AverageLatency总是在Operations之后,请抓住下一行。

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=NR;t=$NF} NR==f+1 && f {print t,$NF,db;exit}' file
494 429.2004048582996 mongodb

或者你可以使用getline但要小心。

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {t=$NF;getline;print t,$NF,db;exit}' file
494 429.2004048582996 mongodb