Sample.txt라는 다음과 같은 파일이 있습니다.
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3
이렇게 보이도록 수정해야 합니다. 날짜 형식을 이 형식으로 변경해야 합니다.
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3
답변1
awk
다음의 도움을 받아 사용됨 date
:
awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}'
-F '[[\\]]'
필드 구분 기호를[
또는]
로 설정하면 날짜는 필드 2에 있고 나머지는 필드 3에 있습니다.변수에는 두 번째 필드를 원하는 형식으로 변환하는 명령이
cmd
포함되어 있으며 , 외부 명령을 실행하고 출력을 변수에 저장합니다.date
getline
date
out
out
마지막으로 변수의 내용과 세 번째 필드를 인쇄합니다.
예:
% cat file.txt
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3
% awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}' file.txt
2016-09-10 06:31:41!Node2!Node1!Node3
2016-09-11 23:31:41!Node2!Node1!Node3
답변2
Perl 모듈에서 strptime
/를 사용하세요:strftime
Time::Piece
perl -MTime::Piece -pe '
s/\[(.*?)\]/Time::Piece->strptime($1, "%a %b %d %H:%M:%S %Y")->strftime("%Y-%m-%d %H:%M:%S!ER_DEV")/e
' Sample.txt
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3
답변3
sed
다음과 같은 강력한 순수 명령을 사용하여 이 작업을 수행 할 수 있습니다 .
sed 's/^.... //
s/^Jan /01/; s/^Feb /02/; s/^Mar /03/; s/^Apr /04/; s/^May /05/; s/^Jun /06/
s/^Jul /07/; s/^Aug /08/; s/^Sep /09/; s/^Oct /10/; s/^Nov /11/; s/^Dec /12/
s/^\(..\) /\10/; s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/'
s/^.... //
[
요일과 (the 3글자 약어)를 삭제하세요 .s/^Jan /01/
등, 월(이름의 3자리 약어)(및 다음 공백)을 해당 숫자 값(월 번호)으로 바꿉니다.s/^\(..\) /\10/
한 자리 날짜(일) 값(즉, 앞에 공백이 있는 10보다 작은 숫자)을 확인하고 앞에 0이 있도록 변경합니다. 예를 들어,[Sat Sep 3
→09 3
→0903
s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/
남은 날짜/시간 문자열을mmdd HH:MM:SS YYYY]
다음에서 변환합니다.YYYY-mm-dd HH:MM:SS
. (질문과 같이 출력에 선행 공백을 표시하려면 이 명령에 공백을 추가하십시오.)
노트:
- 이는 오류 처리를 수행하지 않습니다. 입력이 말한 것과 다르면 출력이 뒤섞일 것입니다.
- 이는 월 이름을 영어로 하드코딩하며 로케일 설정에 적용되지 않습니다.