1

Как перенаправить весь вывод std из bash в команду типа 'grep' или 'sed', чтобы отфильтровать вывод и затем записать его в файл?

Это то, что я хочу в принципе: exec > >(cat | cat >>/tmp/myoutput.txt) . Последняя команда работает как положено. Но если я заменю первого cat на grep -v 'foo' или на sed 's/foo/bar/g' данные не будут записаны в файл.

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

Справочная информация: я хотел бы отфильтровать сообщения об ошибках из .xsession-errors. sed -i 's/foo/bar/g' .xsession-errors не работает, потому что sed заменяет файл .xsession-errors и будущие выходные данные программ не видны. Таким образом, один из вариантов - заменить строку в /etc /X11 /Xsession кодом, фильтрующим сообщения.

Больше информации здесь:

  • Я использовал cat 2 раза, чтобы показать, что каналы работают в подоболочке, как ожидалось, и перенаправить все в файл. cat конечно, не нужна в финальной версии.
  • Думаю, у меня было достаточно вывода для заполнения буферов, потому что я несколько раз делал ls /usr/ для заполнения буферов.)
  • exec | sed ... не работает

1 ответ1

0

Пример:

  1. открыть баш
  2. вызовите команду exec > >(cat | cat >>/tmp/myoutput.txt)
  3. вызвать другую команду, например. `ls -R /usr '
  4. конец Баш с exit
  5. загляните в файл /tmp/myoutput.txt, вы увидите вывод команды ls
  6. если вы поменяете команду из шага с этим exec > >(sed 's/usr/--HEREAMI--/g' >/tmp/myoutput2.txt)

Это работает .. в конце
Так что, похоже, это действительно проблема с заполнением буферов. Несколько ls /usr недостаточно, но ls -R /usr заполняет буфер. Так что теперь мне нужно выяснить, как предотвратить буферизацию.

(Спасибо за комментарий и запрос примера, это принесло решение.)

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