Unix grep条件并在字符串中打印另一个值

Unix grep条件并在字符串中打印另一个值,unix,grep,Unix,Grep,在交易所需时间在2-3分钟之间的情况下,如何grep和打印以下行中“transaction”一词后面的交易编号?以下时间以毫秒为单位。如果我能把文件名和匹配项一起打印出来,会有帮助的 Time taken to process transaction 2599500398 is 1000 ms Time taken to process transaction 2599500398 is 450640 ms Time taken to process transaction 2599500398

在交易所需时间在2-3分钟之间的情况下,如何grep和打印以下行中“transaction”一词后面的交易编号?以下时间以毫秒为单位。如果我能把文件名和匹配项一起打印出来,会有帮助的

Time taken to process transaction 2599500398 is 1000 ms
Time taken to process transaction 2599500398 is 450640 ms
Time taken to process transaction 2599500398 is 638244 ms
使用awk:

awk '{ if (($8*0.001)/60>=2 && ($8*0.001)/60<=3) { print $6" - "FILENAME } }' *.files

awk'{if(($8*0.001)/60>=2&&($8*0.001)/60不要使用grep,因为你想计算你得到的值。当你说“2-3分钟”时,你的意思是“ms在120000到23999ms之间”,而grep不懂数值。它只懂字符串的模式。有些人会试图用诡计多端的正则表达式来解决这个问题,但不要被引诱走上悲伤的道路

只要这样做:

 awk '/Time taken to process transaction/ && ($8 >= 120000) && ($8 < 240000) { print "Trx", $6, "took", $8, "ms" }' times.txt
awk'/处理事务所用的时间/&&($8>=120000)和($8<240000){print“Trx”、$6,“take”、$8,“ms”}times.txt

在您的示例中不会打印任何内容,因为您的所有时间都在数值范围之外。

请使用以下Perl one liner:

perl -lne 'my ( $tid, $time ) = /transaction\s+(\d+)\s+is\s+(\d+)\s+ms/; 2000 <= $time and $time <= 3000 and print "$ARGV: $tid";' in_file(s)
perl-lne'my($tid,$time)=/transaction\s+(\d+)\s+is\s+(\d+)\s+ms/;2000