Вопрос или проблема
Я запускаю приложение и перенаправляю вывод в grep
. Это работает. Однако я хочу показать вывод на экране и записать в файл.
Поэтому я перенаправляю результат grep
в tee
:
./app | grep что-то | tee file.txt
Однако это не показывает (или не записывает) результаты, даже когда есть 100% результатов (я подтвердил это с двумя запущенными экземплярами).
Как мне сделать так, чтобы вывод приложения фильтровался с помощью grep, записывался в файл и отображался на экране?
Команда, как вы ее написали, должна работать. Может быть несколько причин неправильной работы команды.
- Приложение отправляет текстовый вывод не на стандартный выход.
- Строка символов для поиска с помощью команды grep введена неверно.
Решение случая #1
- Проверьте вручную, что приложение отправляет желаемый текст на выход, который нужно искать.
./app
- Перенаправьте текст вывода в файл
./app > file.txt
и проверьте содержимое файла:cat file.txt
- Если файл не содержит желаемый текст, вероятно, приложение отправляет вывод в выход с ошибками, а не на стандартный выход. Попробуйте перенаправить в файл другим способом
./app 2 > file.txt
и снова проверьте содержимое файла:cat file.txt
- Если содержимое файла на этот раз правильное, решение простое. Вам нужно только перенаправить вывод ошибок в стандартный выход.
./app 2>&1 | grep "что-то" | tee file.txt
Решение случая #2
- Тщательно проверьте строку символов, которую вы используете в качестве шаблона поиска. Заключите ее в кавычки или апострофы, чтобы исключить случайные неверные интерпретации символов подстановки, переменных $variablename, регулярных выражений и т. д.
- Начните с тестирования поиска с помощью grep для очень простых строк, состоящих только из букв или цифр, которые невозможно неверно интерпретировать.
Команда ./app 2>&1 | grep "что-то"
работает хорошо
Ответ или решение
Для решения вашей задачи по перехвату вывода приложения, фильтрации его с помощью grep
и одновременно отображению результата на экране и записи в файл, вы на правильном пути, используя команду tee
. Однако, давайте рассмотрим возможные причины, по которым ваша текущая команда может не работать, и предложим пошаговое решение.
Возможные проблемы и их решения
Проблема 1: Приложение использует нестандартный вывод
-
Проверка вывода приложения:
Первым шагом мы проверим, выводит ли ваше приложение данные через стандартный вывод. Запустите команду:./app
Это покажет, что на самом деле выводит ваша программа.
-
Проверка содержимого файла:
Если стандартный вывод не показывает ожидаемой информации, попробуйте перенаправить его в файл:./app > file.txt
После этого посмотрите содержимое файла:
cat file.txt
Если в файле нет ожидаемых данных, возможно, приложение выводит информацию в стандартный поток ошибок.
-
Перенаправление потока ошибок:
Если вывод действительно находится в стандартном потоке ошибок, попробуйте перенаправить его в файл следующим образом:./app 2> file.txt
Снова проверьте содержимое файла:
cat file.txt
-
Объединение потоков:
Если предыдущие шаги показали, что данные находятся в стандартном потоке ошибок, необходимо объединить потоки для дальнейшей обработки с помощьюgrep
иtee
. Используйте следующую команду:./app 2>&1 | grep "something" | tee file.txt
Проблема 2: Ошибка в шаблоне поиска
-
Проверка строки поиска:
Убедитесь, что строка, которую вы ищете с помощьюgrep
, написана правильно. Поместите ее в кавычки, чтобы избежать неправильной интерпретации:grep "something"
-
Тестирование с простыми строками:
Попробуйте сначала протестироватьgrep
на простом шаблоне, состоящем только из букв или цифр:./app | grep "простой текст"
Полная команда для выполнения
На основании вышесказанного, ваша окончательная команда будет выглядеть так:
./app 2>&1 | grep "something" | tee file.txt
Заключение
Следуя данным рекомендациям, вы сможете повторно протестировать вывод вашей программы, выполнять поиск в нем с помощью grep
, и при этом видеть результаты на экране, а также записывать их в файл. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их, и мы постараемся помочь вам.