按时间排序grep结果的简单方法(反向)?

Posted

技术标签:

【中文标题】按时间排序grep结果的简单方法(反向)?【英文标题】:Simple way to order grep's result by time (reverse)? 【发布时间】:2016-10-30 09:33:56 【问题描述】:

我经常需要使用 grep 在大量日志文件中查找特定字符串。我得到了很多结果,我必须滚动很多。

今天grep的结果按字母顺序列出。我想让我的 grep 结果按时间倒序,就像 ls -ltr 会做的那样。

我知道我可以逐个文件获取ls -ltr 和 grep 的结果。我是这样做的:

 ls -ltr $my_log_dir\* | awk 'print $9' |xargs grep $my_pattern

但我想知道:有没有更简单的方法?

PS:我在AIX 上使用ksh

【问题讨论】:

@fedorqui,添加了我实际的 complex 方法。好的,这已经很简单了 嗯,这很难。解析 ls 不是一个好主意。但是,我想到的替代方法是使用find 打印日期时间,然后执行grep 并删除日期时间部分。有点丑。 @fedorqui,如果我只使用ls -tr,我不需要解析,但| xargs 是否得到所有有序的结果? 当你使用awk 'print $9' 时你会解析。是的,这应该有效。使用grep -H 获取文件名。 【参考方案1】:

我找到的解决方案(感谢 Fedorqui)是简单地使用 ls -tr。它假设结果以正确的顺序通过| 传递到xargs 允许然后执行grep

我的误解是,当我使用ls 时,结果不是作为单列列表而是作为多列列表到达的,它不能作为xargs 的输入。

这是迄今为止最简单的解决方案,因为它避免了任何awk 解析:

ls -tr $my_log_dir\* | xargs grep $my_pattern

我检查了,ls -t 的每个结果都传递给xargs,即使它们看起来不像我预期的那样它们会很容易进入:

srv:/papi/tata $ ls -t
addl      ieet      rrri     
ooij      lllr      sss      
srv:/papi/tata $ ls -t |xargs -I echo 
addl 
ieet  
rrri     
ooij  
lllr  
sss

【讨论】:

【参考方案2】:

这也可以使用find 命令:-

find -type f -print0 | xargs -r0 stat -c %y\ %n | sort -r | awk 'print $4' | sed "s|^\./||"
-print0 in find 以保留具有特殊字符(空格、制表符)的文件 打印文件状态(stat%y(上次修改时间)和 %n(%n 文件名),输出具有新分隔符 (-c) 对上一个命令的输出进行反向排序。 (-r 反向) awk 'print $4' 仅打印文件名(可根据需要进行优化) 从文件名中删除前导 ./

【讨论】:

嗨,Inian,感谢您的帮助。它告诉我:find: 0652-017 -print0 is not a valid option.。你在什么外壳/操作系统上?我是:ksh / AIX find (GNU findutils) 4.4.2 上运行良好。假设您的文件上没有特殊字符或空格,您也可以尝试 find -type f -print | xargs -r stat -c %y\ %n | sort -r | awk 'print $4' | sed "s|^\./||" ,这基本上是删除 -print0 标志 抱歉,我无法在我的电脑上查看。

以上是关于按时间排序grep结果的简单方法(反向)?的主要内容,如果未能解决你的问题,请参考以下文章

如何按字母顺序对字符串字符进行排序?

上传和排序大型数据集(400GB+)的最简单/非技术友好的方法是啥?

对三个数字进行排序的更简单方法

centos 下 ls grep head cut简单用法

按字母顺序获取地图中的键的简单方法

按对象方法的结果对 NSArray 进行排序