linux - 파이프 - Bash에서 표준 출력을 파일로 리디렉션하는 동안 타임 스탬프를 추가하는 방법은 무엇입니까?




파일 생성 시 cal 명령 과 입출력 리다이렉션 사용 (4)

나는 프로그램 (서버)을 가지고 있고 모든 stdout 을 파일로 리디렉션 (또는 더 잘 복제)하고 각 항목에 타임 스탬프를 추가하는 방법 (스크립트)을 찾고 있습니다.

몇 가지 조사를 해본 결과 STDERR 리디렉션에 타임 스탬프를 추가하는 방법 덕분에 가장 많이 얻을 수있었습니다. 그것은 stdout 재전송하지만 추가 된 타임 스탬프는 스크립트가 완료되는 시간입니다 :

#!/bin/bash
./server | ./predate.sh > log.txt

predate.sh 코드 :

#!/bin/bash
while read line ; do
    echo "$(date): ${line}"
done

서버 출력은 프로그램 종료 후 플러시됩니다 (리디렉션 없이는 제대로 작동합니다). 또한 언급 된 스레드에서 주어진 예제에 대해 predate.sh 를 사용하면 완벽하게 작동합니다. 주 프로그램에 타임 스탬프를 추가하는 것이 쉽다는 것을 알고 있지만 코드 편집을 피할 것입니다.


귀하의 문제는 stderr 출력을 log.txt 파일에 포함시키는 것입니다. 권리 ? 그게 당신이 원하는 솔루션입니다 :

./server 2> & 1 | ./predate.sh> log.txt

문안 인사


나는 이런 식으로 크론 작업을하고있다.

0 * * * * user /home/user/script.sh >>stdout.log

그럼 script.sh에서, 나는 이런 식으로 뭔가 :

#!/bin/bash
date
do_some_code

"date"는 내 script.sh의 stdout의 일부이므로 타임 스탬프는 각 stdout.log 항목의 첫 번째 줄입니다.


위의 예를 사용하고 있습니다 : picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{print strftime ( "% s :"), $ 0; fflush (); } '| 티 serial.txt

텔넷 출력 데이터를 로그 파일에 덤프 / 리디렉션하지만 백그라운드에서 스크립트를 실행할 수 없습니다. '&'를 사용하여 배경을 실행하면 작동하지 않습니다.

포인트 # 1 : '&'없는 작업 명령 : 스크립트 : dumpper.sh telnet $ 1 $ 2 | awk '{print strftime ( "% s :"), $ 0;}'| tee $ host. $ port.log;

명령 : ./dumpper.sh 16.1.1.8 202

포인트 # 1 : '&'와 함께 작동하지 않는 명령 : 스크립트 : dumpper.sh telnet $ 1 $ 2 | awk '{print strftime ( "% s :"), $ 0;}'| tee $ host. $ port.log 2> & 1;

명령 : ./dumpper.sh 16.1.1.8 20224 &


최근 필자는 직렬 콘솔 (picocom)에서 로그 메시지를 받고 터미널과 파일에 인쇄 한 다음 날짜를 앞에 추가해야했습니다.

내가 지금 사용하는 것은 s.th. 이렇게 :

picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt
  • picocom 의 출력이 awk 로 파이프됩니다.
  • awk 는 날짜를 앞에 붙입니다 ( %s 옵션은 1970-01-01 00:00:00 UTC 이후로 시간을 초 단위 로 변환합니다 - 또는 사람이 읽을 수있는 형식으로 %c 사용)
  • fflush() awk 에서 버퍼 된 출력모두 플러시합니다.
  • 이 파일은 tee 파이프되어 파일로 전송됩니다. ( here tee 대한 정보를 찾을 수 here )




redirect