如果交易花费的时间在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发布于 2021-01-22 00:07:35
使用awk:
awk '{ if (($8*0.001)/60>=2 && ($8*0.001)/60<=3) { print $6" - "FILENAME } }' *.files检查转换为分钟的第8个空格分隔字段是否大于或等于2且小于或等于3,并打印第6个空格分隔字段(事务)以及由awk的内置文件名变量跟踪的文件名。
发布于 2021-01-22 00:11:06
不要使用grep,因为您希望对返回的值进行数学运算。当您说“在2-3分钟之间”时,您实际上是指“ms在120000到239999 ms之间”,而grep不理解数字值。它只理解字符串的模式。有些人会尝试做一些诡计多端的正则表达式来绕过这个问题,但不要被引诱走上悲伤的道路。
只需执行以下操作:
awk '/Time taken to process transaction/ && ($8 >= 120000) && ($8 < 240000) { print "Trx", $6, "took", $8, "ms" }' times.txt这在您的示例中不会打印任何时间,因为您的所有时间都在数值范围之外。
发布于 2021-01-22 00:12:33
使用此Perl一行程序:
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单行程序使用以下命令行标志:
-e:告诉Perl查找内联代码,而不是文件中的代码。
-n:每次循环一行输入,默认情况下将其赋给$_。
-l:在行内执行代码前去掉输入的行分隔符(默认是*NIX上的"\n"),打印时追加。
\d+:任意数字,重复1次或多次。
\s+:任何重复1次或多次的空格字符。
$ARGV:当前输入文件名。
另请参阅:
perldoc perlrun: how to execute the Perl interpreter: command line switches
https://stackoverflow.com/questions/65830979
复制相似问题