stdin 앞에 타임스탬프를 추가하는 Unix 유틸리티가 있습니까?

StackOverflow https://stackoverflow.com/questions/21564

  •  09-06-2019
  •  | 
  •  

문제

나는 이를 위해 Python으로 간단한 스크립트를 작성하게 되었지만, 각 줄 앞에 텍스트(나의 특별한 경우에는 타임스탬프)를 추가하는 텍스트를 제공할 수 있는 유틸리티가 있는지 궁금했습니다.이상적으로는 다음과 같이 사용됩니다.

cat somefile.txt | prepend-timestamp

(당신이 sed에 대답하기 전에 나는 이것을 시도했습니다:

cat somefile.txt | sed "s/^/`date`/"

그러나 이는 sed가 실행될 때 date 명령을 한 번만 평가하므로 동일한 타임스탬프가 각 줄 앞에 잘못 추가됩니다.)

도움이 되었습니까?

해결책

사용해 볼 수 있습니다 awk:

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

다음 사항을 확인해야 할 수도 있습니다. <command> 라인 버퍼링된 출력을 생성합니다. 즉,각 라인 다음에 출력 스트림을 플러시합니다.타임스탬프 awk add는 입력 파이프에 줄의 끝이 나타난 시간입니다.

awk에 오류가 표시되면 시도해 보세요. gawk 대신에.

다른 팁

ts ~에서 더 많은 유틸리티 입력하는 모든 줄에 타임스탬프를 추가합니다.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

주석을 달다, 해당 링크를 통해 또는 다음과 같이 사용 가능 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

이건 어때?

cat somefile.txt | perl -pne 'print scalar(localtime()), " ";'

실시간 타임스탬프를 얻으려는 것으로 판단하면 로그 파일 등을 실시간 업데이트하고 싶습니까?아마도

tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps

그냥 이것저것 던져볼게:한 쌍의 유틸리티가 있습니다 데몬툴즈 ~라고 불리는 타이64n 그리고 tai64nlocal 로그 메시지에 타임스탬프를 추가하기 위해 만들어졌습니다.

예:

cat file | tai64n | tai64nlocal

Kieron의 답변은 지금까지 최고의 답변입니다.첫 번째 프로그램이 버퍼링을 하기 때문에 문제가 발생하면 unbuffer 프로그램을 사용할 수 있습니다:

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

대부분의 Linux 시스템에는 기본적으로 설치됩니다.직접 빌드해야 하는 경우 Expect 패키지의 일부입니다.

http://expect.nist.gov

read(1) 명령을 사용하여 표준 입력에서 한 번에 한 줄씩 읽은 다음 date(1)을 사용하여 선택한 형식으로 날짜가 앞에 붙은 줄을 출력합니다.

$ cat timestamp
#!/bin/sh
while read line
do
  echo `date` $line
done
$ cat somefile.txt | ./timestamp

나는 유닉스 전문가는 아니지만 당신이 사용할 수 있다고 생각합니다

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt
#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
        ($s,$ms) = gettimeofday();
        print $s . "." . $ms . " " . $_;
}'

다음은 내 awk 솔루션입니다(C:\bin 디렉터리에 MKS 도구가 설치된 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 변수가 올바르게 구성되어 있음).

위의 일부 답변을 혼합 네네 그리고 프랭크 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);
  }'
$ cat somefile.txt | sed "s/^/`date`/"

당신은 이것을 할 수 있습니다 ( 그누/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

부인 성명:내가 제안하는 솔루션은 Unix 내장 유틸리티가 아닙니다.

며칠 전에 비슷한 문제에 직면했습니다.위 솔루션의 구문과 제한 사항이 마음에 들지 않았기 때문에 Go에서 작업을 수행할 수 있는 프로그램을 빠르게 구성했습니다.

여기에서 도구를 확인할 수 있습니다. 프리타임

Linux, MacOS 및 Windows용으로 사전 빌드된 실행 파일이 있습니다. 릴리스 GitHub 프로젝트의 섹션.

이 도구는 불완전한 출력 라인을 처리하며 (내 관점에서 볼 때) 더 간결한 구문을 가지고 있습니다.

<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 키 + <스페이스>

파일 시작 부분에서(해당 지점을 표시하기 위해) 마지막 줄의 시작 부분까지 아래로 스크롤합니다(Alt + >는 파일 끝으로 이동합니다...여기에는 Shift 키도 포함되며 Ctrl + a를 눌러 해당 줄의 시작 부분으로 이동합니다.

Ctrl 키 + 엑스 아르 자형

방금 지정한 직사각형(폭이 0인 직사각형)에 삽입하는 명령은 무엇입니까?

2008-8-21 오후 6시 45분 <입력>

아니면 앞에 붙이고 싶은 것...그러면 너비가 0인 직사각형 내의 모든 줄 앞에 텍스트가 추가되는 것을 볼 수 있습니다.

업데이트:방금 당신이 같은 날짜를 원하지 않는다는 것을 깨달았습니다. 그래서 이것은 작동하지 않을 것입니다...약간 더 복잡한 사용자 정의 매크로를 사용하여 emacs에서 이 작업을 수행할 수 있지만 여전히 이러한 종류의 직사각형 편집에 대해 알아두면 매우 좋습니다...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top