![ack/grep 搜索并按修改日期排序](https://linux22.com/image/57355/ack%2Fgrep%20%E6%90%9C%E7%B4%A2%E5%B9%B6%E6%8C%89%E4%BF%AE%E6%94%B9%E6%97%A5%E6%9C%9F%E6%8E%92%E5%BA%8F.png)
有什么办法可以拥有ack
按修改日期对找到的结果进行排序? (最好在结果旁边显示日期?)。它看起来没有ack
日期选项,但以防万一。
如果使用 不可能做到这一点,那么使用工具组合ack
怎么样?grep
答案1
没有ack
或grep
没有任何文件修改日期的概念。为此,您需要首先生成文件列表,然后根据情况对它们进行排序。
您可以使用将或xargs
的输出运行到另一个命令中,该命令将提供修改日期。对于修改日期,您可以使用它来执行此操作。ack
grep
stat
例子
$ grep -Rl awk * | xargs -n 1 stat --printf "%y ------ %n\n"
2013-11-12 10:06:16.000000000 -0500 ------ 100855/tst_ccmds.bash
2013-11-13 00:32:11.000000000 -0500 ------ 100911/cmd.bash
2013-11-23 03:16:17.000000000 -0500 ------ 102298/cmd.bash
2013-12-14 20:06:04.467708173 -0500 ------ 105159/cmd.txt
2013-12-16 03:20:48.166016538 -0500 ------ 105328/cmds.txt
2013-01-14 14:17:39.000000000 -0500 ------ 106932/red5-1.0.1.tar.gz
笔记:此方法只会显示与您的查询匹配的文件的名称以及修改日期。
答案2
使用 GNU 工具:
grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
或者,
ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
这用于将文件名与通常的输出awk
分开,并调用检索文件日期。 提供了一个选项来确保文件名显示在输出上,即使命令行上只出现一个文件名。grep
awk
date
grep
-H
作为输出的示例:
$ grep setupcon /etc/init.d/* | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
2011-12-05 12:05 /etc/init.d/keymap.sh:# If setupcon is present, then we've been superseded by console-setup.
2011-12-05 12:05 /etc/init.d/keymap.sh:if type setupcon >/dev/null 2>&1; then
2011-12-08 18:00 /etc/init.d/console-setup: if setupcon --save; then
2011-12-08 18:00 /etc/init.d/console-setup:test -f /bin/setupcon || exit 0
2012-04-28 02:41 /etc/init.d/kbd:if which setupcon >/dev/null
2012-09-30 18:02 /etc/init.d/keyboard-setup: if setupcon -k 2>/dev/null; then
2012-09-30 18:02 /etc/init.d/keyboard-setup:test -f /bin/setupcon || exit 0
awk
命令解释
-F:
这会将字段分隔符设置为,
:
以便第一个字段是文件名。 (我们必须希望文件名本身不包含冒号。)"date -r \""$1"\" +\"%F %R\"" | getline d
运行此命令
date -r filename +"%F %R"
以适合排序的形式获取文件的修改日期。日期存储在变量中d
。print d,$0
这将打印数据,后跟 的输出行
grep
。