Использование tee для передачи вывода ls и grep в команду tail без скрипта

У меня проблема с запуском файлов журнала.

Я ищу использовать ls создать список файлов в каталоге журнала и grep запустить для конкретных случаев / раз, когда файл запускался. Я хочу иметь только последнюю строку каждого файла, поэтому я хочу tail -1 команда для запуска из списка файлов grep предоставлена.

Я пробовал несколько комбинаций кода, с которыми столкнулся, но пока мне не повезло; на данный момент это стало больше любопытством, чем полезным из-за количества времени, которое я потратил на это. Ниже приведено несколько примеров попыток:

ls | grep 2011_.._.._.._35_.* | tee >(tail -1)
ls | tee >(grep 2011_.._.._.._35_.*) | tail -1

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

1 ответ

REVISED!

Я перечитал, что вы хотите только последнюю строку каждого файла журнала...

Команда, которая вам нужна xargs не tee:

 ls | grep '2011_.._.._.._35_.*' | xargs -n 1 -- tail -1

или же

 ls -1 2011_??_??_??_35_* | xargs -n 1 -- tail -1

Это вызывает команду tail -1 для каждого файла, который передает grep команда (1-й случай) или найденная командой ls (2-й случай). Обратите внимание, что это не будет работать, если файл содержит пробелы или перевод строки. Если вам нужен ответ для этого случая, добавьте комментарий.

РЕДАКТИРОВАТЬ Для вашего комментария:

ls -1 2011_??_??_??_35_* | xargs -n 1 -I FILE -- sh -c 'echo ; echo "FILE"; tail -1 "FILE"'

Немного сложнее, но также обрабатывает файлы с пробелами в имени.

каждый "FILE" в последовательности команд echo ; echo "FILE"; tail -1 "FILE" будет заменен строкой, которая ls выходы. Эта последовательность команд будет передана в оболочку и затем выполнена.

Другие вопросы по тегам