명령 출력의 각 줄 앞에 타임스탬프를 추가합니다.

명령 출력의 각 줄 앞에 타임스탬프를 추가합니다.

명령의 각 출력 줄 앞에 타임스탬프를 추가하고 싶습니다. 예를 들어:

foo
bar
baz

될 것입니다

[2011-12-13 12:20:38] foo
[2011-12-13 12:21:32] bar
[2011-12-13 12:22:20] baz

...접두사 시간은 줄이 인쇄된 시간입니다. 이 목표를 어떻게 달성할 수 있나요?

답변1

더 많은 유틸리티다음을 포함하여 훌륭한 작업을 수행합니다 ts.

command | ts '[%Y-%m-%d %H:%M:%S]'

또한 루프가 필요하지 않으며 각 출력 라인에는 타임스탬프가 있습니다.

$ echo -e "foo\nbar\nbaz" | ts '[%Y-%m-%d %H:%M:%S]'
[2011-12-13 22:07:03] foo
[2011-12-13 22:07:03] bar
[2011-12-13 22:07:03] baz

재부팅한 서버가 언제 다시 돌아오는지 알고 싶으십니까? 그냥 실행하면 ping | ts문제가 해결됩니다. :D.

노트: [%Y-%m-%d %H:%M:%.S]마이크로초 정밀도에 사용됩니다.

답변2

첫째, 이러한 타임스탬프가 실제로 이벤트를 나타낼 것으로 예상하는 경우 많은 프로그램이 라인 버퍼링을 수행하므로(일부는 다른 프로그램보다 더 공격적으로) 이를 원래 라인의 시간에 가깝게 처리하는 것이 중요하다는 점을 명심하십시오. 발생한 작업의 타임스탬프 대신 인쇄됩니다.

또한 명령에 이 작업을 수행하기 위한 기능이 아직 내장되어 있지 않은지 확인할 수도 있습니다. 예를 들어 는 일부 버전에 ping -D존재하며 ping각 줄 앞에 Unix 시대 이후의 시간을 인쇄합니다. 그러나 명령에 자체 메서드가 포함되어 있지 않은 경우 다음을 포함하여 사용할 수 있는 몇 가지 메서드와 도구가 있습니다.

POSIX 쉘

\0많은 쉘이 문자열을 내부적으로 cstring으로 저장하므로 입력에 널 문자( )가 포함되어 있으면 행이 조기에 끝날 수 있다는 점을 명심하십시오 .

command | while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done

GNU awk

command | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'

진주

command | perl -pe 'use POSIX strftime; print strftime "[%Y-%m-%d %H:%M:%S] ", localtime'

파이썬

command | python -c 'import sys,time;sys.stdout.write("".join(( " ".join((time.strftime("[%Y-%m-%d %H:%M:%S]", time.localtime()), line)) for line in sys.stdin )))'

루비

command | ruby -pe 'print Time.now.strftime("[%Y-%m-%d %H:%M:%S] ")'

답변3

행별 증분 측정의 경우 다음을 시도하십시오.해시계 바늘.

이는 다른 명령의 표준 출력에 타임스탬프 정보를 추가하기 위한 moreutils의 ts와 유사한 명령줄 유틸리티입니다. 기록이 오래 걸리기를 원하는 장기 실행 프로세스에 유용합니다.

gnomon에 무엇이든 파이프하면 해당 줄이 버퍼의 마지막 줄이었던 시기, 즉 다음 줄이 나타나는 데 걸린 시간을 나타내는 타임스탬프가 각 줄 앞에 추가됩니다. 기본적으로 gnomon은 각 줄 사이에 경과된 시간(초)을 표시하지만 이는 구성 가능합니다.

포인터 데모

답변4

2024년에 업데이트됨

아래에 설명된 훌륭한 프로그램은 ets2020년 이후 업데이트되지 않았으므로 2024년 4월 현재 다음에서 업데이트된 포크를 가져오는 것을 고려할 수 있습니다.https://github.com/gdubicki/ets그리고 새로운 버전을 출시했습니다.

원래 답변

이 문제를 해결하기 위해 제가 방금 작성한 뻔뻔한 플러그입니다.ets, Go로 작성되었습니다.

데모

프로젝트 페이지에서 다양한 사용 예시를 찾아보실 수 있습니다.

기존 답변 및 유사한 제품과의 중요한 차이점은 etspty(pseudo-tty)에서 명령을 실행하도록 설계되었다는 것입니다. 즉, 명령이 기본적으로 tty에서 실행되는 것을 에뮬레이션합니다. ts이는 타임스탬프를 기본적으로 투명하게 만들고 파이핑 명령 출력과 비교하여 다음과 같은 파이핑 문제를 해결합니다.

  • 일부 프로그램은 파이프에 쓸 때 적극적으로 버퍼링하므로 출력이 전혀 표시되지 않고 그 다음에는 많은 출력이 표시되지 않습니다(예, stdbuf를 사용할 수 있으며 stdbuf 및 ts를 aliases/functions로 래핑할 수도 있지만 그렇지 않습니다. 즉시 작동하면 더 좋습니다);
  • 일부 프로그램은 파이프에 쓸 때 색상 및/또는 상호 작용을 비활성화합니다.
  • ETC를 활성화하지 않으면 종료 상태가 사라집니다.

명령은 직접 실행될 수 있습니다. 즉, ets기존 명령줄 앞에 명령을 추가하거나 쉘 명령일 수 있습니다(위의 gif 참조). 물론 출력을 파이프하려는 경우 ets에도 그렇게 할 수 있습니다.

etsmoreutils와 동일한 타임스탬프 모드 ts(절대 시간 모드, 경과 시간 모드, 증분 시간 모드)를 지원합니다. 보다 합리적인 기본값을 사용하며(예: 단조 시계는 항상 경과/증분 타임스탬프에 사용됨) 사용자 정의 시간대에 대한 추가 지원이 있습니다. 자세한 비교가 있어요여기.

다시,https://github.com/zmwangx/ets. 시도해 보고 버그를 보고하는 등의 작업을 수행해 보세요.

관련 정보