다음 구조의 로그 파일이 있습니다.
예:
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