시간을 epoch 밀리 초에서 사람이 읽을 수있는 로그 파일의 날짜로 변환 / 바꾸기
다음 구조의 로그 파일이 있습니다.
예:
1522693524403 entity1,sometext
1522693541466 entity2,sometext
1522693547273 entity1,sometext
...
이제 모든 로그 파일의 시간을 epoch 밀리 초에서 DD.MM.YYYY HH : MM : SS로 데비안 시스템의 bash 명령으로 바꾸고 싶습니다.
여기와 다른 웹 사이트에서 제공된 다른 솔루션을 시도했지만 실제로는 작동하지 않았습니다.
누구든지 나를 도울 수 있습니까?
건배
빠른 부팅
답변
한 줄씩 읽는 쉘 스크립트를 사용하거나 awk
시스템을 호출 하는 스크립트 를 사용하면 date
프로세스가 너무 느리고 너무 많습니다. 간단한 awk, Perl, Python 또는 기타 스크립트를 사용해야합니다. 모든 언어에는 형식 간 변환을위한 표준 datetime 함수가 있습니다.
여기 와 여기 에 좋은 참고 자료가 있습니다. 당신은 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
이것은 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