awk打印字符串的第n个实例

awk打印字符串的第n个实例,awk,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 datab

我有一个相当大的.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

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

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
,因为它自己工作并返回正确的值


为清楚起见,此处所需的输出为
494429.2004048582996 mongodb

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

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

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

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

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=1;t=$NF} /AverageLatency/ && f {print t,$NF,db;exit}' file
494 429.2004048582996 mongodb
当找到第二个
操作时,获取其数据并设置标志
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
总是在
操作之后出现,只需抓取下一行即可

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
这应该做到:

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=1;t=$NF} /AverageLatency/ && f {print t,$NF,db;exit}' file
494 429.2004048582996 mongodb
当找到第二个
操作时,获取其数据并设置标志
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
总是在
操作之后出现,只需抓取下一行即可

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
工作完美。我使用的脚本在匹配了我想要的字符串之后仍在继续查看整个文件


工作完美。我使用的脚本在匹配了我想要的字符串之后仍在继续查看整个文件。

它一直在读取文件直到结束,每次找到
AverageLatency
时都进行匹配,因此它会打印上次的值。要明白我的意思,请执行
/AverageLatency/{I=$3;exit}END{…
好运气!awk-F'[,=]|://'/'/^Command/{db=$2}/AverageLatency/{I++}I==2{I=$3;exit}/Operations/{t=$3}END{print ti,db}'效果很好。请在48小时后自由发布您自己的答案并接受15分的奖励。欢迎来到S.O.祝您好运。要获得第二次点击,请执行:
awk'/AverageLatency/&&++i==2'文件
它会一直读取文件直到结束,每次找到
AverageLatency
时都会匹配,因此它会打印l中的值最后一次。要了解我的意思,请执行
/AverageLatency/{I=$3;exit}END{…
好运气!awk-F'[,=]|://'/'/^Command/{db=$2}/AverageLatency/{I++}I==2{I=$3;exit}/Operations/{t=$3}END{print ti,db}'效果非常好。请在48小时后发布您自己的答案并接受15分的奖励。欢迎来到S.O.祝您好运。若要获得第二次点击,请执行:
awk'/AverageLatency/&++i==2'文件