프로그램이 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.