아래와 같이 여러 파일을 한 번에 따라갈 때 각 줄의 시작 부분에 파일 이름을 표시하는 방법이 있습니까?
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...
답변1
짧은 답변
GNU 병렬이 작업을 쉽게 수행할 수 있는 훌륭한 옵션 세트가 있습니다.
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
각 출력 행을 문자열로 표시합니다.스테르. ~에서parallel
매뉴얼 페이지:
--태그스트링 문자열 문자열로 줄을 표시하세요. 각 출력 라인 앞에는 str 및 TAB(\t). str에는 {}와 같은 대체 문자열이 포함될 수 있습니다. -u, --onall 및 --nonall을 사용할 때 --tagstring은 무시됩니다.
모든 항목은
{}
병렬 인수로 대체됩니다. 이 경우 로그 파일 이름은one.log
및two.log
(뒤의 모든 인수:::
)입니다.--line-buffer
명령이 완료되면 명령의 출력(예: 또는 )이 인쇄되기 때문에 이 옵션이 필요합니다 . 파일이 커질 때까지 기다리게 되므로 출력을 한 줄씩 인쇄해야 합니다. 다시부터tail -f one.log
tail -f two.log
tail -f
--line-buffer
parallel
매뉴얼 페이지:
--line-buffer(알파 테스트) 라인 기반 버퍼링된 출력. --group은 출력을 보존합니다 모든 일을 함께 하세요. --ungroup은 출력 혼합을 허용합니다. 라인의 절반은 직업에서 나오고, 라인의 절반은 직업에서 나옵니다. 다른 직업. --line-buffer는 두 가지 모두에 적합합니다: GNU Parallel 전체 줄을 인쇄하지만 혼합 줄을 허용합니다. 다른 직업.
답변2
tail -f ...your-files |
awk '/^==> / {a=substr($0, 5, length-8); next}
{print a":"$0}'
\감사합니다{don_cristti}
답변3
tail
필수가 아닌 경우 grep
다음을 사용하여 수행할 수 있습니다.
grep "" *.log
그러면 파일 이름이 각 출력 줄의 접두어로 인쇄됩니다.
*.log
하나의 파일로만 확장하면 출력이 중단됩니다 . 이와 관련하여:
grep '' /dev/null *.log
답변4
내 생각은 누군가가 제안한 것처럼 여러 파일의 병합된 로그를 포함하는 단일 파일을 만드는 것입니다.여기파일 이름을 추가하십시오.
$ 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