로그를 추적하는 동안 로그의 시간대를 변환하는 방법

로그를 추적하는 동안 로그의 시간대를 변환하는 방법

로그를 추적하면서 로그의 날짜 스탬프 형식을 실시간으로 조작하고 싶습니다. 현재 형식은 입니다 2016-04-06T23:19:20.878Z. 현지 시간대로 변환하고 밀리초를 제거하고 싶습니다. 출력의 나머지 부분은 변경되지 않은 채 실시간으로 수행될 수 있도록 출력을 또는 tail -f같은 것으로 파이프할 수 있습니까?awksed

답변1

타임스탬프가 어느 필드에 있는지 알고 있는 경우(예: 두 번째 단어) awk를 사용하여 다음을 호출하여 변환할 수 있습니다 date.

stdbuf -oL tail -f ... |
awk -v timefield=2 '{
  if($timefield ~ /[0-9].*Z/){
    "date --date \"" $timefield "\"" | getline tod
     sub($timefield,tod,$0)
  }
  print 
}'

위에 표시된 것처럼 파이프에 대한 버퍼가 아닌 테일이 필요할 수도 있습니다 stdbuf -oL. 필드를 모르거나 이동한 경우 각 단어의 시간대 패턴을 일치시켜 볼 수 있습니다.

awk  '{
  for(timefield = 1;timefield<=NF;timefield++)
    if($timefield ~ /^[0-9].*T.*Z$/){
      "date --date \"" $timefield "\"" | getline tod
      sub($timefield,tod,$0)
    }
   print 
}'

이는 타임스탬프가 공백으로 구분되어 있다고 가정합니다.


주석의 예를 사용하면 awk를 사용하여 타임스탬프의 길이와 오프셋이 일정하므로 I2016-04-08T00:34:29.372Z]v3087타임스탬프를 추출할 수 있습니다 . 결과 출력에서 ​​초기 코드와 후행 코드를 유지 하지 않으려면 다음과 같이 끝납니다.substr(string,offset,length)datestamp = substr($timefield, 2, 24)I

awk -v timefield=1 '{
  if($timefield ~ /[0-9].*Z/){
     datestamp = substr($timefield, 2, 24)
    "date --date \"" datestamp "\"" | getline tod
     sub($timefield,tod,$0)
  }
  print 
}'

추가 코드를 유지하려면 sub전체 필드 대신 날짜 스탬프 문자열을 바꾸도록 변경하세요. 예를 들어 추가 공백을 사용하세요 sub(datestamp," " tod " ",$0).

관련 정보