STDIN에서 읽은 줄 앞에 에포크 타임스탬프를 추가하는 방법은 무엇입니까? [복사]

STDIN에서 읽은 줄 앞에 에포크 타임스탬프를 추가하는 방법은 무엇입니까? [복사]

프리픽스를 하고 싶다에포크 시간매개변수 줄에. 내가 원하는 출력은 다음과 같습니다.

$ echo foo bar baz | some_bash_awk_sed_date_program_or_something_else
1491146539 foo bar baz

내가 얻는 실제 출력은 다음과 같습니다.

$ echo foo bar baz | awk -f time_stamper.awk
1491146539
0 foo bar baz

내 거 time_stamper.awk:

BEGIN { 
OFS=" "
printf "%s ", system("date +'%s'")
}
{ print }

리드는 0반환 값에서 나오는 것 같아요date +'%s'. 나는 OFS=" "최소한 1491146539 0 foo bar baz변경된 줄 바꿈을 공백으로 반환하도록 설정을 기대했습니다 .

현재 시도에 대한 몇 가지 질문:

  • 난 괜찮아OFS 내장 변수?
  • 0왜 앞면에 인쇄되어 있습니까 foo bar baz?

awk더 중요한 것은 이것이 작업에 적합한 도구인지 확신할 수 없다는 것입니다 . 어쩌면 다른 유틸리티를 사용해야 할 수도 있습니다 sed.date

  • 원하는 출력을 어떻게 인쇄할 수 있나요?

참고: 이 질문은 보다 구체적이므로 다음과 관련이 있습니다.이 문제. 게다가,답변설치가 필요합니다더 많은 유틸리티이것은 Unix 도구 세트에 흥미로운 추가 사항인 것 같습니다. 그러나 저는 작업을 수행하기 위해 보다 전통적인 Unix 유틸리티를 사용하고 싶습니다.

답변1

system()함수는 awk명령을 실행하고 해당 상태를 반환합니다. 0명령이 성공했기 때문에 얻은 ​​것입니다 . 의 출력은 date +'%s'별도로 인쇄됩니다.

외부 명령의 출력을 얻으려면 다음을 사용할 수 있습니다.getline():

$ echo foo bar baz | awk '{"date +%s" | getline d; printf "%s %s\n", d, $0}'
1491147643 foo bar baz

OFS기본적으로 공백이므로 관련이 없습니다 .


gawk또는 를 사용하여 mawk다음을 수행할 수도 있습니다.

echo foo bar baz | gawk '{printf "%s %s\n", systime(), $0}'

systime()윤초를 제외하고 에포크 이후의 초 수를 반환합니다 .


앗, 혼자서도 할 수 있어요 date:

date +'%s foo bar baz'

답변2

불다
여기서는 while루프를 사용하여 stdin에서 매개변수를 가져오고 사용할 때 분할을 수행하지 않습니다 IFS=. read이렇게 하면 동반 공백과 함께 전체 줄이 보존됩니다. 마지막으로 이제 변수를 통해 매개변수를 얻을 echo수 있습니다 . 기억해야 할 한 가지는 코드의 예측 가능한 동작을 위해 모든 매개변수를 따옴표로 묶어야 한다는 것입니다.timestamp$lecho

echo 'foo     bar baz' | while IFS= read -r l; do echo "$(date +'%s')" "$l"; done

진주

-nPerl옵션은 파일을 한 줄씩 읽도록 지시하고 특별히 요청하지 않는 한 인쇄하지 않습니다. 읽은 각 줄 은 와 $_동일하게 저장됩니다 . 우리에게 시간을 주는 함수 입니다 . 그런 다음 에포크 시간과 현재 행을 배열 참조 에 넣고 이를 통해 해당 배열의 내용을 반환합니다 . 표현식 주위에 큰따옴표를 사용 하면 목록 요소가 공백으로 구분됩니다. 그런 다음 인쇄합니다.$0awktime()Perl builtinepochanonymous[ ..., ... ]dereferencing@{ ... }"..."@{...}

echo ... |  perl -ne 'print "@{[+time,$_]}"'

IFS= read -r l <<<"$(echo 'foo    bar baz')"
printf '%d %s\n' "$(date +'%s')" "$l"

답변3

sed를 사용하여 이 작업을 수행할 수도 있습니다.

암호:

 echo 1 2 3 | sed 's/^/'`date +"%s"`' /'

결과:

1491148928 1 2 3

관련 정보