【问题标题】:Grab Largest Index From Grep Output In Pattern从模式中的 Grep 输出中获取最大索引
【发布时间】:2016-09-09 21:34:32
【问题描述】:

我的同事今天遇到了一个有趣的问题,grep。 她正在制作一个 bash 脚本,它似乎正在使用 curl 从那里拉网页并使用 grep 拉锚。

她的示例输出如下:

    file-1    
    file-10
    file-2 
    file-20
    file-3
    file-4

这是预期的,因为grep 通过查看第一个数字并将它们按其“顺序”进行排序。

她最终创建了一个 for 循环以从输出中获取最新信息。但这让我很好奇。

在上面的例子中,我将如何获得file-20一行命令

。我试过sortawk。但是无法开始工作:/

【问题讨论】:

  • 为什么 grep 会进行排序?输出应该按照 grep 找到匹配项的顺序。

标签: bash awk grep


【解决方案1】:

你需要:

  • 使用数字排序:-n 标志为sort
  • 按数值列排序:使用-t指定列分隔符,-k指定列
  • tail -n1获取最后一行

像这样:

sort -n -t- -k2 input | tail -n1

【讨论】:

  • 简单且在一行中。也感谢您的解释。
【解决方案2】:

您可以使用sort- 以数字分隔的第二个字段进行排序,并使用head -1 获得第一个:

sort -t'-' -k2,2rn | head -1

示例:

% cat file.txt                        
file-1    
file-10
file-2 
file-20
file-3
file-4

% sort -t'-' -k2,2rn file.txt         
file-20
file-10
file-4
file-3
file-2 
file-1    

% sort -t'-' -k2,2rn file.txt | head -1
file-20

【讨论】:

  • 同一个只是使用了tail,因为它是第一个看到的,不过谢谢!
  • @KyleCalica-St 请注意,区别在于-k 选项的尾随部分,您实际上可以对特定部分使用-n(numeric)、-r(reverse) 等操作,而不是通过使用-k 附加相关选项来完成整行。此外,如果有更多尾随字段会阻塞另一个字段,您应该在使用 -k 时始终提及开始和结束字段。
【解决方案3】:

使用 awk,您可以在 单个命令 中执行此操作:

awk -F- '$2>max{max=$2; s=$0} END{print s}' file

file-20

我们用连字符分隔每一行并检查第二个字段。我们将变量max 保留为运行值以保持最大值,然后我们在$2 中获得更高的值。每次我们设置max 时,我们还将整行存储在变量s 中。在END 部分,我们只打印变量s

【讨论】:

  • 我喜欢这个并且喜欢你解释它谢谢。不得不接受另一个只是因为它更简单,她最终喜欢使用那个。我必须首先自己更了解awk,所以谢谢。
  • simpler 实际上是主观术语。 awk 在单个命令与两个命令(即sort + tail)中执行此操作,如果输入文件很大,那么sort 也会相当慢。
  • 是的,你的权利。我的意思是更简单,因为我学到的第一个命令是 grep、sort 和 tail/head。 awk 是我正在学习的东西,所以我想其他的在心理上是最容易使用的,哈哈。请务必记住,awk 更适合较大的文件!
  • 只是为了澄清区别是不使用排序这将使这种方法更快。
  • 是的,明白了
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多