ack/grep 搜索并按修改日期排序

ack/grep 搜索并按修改日期排序

有什么办法可以拥有ack按修改日期对找到的结果进行排序? (最好在结果旁边显示日期?)。它看起来没有ack日期选项,但以防万一。

如果使用 不可能做到这一点,那么使用工具组合ack怎么样?grep

答案1

没有ackgrep没有任何文件修改日期的概念。为此,您需要首先生成文件列表,然后根据情况对它们进行排序。

您可以使用将或xargs的输出运行到另一个命令中,该命令将提供修改日期。对于修改日期,您可以使用它来执行此操作。ackgrepstat

例子

$ 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分开,并调用检索文件日期。 提供了一个选项来确保文件名显示在输出上,即使命令行上只出现一个文件名。grepawkdategrep-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

相关内容