로그 파일에서 시간을 에포크 밀리초에서 사람이 읽을 수 있는 날짜로 변환/교체합니다.

로그 파일에서 시간을 에포크 밀리초에서 사람이 읽을 수 있는 날짜로 변환/교체합니다.

다음 구조의 로그 파일이 있습니다.

예:

1522693524403 entity1,sometext
1522693541466 entity2,sometext
1522693547273 entity1,sometext
...

이제 Debian 시스템에서 bash 명령을 사용하여 모든 로그 파일의 시간을 epoch 밀리초에서 DD.MM.YYYY HH:MM:SS로 바꾸고 싶습니다.

여기와 다른 사이트에서 제공되는 다양한 솔루션을 시도했지만 실제로는 효과가 없었습니다.

누구든지 나를 도와줄 수 있나요?

건배

빠른 시작

답변1

쉘 스크립트를 사용하여 한 줄씩 읽거나 awk스크립트가 system 을 호출 하면 date속도가 매우 느려지고 프로세스가 너무 많아집니다. 간단한 awk, Perl, Python 또는 기타 스크립트를 사용해야 합니다. 모든 언어에는 형식 간 변환을 위한 표준 날짜/시간 함수가 있습니다.

여기그리고여기좋은 참고 자료입니다. GNU를 사용하고 싶다면awk 시간 함수그리고 strftime()귀하의 경우에 필요한 것은 에포크 하위 문자열(밀리초 제외)을 선택하는 것뿐입니다.

$ awk '{$1 = strftime("%F %T", substr($1,1,10))} 1' file
2018-04-02 21:25:24 entity1,sometext
2018-04-02 21:25:41 entity2,sometext
2018-04-02 21:25:47 entity1,sometext

또는 밀리초를 함께 인쇄합니다.

$ awk '{$1 = strftime("%F %T", substr($1,1,10)) "." substr($1,11)} 1' file
2018-04-02 21:25:24.403 entity1,sometext
2018-04-02 21:25:41.466 entity2,sometext
2018-04-02 21:25:47.273 entity1,sometext

또는 일-월-년 형식을 인쇄합니다.

$ awk '{$1 = strftime("%d-%m-%Y %T", substr($1,1,10))} 1' file
02-04-2018 21:25:24 entity1,sometext
02-04-2018 21:25:41 entity2,sometext
02-04-2018 21:25:47 entity1,sometext

답변2

이는 bash 명령으로 수행할 수 있는 작업이 아닙니다. bash는 부동 소수점 연산을 수행할 수 없고 날짜를 처리할 수 없기 때문에 외부 프로그램이 필요합니다. 나는 당신이 "명령 줄에서"를 의미하고 실제로 순수한 bash 솔루션이 필요하지 않다고 생각합니다. 이 가정에 따라 gawk(GNU awk) 솔루션은 다음과 같습니다.

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:24 entity1,sometext
02.04.2018 19:04:41 entity2,sometext
02.04.2018 19:04:47 entity1,sometext

strftime함수는 타임스탬프를 날짜로 변환합니다. 단위가 밀리초이므로 sprintf초로 변환합니다. 마지막 것은 1;(첫 번째 필드)에 새 값을 할당한 gawk후 행을 인쇄하라고 지시합니다.$1


출력은 시간대에 따라 달라집니다. 예를 들어 위 코드는 GMT 시간대로 설정된 컴퓨터에서 실행됩니다. 그래서 내 전화번호가 에 있는 전화번호와 다릅니다.@thanasisp의 답변이것은 아마도 다른 시간대에서 실행되는 것 같습니다. TZ명령을 실행할 때 변수를 설정하여 이를 제어하고 출력을 변경할 수 있습니다 . 예를 들어 다음을 비교하십시오.

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:02.24 entity1,sometext
02.04.2018 19:04:02.41 entity2,sometext
02.04.2018 19:04:02.47 entity1,sometext

이와 관련하여:

$ TZ=America/Los_Angeles gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 11:04:02.24 entity1,sometext
02.04.2018 11:04:02.41 entity2,sometext
02.04.2018 11:04:02.47 entity1,sometext

아니면 이거:

$ TZ=Asia/Tokyo gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
03.04.2018 03:04:03.24 entity1,sometext
03.04.2018 03:04:03.41 entity2,sometext
03.04.2018 03:04:03.47 entity1,sometext

관련 정보