Как отсортировать имена файлов, показанные в команде grep, по метке времени?

Вопрос или проблема

В следующей команде, как я могу получить имена файлов на основе их временных меток

$ grep "exit 0" a*
a1.txt:+ exit 0
a2.txt:+ exit 0
a3.txt:+ exit 0
a4.txt:+ exit 0
a5.txt:+ exit 0

$ ls -latr 
-rw-r--r-- 1 user grp  83046 27 Окт 06:46 a5.txt
-rw-r--r-- 1 user grp  68108 27 Окт 07:59 a1.txt
-rw-r--r-- 1 user grp 159792 27 Окт 12:35 a2.txt
-rw-r--r-- 1 user grp 225703 27 Окт 16:41 a3.txt
-rw-r--r-- 1 user grp 246782 27 Окт 20:17 a4.txt

Как вы видите из вышеуказанного вывода, я не получаю вывод на основе временной метки создания файла. Есть ли способ это сделать?

Если ни одно из имен файлов не содержит пробелов, табуляций, переносов строк (и $IFS не был изменен), ?, *, [ символов или называется -, это должно сработать:

grep -- "exit 0" $(ls -tr a*)

$() называется подстановка команды. Ваша оболочка сначала выполнит ls -tr, а затем разделит и обработает его вывод, чтобы составить список файлов, передаваемых вашей команде grep.

С оболочкой zsh вы можете влиять на порядок глобов с помощью квалификаторов глобов.

grep 'exit 0' a*(.Om)

Om предназначен для обратного порядка по времени изменения. Я также добавил .⃞, чтобы выбрать только обычные файлы (не каталоги или каналы или устройства или символьные ссылки…).

Если имена файлов могут содержать пробелы / табуляции / переносы строк и доступен ls из GNU coreutils 9+, это способ использовать простую технику Omnipresence:

ls --zero -dtr a* | xargs -r0 grep -- "exit 0"

ls --zero разделяет перечисленные файлы символами NUL, а xargs -0 использует NUL символы для разделения своих аргументов. (Для получения дополнительного контекста вот короткий обзор проблемы пробелов.)

Спасибо, Omni. Даже следующим образом я смог достичь этого. Конечно, ваш способ более простой. Большое спасибо

       grep -H "exit 0" /opt/ctmagent/ctm/sysout_archives/141027/d_dms_btch_alrt_ifm_scp_ksh* | awk -F":" '{system("ls -latr "$1"")}'

Ответ или решение

Для сортировки имен файлов в выводе команды grep на основе временных меток, мы можем использовать несколько различных подходов в зависимости от среды и наличия определенных утилит. Ниже мы рассмотрим несколько методов, которые помогут вам достичь поставленной задачи.

1. Использование командной подстановки

Для начала, если имена файлов не содержат пробелов, табуляций или специальных символов, мы можем воспользоваться командной подстановкой. В этом случае можно использовать команду ls с флагом -tr (сортировка по времени изменения, в обратном порядке) и передать результат ls в команду grep. Вот как это выглядит:

grep "exit 0" $(ls -tr a*)

Здесь $(...) — это синтаксис командной подстановки, который позволяет выполнить команду ls -tr и передать ее вывод как аргументы в команду grep.

2. Использование оболочки Zsh

Если вы используете shell Zsh, здесь можно использовать так называемые "глоб-квалификаторы", чтобы непосредственно указать порядок сортировки. При этом команда может выглядеть так:

grep 'exit 0' a*(.Om)

Здесь O указывает на сортировку, а m — на сортировку по времени изменения (Modification Time). Этот подход также гарантирует, что будут выбраны только обычные файлы.

3. Обработка имен файлов с пробелами

Если имена файлов могут содержать пробелы или другие специальные символы, стоит рассмотреть использование ls с флагом --zero и xargs для обработки имен файлов без ошибок. Вот пример:

ls --zero -dtr a* | xargs -r0 grep -- "exit 0"

Здесь параметр --zero отделяет имена файлов с помощью символа NUL, что позволяет xargs правильно обрабатывать имена файлов, содержащие пробелы.

4. Использование awk в комбинации с ls

Еще один способ — это использование awk после запуска grep, чтобы выполнить ls для сортировки файлов по дате:

grep -H "exit 0" /opt/ctmagent/ctm/sysout_archives/141027/d_dms_btch_alrt_ifm_scp_ksh* | awk -F":" '{system("ls -latr "$1"")}'

Однако этот метод менее эффективен, так как он по сути вызывает ls для каждого упомянутого файла в выводе grep, что может быть не оптимально для большого количества файлов.

Заключение

Существует несколько способов сортировки имен файлов в выводе команды grep по временным меткам. Выбор наиболее подходящего метода зависит от ваших потребностей и используемой оболочки, а также от структуры имен файлов. Каждый из предложенных методов имеет свои достоинства и ограничения, поэтому вы можете выбрать тот, который наиболее удобен для вашей конкретной ситуации.

Оцените материал
Добавить комментарий

Капча загружается...