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