ack/grep поиск и сортировка по дате изменения

ack/grep поиск и сортировка по дате изменения

Есть ли способ иметь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.

Связанный контент