Покажите имя файла в начале каждой строки при конце нескольких файлов сразу?

Fedora пытается иметь в наличии 3 ядра при обновлении (для редкого случая захватывающих фейерверков на начальной загрузке).

14
13.04.2015, 13:16
5 ответов
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ Спасибо {don_cristti}

7
27.01.2020, 19:51

что-то с Xargs и SED может работать:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
0
27.01.2020, 19:51

Если хвост не является обязательным, вы можете использовать GREP для достижения этого:

grep "" *.log

Это будет распечатать имя файла в качестве префикса каждой выходной линии.

Выходные разрывы, если *. Журнал расширяется только к одному файлу. В связи с этим:

grep '' /dev/null *.log
2
27.01.2020, 19:51

Моя идея будет создать один файл с объединенными журналами из нескольких файлов, подобных кому-то предложенному здесь и Prepend имена файлов:

$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG
0
27.01.2020, 19:51

Краткий ответ

GNU Parallel имеет набор хороших опций, которые упрощают выполнение таких действий:

parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log

Результат будет be:

one.log:	contents of one.log here...
one.log:	contents of one.log here...
two.log:	contents of two.log here...
two.log:	contents of two.log here...

Дополнительные пояснения

  • Параметр - tagstring = str помечает каждую строку вывода строкой str . Из справочной страницы parallel :
--tagstring str
                Tag lines with a string. Each output line will be prepended with
                str and TAB (\t). str can contain replacement strings such as {}.

                --tagstring is ignored when using -u, --onall, and --nonall.
  • Все вхождения {} будут заменены аргументами parallel, которые в данном случае являются именами файлов журнала; то есть one.log и two.log (все аргументы после ::: ).

  • Параметр - строчный буфер необходим, потому что вывод команды (например, tail -f one.log или tail -f two.log ]) будет напечатан, если эта команда будет завершена. Так как tail -f будет ждать роста файла, необходимо распечатать вывод по строкам, что делает - строковый буфер . Снова из параллельной справочной страницы :

--line-buffer (alpha testing)
                Buffer output on line basis. --group will keep the output
                together for a whole job. --ungroup allows output to mixup with
                half a line coming from one job and half a line coming from
                another job. --line-buffer fits between these two: GNU parallel
                will print a full line, but will allow for mixing lines of
                different jobs.
6
27.01.2020, 19:51

Теги

Похожие вопросы