한 번에 여러 파일을 꼬리로 묶을 때 각 줄의 시작 부분에 파일 이름을 표시합니까?


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

-vtail 에 대한 (verbose) 옵션을 볼 수 있습니다 . 이것은 귀하의 요청과 정확히 일치하지는 않지만 시작입니다.
rahul

multitail는 이것을 할 수 있다고 생각합니다
Gilles 'SO-stop

답변:


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

\ thanks {don_cristti}


@ don_crissti, 감사합니다! (1) vs 파일-더 이상 와인을 마시지 않습니다! (2) 좋은 생각입니다. 나는 이런 식으로 일을 시작하지만 Lasily 내 자신에게 "아무도 파일의 꼬리 -f를 만들지 않을 것"이라고 말했다 :)-나는 당신의 훌륭한 제안을 사용할 것이다.
JJoao

길이 8을 설명 할 수 있습니까? 왜 여기 8입니까, 나는 8 작품 만 알고 있습니다.
Shicheng Guo

1
tail -n 1 * .txt | awk '/ ^ ==> / {a = substr ($ 0, 5, 길이 -8); next} {print a, $ 1} '| awk '$ 2> 0 {if ($ 2! ~ / chrY /) print $ 1}'| | xargs -I {} qsub {}
Shicheng Guo 2016

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

1
놀랍게도 놀랍게도 joojoo magic awksolution이 작동합니다!
Trevor Boyd Smith

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을 태그합니다 . 에서 parallel man 페이지 :
--tagstring str
                문자열로 줄을 태그하십시오. 각 출력 줄 앞에
                str과 TAB (\ t). str은 {}과 같은 대체 문자열을 포함 할 수 있습니다.

                -u, --onall 및 --nonall을 사용할 때는 --tagstring이 무시됩니다.
  • 모든 발생은 {}이 경우 로그 파일 이름 인 병렬의 인수로 대체됩니다. 즉 one.logand two.log(이후의 모든 인수 :::).

  • 해당 명령이 완료되면 --line-buffer명령 (예 : tail -f one.log또는 tail -f two.log) 의 출력 이 인쇄 되므로 옵션 이 필요합니다 . tail -f파일 증가를 기다릴 것이기 때문에 출력을 라인 단위로 인쇄해야합니다 --line-buffer. 다시 parallel 맨 페이지에서 :

-라인 버퍼 (알파 테스트)
                라인 단위의 버퍼 출력. -그룹은 출력을 유지합니다
                전체 직업을 위해 함께. --ungroup을 사용하면 출력을
                하나의 직업에서 오는 반줄과
                다른 직업. --line-buffer는이 둘 사이에 맞습니다 : GNU parallel
                전체 라인을 인쇄하지만 라인을 혼합 할 수 있습니다
                다른 직업.

2

tail필수가 아닌 경우 다음을 수행하는 grep데 사용할 수 있습니다 .

grep "" *.log

파일 이름을 각 출력 행의 접두사로 인쇄합니다.

*.log하나의 파일로만 확장 되면 출력이 중단됩니다 . 이와 관련하여 :

grep '' /dev/null *.log

tail -fnot의 출력에 파일 이름을 표시해야합니다 grep.
mtk

@serenesat 파일의 전체 내용을 인쇄하지 않습니까? OP는 꼬리를 지정할 때 파일 이름을 인쇄하도록 요청했습니다
rahul

파일 이름 앞에 추가 --with-filename하거나 -H항상 강제로 수행 할 수도 있습니다 .
Trevor Boyd Smith

나는이 답변을 정말로 좋아한다! 13 자 길이의 솔루션에 필요한 것을 정확하게 수행합니다. 까다로운 awk솔루션 과 달리 또는 parallel설치되지 않은 솔루션 .
Trevor Boyd Smith

유일한 문제는 로그 파일의 길이가 백만 줄인 경우입니다. 당신의 grep은 콘솔 (또는 ssh 이상)에 백만 줄을 스팸으로
Trevor Boyd Smith

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.