Показати ім’я файлу на початку кожного рядка, коли підключити декілька файлів одночасно?


14

Коли ви створюєте декілька файлів одночасно, як показано нижче, чи є спосіб відобразити ім'я файлу на початку кожного рядка?

tail -f one.log two.log

поточний вихід

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

Шукаєте щось подібне

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...

Ви можете подивитися -v(багатослівний) варіант хвоста. Це може не відповідати вашому запиту, але це початок.
rahul

багатоповерхівка може це зробити. Я думаю
перестань бути злим"

Відповіді:


8
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ дякую {don_cristti}


@don_crissti, дякую! (1) файл vs - не більше вина для мого келиха! (2) гарна ідея. Я починаю робити щось подібне, але лайливо сказав собі: "ніхто не зробить хвіст -файлів з пробілами" :) - Я буду використовувати ваші чудові пропозиції.
JJoao

чи можете ви пояснити довжину-8? чому тут 8, я знаю лише 8 творів.
Shicheng Guo

1
хвіст -n 1 * .txt | awk '/ ^ ==> / {a = substr ($ 0, 5, довжина-8); наступний} {print a, $ 1} '| awk '$ 2> 0 {if ($ 2! ~ / chrY /) print $ 1}' | xargs -I {} qsub {}
Shicheng Guo

@ShichengGuo, 8 = length ("==>") + length ("<==")
JJoao

1
напрочуд / дивовижно працює ваше магічне awkрішення Joojoo !
Тревор Бойд Сміт

6

Коротка відповідь

GNU Parallel має набір приємних варіантів, які полегшують такі дії:

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

Вихід буде:

one.log: вміст one.log тут ...
one.log: вміст one.log тут ...
two.log: вміст two.log тут ...
two.log: вміст two.log тут ...

Більше пояснення

--tagstring str
                Рядки з тегом рядком. Кожен вихідний рядок буде попередньо встановлений
                str та TAB (\ t). str може містити рядки заміни, такі як {}.

                --tagstring ігнорується при використанні -u, --onall та --nonall.
  • Усі входження {}буде замінено аргументами паралельних, які в даному випадку є іменами файлів журналу; тобто one.logі two.log(всі аргументи після :::).

  • Цей параметр --line-bufferнеобхідний, оскільки виведення команди (наприклад, tail -f one.logабо tail -f two.log) буде надруковано, якщо ця команда буде закінчена. Оскільки tail -fбуде чекати зростання файлів, потрібно надрукувати результат на рядковій основі, що --line-bufferтак і робиться. Знову зі parallel сторінки man :

- лінійний буфер (альфа-тестування)
                Буферний вихід на основі ліній. --group збереже вихід
                разом за цілу роботу. --група дозволяє виводити суміш з вихідними
                половина рядка, що йде від однієї роботи, і половина лінії, що надходить
                інша робота. - лінія буфера підходить між цими двома: паралель GNU
                надрукує повний рядок, але дозволить змішувати лінії
                різні робочі місця.

2

Якщо tailце не є обов'язковим, ви можете використовувати grepдля цього:

grep "" *.log

Це надрукує ім'я файлу як префікс кожного вихідного рядка.

Вихід розбивається, якщо *.logрозширюється лише на один файл. Щодо цього:

grep '' /dev/null *.log

Мені потрібно показати ім'я файлу у висновку tail -fне grep.
mtk

@serenesat це просто надрукував би весь вміст файлів, чи не так? ОП просило друкувати ім’я файлу, коли вказано хвіст
rahul

ви також можете просто зробити --with-filenameабо -Hзавжди змусити передбачити ім'я файлу.
Тревор Бойд Сміт

я дуже люблю цю відповідь! робить саме ТОЧНО те, що потрібно для рішення, яке дорівнює 13 символам. на відміну від хитромудрого awkрішення або parallelяке не встановлено.
Тревор Бойд Сміт

Єдина проблема полягає в тому, що якщо ваші логіни мають довжину 1 мільйон рядків. тоді ваша грепа буде спамувати 1 мільйон рядків, щоб втішити (або понад ssh) ...
Тревор Бойд Сміт

0

Моя ідея полягала б у тому, щоб створити один файл із об’єднаними журналами з кількох файлів, як хтось тут запропонував, і додати ім’я файлів:

$ 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

Щось із xargsі sedможе працювати:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.