Bash Терминал: запись в файл журнала только определенных c строк - PullRequest
0 голосов
/ 07 мая 2020
• 1000 Теперь я хотел бы проследить весь вывод терминала, но в то же время я хотел бы сохранить определенные c данные / строки / значения из этого вывода в файл.

1) Есть ли способ сделать это в bash?

2) Или в качестве альтернативы: можно ли сохранить файл журнала, извлечь необходимые данные, а затем удалить обработанные строки в избежать создания огромного файла журнала?

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Если вы хотите сохранить в logfile только вывод, содержащий mypattern, но вы хотите видеть весь вывод на терминале, вы можете ввести:

cmd 2>&1 | tee /dev/tty | grep 'mypattern' > logfile

Я также предположил, что вывод из cmd может быть направлено в стандартный поток вывода, а также в стандартный поток ошибок, добавив 2>&1 после cmd.

2 голосов
/ 07 мая 2020

Какие критерии вы используете, чтобы решить, какие строки оставить?

1

Один из распространенных фильтров - просто хранить stderr.

cmdlist 2>logfile # stdout still to console

2

Для более сложного фильтра, если вы указали c шаблоны, которые вы хотите сохранить в журнал, вы можете использовать sed. Вот упрощенный пример c -

seq 1 100 | sed '/.*[37]$/w tmplog'

Это сгенерирует числа от 1 до 100 и отправит их все на консоль, но захватит все числа, которые заканчиваются на 3 или от 7 до * 1016. *. Он также может принимать более сложные списки команд, чтобы помочь вам быть более исчерпывающими -

seq 1 100 | sed '/.*[37]$/w 37.log
                 /^2/w 37.log'

c .f. sed руководство для более подробной разбивки.

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

seq 1 100 2>errlog | sed '/.*[37]$/w patlog'

3

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

$: mkfifo transfer               # creates a queue file on disk that 
$: gzip < transfer > log.gz &    # reads from FIFO in bg, compresses to log
$: seq 1 100 2>&1 | tee transfer # tee writes one copy to stdout, one to file

Это покажет весь вывод, как он есть, но также дублируйте копию в именованный канал; gzip будет читать его из именованного канала и сжимать его.

3b

Вы можете заменить tee на sed для уменьшения пространства вдвое, если требуется -

$: mkfifo transfer               
$: gzip < transfer > log.gz &
$: seq 1 100 2>&1 | sed '/.*[37]$/w transfer'

Я не рекомендую это делать, так как вы можете отфильтровать то, что не понимали, что вам понадобится.

...