首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grep作为条件,并在字符串中打印另一个值

grep作为条件,并在字符串中打印另一个值
EN

Stack Overflow用户
提问于 2021-01-21 23:51:32
回答 3查看 32关注 0票数 1

如果交易花费的时间在2-3分钟之间,我该如何grep并打印以下行中“transaction”一词后面的交易编号?以下时间以毫秒为单位。如果我可以打印匹配的文件名,将会有额外的帮助。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2021-01-22 00:07:35

使用awk:

代码语言:javascript
复制
awk '{ if (($8*0.001)/60>=2 && ($8*0.001)/60<=3) { print $6" - "FILENAME } }' *.files

检查转换为分钟的第8个空格分隔字段是否大于或等于2且小于或等于3,并打印第6个空格分隔字段(事务)以及由awk的内置文件名变量跟踪的文件名。

票数 1
EN

Stack Overflow用户

发布于 2021-01-22 00:11:06

不要使用grep,因为您希望对返回的值进行数学运算。当您说“在2-3分钟之间”时,您实际上是指“ms在120000到239999 ms之间”,而grep不理解数字值。它只理解字符串的模式。有些人会尝试做一些诡计多端的正则表达式来绕过这个问题,但不要被引诱走上悲伤的道路。

只需执行以下操作:

代码语言:javascript
复制
 awk '/Time taken to process transaction/ && ($8 >= 120000) && ($8 < 240000) { print "Trx", $6, "took", $8, "ms" }' times.txt

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-22 00:12:33

使用此Perl一行程序:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65830979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档