답변:
사용할 수 있습니다 awk
:
<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'
<command>
라인 버퍼 출력 을 생성 해야합니다 . 즉, 각 라인 후에 출력 스트림을 플러시합니다. 타임 스탬프 awk
추가는 라인의 끝이 입력 파이프에 나타난 시간입니다.
awk에 오류가 표시되면 gawk
대신 시도하십시오 .
gawk
대신 대신 설치 하여 사용해야합니다 awk
. MacPorts가있는 경우 :sudo port install gawk
awk
의 strftime()
밀리 초 정밀도를 가지고 있지 않습니다. 그러나 date
명령을 사용할 수 있습니다 . 기본적으로 나노초를 3 자로 자릅니다. 다음과 같이 보일 것입니다 : COMMAND | while read -r line; do echo "$(date '+%Y-%m-%d %T.%3N') $line"; done
. % T와 함께 % H : % M : % S를 축약 할 수 있습니다. awk
어떤 이유로 든 계속 사용 하려면 다음을 수행하십시오.COMMAND | awk '{ "date +%Y-%m-%d\\ %T.%3N" | getline timestamp; print timestamp, $0; fflush(); }'
ts
에서 moreutils은 입력의 모든 라인에 타임 스탬프를 앞에 추가합니다 당신은 그것을 제공합니다. strftime을 사용하여 형식을 지정할 수도 있습니다.
$ echo 'foo bar baz' | ts
Mar 21 18:07:28 foo bar baz
$ echo 'blah blah blah' | ts '%F %T'
2012-03-21 18:07:30 blah blah blah
$
설치하려면 :
sudo apt-get install moreutils
bad command 2>&1 | ts
결과 :Jan 29 19:58:31 -bash: bad: command not found
2014 Mar 21 18:07:28
. 어떻게 구할 수 있습니까?
brew install moreutils
. UTC를 출력하려면 TZ를 로컬로 설정할 수 있습니다 (예 :ls -l |TZ=UTC ts '%Y-%m-%dT%H:%M:%SZ'
ruby -e "puts 1; STDOUT.flush; sleep 1; puts 2; STDOUT.flush; sleep 2; puts 3" | ts '%F %T'
annotate , 해당 링크를 통해 또는 annotate-output
데비안 devscripts
패키지 에서 사용 가능
$ echo -e "a\nb\nc" > lines
$ annotate-output cat lines
17:00:47 I: Started cat lines
17:00:47 O: a
17:00:47 O: b
17:00:47 O: c
17:00:47 I: Finished with exitcode 0
주어진 답변을 가장 간단한 답변으로 증류 :
unbuffer $COMMAND | ts
Ubuntu에서는 expect-dev 및 moreutils 패키지에서 제공됩니다.
sudo apt-get install expect-dev moreutils
expect
아니, expect-dev
하지만 전에서 후반 당긴이 작품 때문에. (우분투 14.10, 바이너리가 어떤 시점에서 다른 패키지로 옮겨 졌는지 궁금합니다.)
expect-dev
unbuffer $COMMAND | ts -s %.s
( -s
경과 시간과 경우 %.s
소수 부분에 초 단위 시간)
이건 어때요?
cat somefile.txt | perl -pne 'print scalar(localtime()), " ";'
라이브 타임 스탬프를 얻으려는 욕구로 판단하면 로그 파일이나 다른 것을 실시간으로 업데이트하고 싶습니까? 아마도
tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps
tail -f /path/to/log | perl -pne 'use POSIX qw(strftime); print strftime "%Y-%m-%dT%H:%M:%SZ ", gmtime();'
더 간단한 버전이 생성하는 wacko 대신 ISO8601 / RFC3339 스타일 날짜를 얻었습니다.
BEGIN { $|++; }
Perl이 각 라인으로 출력을 플러시하도록 print 문 앞에 추가하는 것이 도움이 될 수 있습니다 .
ls | perl -pne 'print localtime." "'
. 스칼라 변환은 문자열 연결로 인해 발생합니다.
-p
과 -n
옵션을 모두 사용 합니까? -n
지정한 경우 중복 된 것 같습니다 -p
.
데몬 도구 에는 tai64n 및 tai64nlocal 이라는 유틸리티 쌍이 있으며 타임 스탬프를 추가하여 메시지를 기록 할 수 있습니다.
예:
cat file | tai64n | tai64nlocal
Kieron의 답변은 지금까지 가장 좋은 답변입니다. 첫 번째 프로그램이 버퍼링하기 때문에 문제가 발생하면 unbuffer 프로그램을 사용할 수 있습니다.
unbuffer <command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'
대부분의 리눅스 시스템에 기본적으로 설치됩니다. 직접 빌드해야하는 경우 예상 패키지의 일부입니다.
#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
($s,$ms) = gettimeofday();
print $s . "." . $ms . " " . $_;
}'
다음은 awk 솔루션입니다 (C : \ bin 디렉토리에 MKS Tools가 설치된 Windows / XP 시스템). 각 줄을 읽을 때 시스템에서 해당 타임 스탬프를 가져온 각 줄의 시작 부분에 mm / dd hh : mm 형식으로 현재 날짜와 시간을 추가하도록 설계되었습니다. 물론 BEGIN 패턴을 사용하여 타임 스탬프를 한 번 페치하고 해당 타임 스탬프를 각 레코드에 추가 할 수 있습니다 (모두 동일). 로그 메시지가 생성 될 때 타임 스탬프로 stdout에 생성 된 로그 파일에 태그를 지정하기 위해이 작업을 수행했습니다.
/"pattern"/ "C\:\\\\bin\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;
여기서 "pattern"은 입력 줄에서 일치시킬 문자열 또는 따옴표 (따옴표 제외)이며 모든 입력 줄을 일치 시키려면 선택 사항입니다.
이것은 Linux / UNIX 시스템에서도 작동합니다. C \ : \\ bin \\을 제거하십시오.
"date '+%m/%d %R'" | getline timestamp;
물론 이것은 "date"명령이 특정 경로 정보가없는 표준 Linux / UNIX 날짜 표시 / 설정 명령 (즉, 환경 PATH 변수가 올바르게 구성되어 있음)으로 이동한다고 가정합니다.
natevw 와 Frank Ch의 위의 답변을 혼합하십시오 . 아이 글러
밀리 초가 있으며 date
매번 외부 명령을 호출하는 것보다 성능이 뛰어나며 대부분의 서버에서 perl을 찾을 수 있습니다.
tail -f log | perl -pne '
use Time::HiRes (gettimeofday);
use POSIX qw(strftime);
($s,$ms) = gettimeofday();
print strftime "%Y-%m-%dT%H:%M:%S+$ms ", gmtime($s);
'
루프에서 플러시 및 읽기가 가능한 대체 버전 :
tail -f log | perl -pne '
use Time::HiRes (gettimeofday); use POSIX qw(strftime);
$|=1;
while(<>) {
($s,$ms) = gettimeofday();
print strftime "%Y-%m-%dT%H:%M:%S+$ms $_", gmtime($s);
}'
printf "%s+%06d %s", (strftime "%Y-%m-%dT%H:%M:%S", gmtime($s)), $ms, $_;
$ cat somefile.txt | sed "s/^/`date`/"
이 작업을 수행 할 수 있습니다 ( gnu / sed 사용 ).
$ some-command | sed "x;s/.*/date +%T/e;G;s/\n/ /g"
예:
$ { echo 'line1'; sleep 2; echo 'line2'; } | sed "x;s/.*/date +%T/e;G;s/\n/ /g"
20:24:22 line1
20:24:24 line2
물론, 당신은 프로그램 날짜 의 다른 옵션을 사용할 수 있습니다 . date +%T
필요한 것으로 교체하십시오 .
caerwyn의 답변은 서브 루틴으로 실행될 수 있으므로 라인 당 새로운 프로세스를 방지 할 수 있습니다.
timestamp(){
while read line
do
echo `date` $line
done
}
echo testing 123 |timestamp
date
모든 라인에 스폰 되지 않습니까?
timestamp() { while read line; do echo "$(date) $line"; done; }; export -f timestamp
.
date
모든 줄에 대해 산란 명령을 방지하려면 % (datespec) T 형식으로 bash printf
내장을 사용하십시오 . 따라서 다음과 같이 보일 수 있습니다. 쉘 내장은 생성되지 않습니다. Datespec 형식은 같다 즉 형식을 지원합니다. 이 지정자를 지원하는 버전이 확실하지 않으므로 bash가 필요 합니다. timestamp() { while IFS= read -r line; do printf "%(%F %T)T %s\n" -1 "$line"; done; }
strftime(3)
date
printf
면책 조항 : 내가 제안하는 솔루션은 Unix 내장 유틸리티가 아닙니다.
며칠 전에 비슷한 문제에 직면했습니다. 위의 솔루션의 구문과 제한 사항이 마음에 들지 않았기 때문에 Go에서 작업을 수행하는 프로그램을 신속하게 정리했습니다.
여기에서 도구를 확인할 수 있습니다 : preftime
GitHub 프로젝트 의 릴리스 섹션에는 Linux, MacOS 및 Windows 용으로 사전 빌드 된 실행 파일 이 있습니다.
이 도구는 불완전한 출력 라인을 처리하고 (내 견해로는)보다 간결한 구문을 가지고 있습니다.
<command> | preftime
이상적이지는 않지만 누군가를 도울 수 있도록 공유하고 싶지는 않습니다.
으로 그 일을 date
하고 tr
와 xargs
OSX에 :
alias predate="xargs -I{} sh -c 'date +\"%Y-%m-%d %H:%M:%S\" | tr \"\n\" \" \"; echo \"{}\"'"
<command> | predate
당신이 밀리 초를 원한다면 :
alias predate="xargs -I{} sh -c 'date +\"%Y-%m-%d %H:%M:%S.%3N\" | tr \"\n\" \" \"; echo \"{}\"'"
그러나 OSX에서 date는 % N 옵션을 제공하지 않으므로 gdate ( brew install coreutils
) 를 설치해야 하므로 마지막으로 다음에 도달하십시오.
alias predate="xargs -I{} sh -c 'gdate +\"%Y-%m-%d %H:%M:%S.%3N\" | tr \"\n\" \" \"; echo \"{}\"'"
앞에 붙는 값이 모든 줄에서 동일하면 파일과 함께 emacs를 시작하십시오.
Ctrl + <space>
파일의 시작 부분에서 (그 자리를 표시하기 위해) 마지막 줄의 시작 부분으로 아래로 스크롤하십시오 (Alt +>는 파일의 끝으로 이동합니다 ... 아마도 Shift 키가 필요할 것입니다. + a를 누르면 해당 줄의 시작 부분으로 이동합니다.
Ctrl + x r t
방금 지정한 사각형 (0 너비의 사각형)에 삽입하는 명령입니다.
2008-8-21 6:45 PM <입력>
또는 앞에 붙일 항목이 있으면 너비가 0 인 사각형의 모든 줄 앞에 텍스트가 붙는 것을 볼 수 있습니다.
업데이트 : 나는 당신이 같은 날짜를 원하지 않는다는 것을 깨달았습니다. 그래서 이것은 작동하지 않을 것입니다. 알아두면 좋겠다 ...
cat somefile.txt
"오해의 소지가"조금? "한 번에"발생할 것으로 예상되며 단일 타임 스탬프가 있습니다. 이것이 더 좋은 테스트 프로그램이(echo a; sleep 1; echo b; sleep 3; echo c; sleep 2)
아닐까요?