【问题标题】:Grep a string in Linux在 Linux 中grep一个字符串
【发布时间】:2018-05-18 12:28:02
【问题描述】:

我有一个记录如下字符串的日志文件:(1512424528.554:0:1880:1880)。我只需要找出最后一个值超过 1000 的行并打印它们。想法?

【问题讨论】:

  • 改用awk

标签: linux bash grep


【解决方案1】:

Grep 并不是完成这项任务的最实用的工具。正如@WilliamPursell 建议的那样,使用 awk 或其他工具来解决这个问题。

解决方案

使用 grep:您可以通过在最后一个冒号(.*:)之间查找以数字 1 到 9 ([1-9][0-9]{3,}) 开头的至少 4 个数字来匹配所有内容直到最后一个冒号)和行尾($)使用 perl-regexp(-P 标志)。此解决方案并不完美,因为它为您提供大于或等于 1000 的结果。

grep -P '.*:[1-9][0-9]{3,}$' your_file

使用awk:在将字段分隔符设置为-F后,您可以简单地将最后一个字段($NF)与1000进行比较。

awk -F':' '$NF > 1000 { print $0 }' your_file

使用 perl:您可以查找最后一个冒号和行尾之间的最后一个数字,并将这些数字 (\d+) 捕获到与 1000 进行比较的 $1 中。

perl -ne 'print if (/.*:(\d+)$/ and  $1>1000)' your_file

更新

基于@vaettchen 的 cmets,我添加了解决方案,如果括号是记录字符串的一部分,则考虑括号。

grep

grep -P '.*:[1-9][0-9]{3,}\)$' your_file 

awk

awk -F':' 'substr($NF, 0, length($NF)-1)*1 > 1000' your_file

perl

perl -ne 'print if (/.*:(\d+)\)$/ and  $1>1000)' your_file

【讨论】:

  • OP 没有明确说明括号是否是字符串的一部分。如果是,则上述解决方案均无效。对于awk 不需要声明,只需awk -F':' '$NF > 1000 ' your_file 就可以了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多