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


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.