按时间排序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结果的简单方法(反向)?的主要内容,如果未能解决你的问题,请参考以下文章