Виведіть у stdout і в той же час прив'яжіть до файлу


18

У мене є сценарій, який видає текст stdout. Я хочу бачити весь цей вихід у своєму терміналі, і в той же час я хочу відфільтрувати деякі рядки і зберегти їх у файл. Приклад:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

Я хочу побачити вихід першої команди в терміналі і зберегти висновок другої команди у файлі. В той самий час. Я спробував використовувати tee, але без результату, а ще краще, із зворотним результатом .

Відповіді:


27

Я хочу побачити вихід першої команди в терміналі і зберегти висновок другої команди у файлі.

Поки вам не байдуже, те, що ви дивитесь, з stdout або stderr , ви все одно можете використовувати tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

Працюватиме на Linux; Я не знаю, чи "/ dev / stderr" однаково застосовна для інших * nixes.


9
/dev/stderrє загальним. /dev/tty(мається на увазі поточний термінал) також працював би тут, і це стандартно .
Жил "ТАК - перестань бути злим"

@Gilles: Чудово. tee /dev/ttyчудово послужив моїй вимозі про необхідність надрукувати stdoutсценарій до терміналу і передати його також stdinіншій команді! Спасибі! :-)
jamadagni

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Або з заміною процесу (ksh93, zsh або bash):

... | tee >(grep -e A -e C > out.file)

З zsh:

... >&1 > >(grep -e A -e C > out.file)

Я виявив, що мені потрібно скористатися першим, оскільки він зберігає вихідний код grep. Також, якщо з якихось причин ви не можете отримати доступ до файлової системи / dev, її /dev/fd/3можна замінити на>(cat 1>&3)
golvok

4

Ось ще один спосіб sed:

myscript | sed '/PATTERN/w out.file'

За замовчуванням sedдрукує кожен рядок, тому в цьому випадку stdout буде таким же, як і stdin (тобто ви побачите весь вихід myscriptна екрані).
Крім того, всі рядки, які відповідають, PATTERNбудуть wвпорядкованіout.file


-1

ви не вказали, як ви використовували команду tee, але це має працювати:

myscript | grep -P 'A|C' | tee out.file

принаймні, це працювало на моєму сервері кілька хвилин тому ...


4
Але, якщо я не помиляюся, таким чином ви приспівуєте і те, що на екрані. Я хочу бачити весь вихід на екрані та фільтрувати лише те, що відбувається у файлі.
lorenzo-s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.