아래에 표시된 것처럼 여러 파일을 한 번에 테일링 할 때 각 줄의 시작 부분에 파일 이름을 표시하는 방법이 있습니까?
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...
답변
tail -f ...your-files |
awk '/^==> / {a=substr($0, 5, length-8); next}
{print a":"$0}'
\ thanks {don_cristti}
답변
짧은 답변
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을 태그합니다 . 에서parallel
man 페이지 :
--tagstring str 문자열로 줄을 태그하십시오. 각 출력 줄 앞에 str과 TAB (\ t). str은 {}과 같은 대체 문자열을 포함 할 수 있습니다. -u, --onall 및 --nonall을 사용할 때는 --tagstring이 무시됩니다.
-
모든 발생은
{}
이 경우 로그 파일 이름 인 병렬의 인수로 대체됩니다. 즉one.log
andtwo.log
(이후의 모든 인수:::
). -
해당 명령이 완료되면
--line-buffer
명령 (예 :tail -f one.log
또는tail -f two.log
) 의 출력 이 인쇄 되므로 옵션 이 필요합니다 .tail -f
파일 증가를 기다릴 것이기 때문에 출력을 라인 단위로 인쇄해야합니다--line-buffer
. 다시parallel
맨 페이지에서 :
-라인 버퍼 (알파 테스트) 라인 단위의 버퍼 출력. -그룹은 출력을 유지합니다 전체 직업을 위해 함께. --ungroup을 사용하면 출력을 하나의 직업에서 오는 반줄과 다른 직업. --line-buffer는이 둘 사이에 맞습니다 : GNU parallel 전체 라인을 인쇄하지만 라인을 혼합 할 수 있습니다 다른 직업.
답변
tail
필수가 아닌 경우 다음을 수행하는 grep
데 사용할 수 있습니다 .
grep "" *.log
파일 이름을 각 출력 행의 접두사로 인쇄합니다.
*.log
하나의 파일로만 확장 되면 출력이 중단됩니다 . 이와 관련하여 :
grep '' /dev/null *.log
답변
내 생각은 누군가가 여기에서 제안 하고 파일 이름 앞에 붙는 것처럼 여러 파일에서 병합 된 로그로 단일 파일을 만드는 것입니다 .
$ 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
답변
뭔가 xargs
하고 sed
일할 수 :
$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT