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

Jos*_*osh 8 grep files ack

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

如果使用 无法做到这一点ack,那么如何grep或使用工具组合?

slm*_*slm 8

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

您可以使用xargs运行其中一个ackgrep另一个命令的输出,该命令将提供修改日期。对于您可以使用的修改日期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
Run Code Online (Sandbox Code Playgroud)

注意:此方法只会向您显示与您的查询匹配的文件的名称以及修改日期。


Joh*_*024 5

使用 GNU 工具:

grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Run Code Online (Sandbox Code Playgroud)

或者,

ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Run Code Online (Sandbox Code Playgroud)

这用于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
Run Code Online (Sandbox Code Playgroud)

awk命令说明

  • -F:

    这将字段分隔符设置为:第一个字段是文件名。(我们必须希望文件名本身不包含冒号。)

  • "date -r \""$1"\" +\"%F %R\"" | getline d

    这运行date -r filename +"%F %R"以适合排序的形式获取文件的修改日期。日期存储在变量中d

  • print d,$0

    这将打印数据,然后是来自grep.