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

Минимальный пример:

Скажем, у меня был файл foo.txt с содержимым:

bat
dude
rude

И я хотел написать все строки в этом файле, которые содержат букву «а» в bar.txt . Я мог бы написать

cat foo.txt | grep 'a' > bar.txt

Что привело бы к bar.txt содержащему bat . Но это не дало бы мне консольный вывод, который я хочу.

Вместо этого я бы предпочел что-то вроде:

cat foo.txt | output-stdin-to-console-and-pass-to-stdout | grep 'a' > bar.txt

Который не только записал бы bat в bar.txt но также записал бы следующее в консоль:

bat
dude
rude

Есть ли какая-либо команда, которую я могу выполнить, чтобы сделать это?

2 ответа2

0

Вы можете просто использовать это:

cat foo.txt && cat foo.txt | grep 'a' > bar.txt

В противном случае, один вкладыш можно с помощью tee

С https://www.geeksforgeeks.org/tee-command-linux-example/

Команда tee считывает стандартный ввод и записывает его как в стандартный вывод, так и в один или несколько файлов. Команда названа в честь Т-сплиттера, используемого в сантехнике. Это в основном нарушает вывод программы, так что она может быть отображена и сохранена в файле. Он выполняет обе задачи одновременно, копирует результат в указанные файлы или переменные, а также отображает результат.

0

Явные примеры с tee:

  • tee писать на ттй

    < foo.txt tee /dev/tty | grep 'a' > bar.txt
    

    Это портативный, работает в sh .

  • tee запись в процесс подстановки, его стандартный вывод идет на консоль:

    < foo.txt tee >(grep 'a' > bar.txt)
    

    Это не переносимо, работает в Bash и нескольких других оболочках.

Заметьте, я избавился от команды cat (бесполезное использование cat).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .