无论是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
Run Code Online (Sandbox Code Playgroud)
注意:此方法只会向您显示与您的查询匹配的文件的名称以及修改日期。
使用 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.