프로그램이 stdout에 인쇄하는 모든 새 줄 앞에 텍스트를 넣으십시오.


9

그래서 나는 약간의 로깅을하고 싶기 때문에 bash 스크립트의 출력 앞에 날짜를 넣고 싶습니다. 문제는 여러 줄의 출력이 있다는 것입니다. 전체 출력 전에 날짜 만 넣을 수 있습니다. 그러나 로그에 날짜가없는 줄이 있습니다. 물론 위 줄의 날짜가 동일하다고 가정 할 수는 있지만 해결책이 있기를 바랐습니다. 미리 감사드립니다!

이것은 다른 스크립트를 호출하는 내 스크립트입니다.

#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended

이것은 출력입니다.

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended

그리고 그것이 내가 갖고 싶은 것 :

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended

두 번째 스크립트 만 변경할 수 있다고 생각하지 않습니까?
jmetz

아냐, 불행히도 그래서 내가 여기 온 이유입니다.
tzippy

답변:


9

Stack Overflow와 비슷한 질문에 따르면 두 가지 훌륭한 옵션이 있습니다.

awk ( 답변 )

<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

주석 달기 ( 답변 )

주석은 작은 bash 스크립트로, 여기에 제공된 링크를 통해 또는 데비안 기반 시스템에서 패키지 devscripts( annotate-output) 형식으로 얻을 수 있습니다.



2

당신이 사용할 수있는 awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awk입력 스트림을 가져 와서 출력을 수정합니다. 이 스크립트는 "print d 다음에 원래 출력"이라고 말한 다음 d날짜 로 채워집니다 .


1
이렇게하면 date표현식 이 한 번만 평가되지 않으므로 그러한 모든 줄이 같은 시간에 인쇄됩니까?
다니엘 벡

@DanielBeck 네, 그렇습니다. 매번 날짜를 잡는 것으로 가정했지만 테스트를 빨리 마쳤습니다.
Paul

1

출력의 각 줄 앞에 현재 날짜와 시간이 인쇄됩니다 ./script.sh.

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

작동 원리

  • set -fbash 확장을 끄거나 echo *실제 별표를 인쇄하지 않습니다.

  • while read -r LINE; do ... done변수에 한 줄의 출력을 저장 $LINE하고 ...모든 줄이 처리 될 때까지를 실행 합니다.

  • echo $ (date "+ % F % T") : "$ LINE"은 현재 시간과 날짜가있는 줄을 인쇄합니다.

  • set +f bash 확장을 다시 켜서 나머지 bash 스크립트를 방해하지 않습니다.


한 번만 평가되므로 sed두 번째 스크립트를 시작하기 직전에 모든 날짜가 동일한 날짜를 삽입합니다. 아마도 사용자가 원하는 것은 아닐 것입니다.
Daniel Beck

나는이 시도가 효과가 있다고 생각하지 않습니다. AFAIK, 전체 서브 쉘이 먼저 완전히 평가 된 다음 루프가 이송됩니다. 그래서 지금은 시간이 실행 후부터 입니다.
다니엘 벡

의 실행이 아닌 출력 만 지연시키기 때문에 예제가 작동하지 않습니다 ls. 다음과 같이 스크립트를 시험해보십시오 script.sh. #!/bin/bash(newline)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
Daniel Beck

for 루프 대신 루프 read와 함께 사용하십시오 while.
chepner

@chepner : 좋은 생각입니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.