Как проверить строку в списке файлов и отобразить последний измененный в Linux - PullRequest
0 голосов
/ 23 ноября 2018

Я ищу определенный шаблон строки (который представляет собой пятизначное число) в списке файлов внутри определенного каталога.

Обратите внимание, что строка не является фиксированной и может бытьлюбая комбинация 5-значного числа.

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

Например: строка "73458"встречается в нескольких файлах, поэтому он должен отображать только последний измененный файл.

Я могу только grep строки, не знаю, как поступить с этим.

grep -l "<BILL_UID>[0-9][0-9][0-9][0-9][0-9]</BILL_UID>" *_MOVE

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Перейдите файлы от самого нового к самому старому, верните первое совпадение.

stat --format '%y %n' *_MOVE |
sort -r |
cut -c37- |
xargs grep -l '<BILL_UID>[0-9][0-9][0-9][0-9][0-9]</BILL_UID>' |
head -n 1

Вызов stat не является переносимым, но в моем Linux он выдает строки типа

2016-10-05 15:20:02.000000000 +0300 1onefile
2018-08-07 12:43:24.000000000 +0300 2another

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

(Это не удастся, если имя файла содержит символ новой строки.обходные пути, но если вам действительно не нужно справляться с этой сложностью, давайте просто упомянем об этом.)

Весь конвейер завершается при выходе из head, поэтому во избежание ненужного сканирования старых файлов (хотя некоторые дополнительные файлы реально будут иметь место)параллельно сканировался при остановке трубопровода).

0 голосов
/ 23 ноября 2018

Как-то так должно работать:

grep -l "<BILL_UID>[0-9][0-9][0-9][0-9][0-9]</BILL_UID>" *_MOVE |
xargs -i ls -l --time-style=long-iso "{}" |
sort -k6,7 | tail -n 1

Редактировать: ОК, я думаю, что начинаю понимать, но без правильных выборочных данных мне трудно работать с информацией;это больше похоже на то, что вы ожидали?

grep -o "<BILL_UID>[0-9][0-9][0-9][0-9][0-9]</BILL_UID>" *_MOVE |
sort -u |
while read string ;do
    grep -l $string |
    xargs -i ls -l --time-style=long-iso "{}" |
    sort -k6,7 |
    tail -n 1
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...