파일의 날짜 형식 변경 [중복]

파일의 날짜 형식 변경 [중복]

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포함되어 있으며 , 외부 명령을 실행하고 출력을 변수에 저장합니다.dategetlinedateout

  • 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/를 사용하세요:strftimeTime::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 309 30903
  • s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/ 남은 날짜/시간 문자열을 mmdd HH:MM:SS YYYY]다음에서 변환합니다.YYYY-mm-dd HH:MM:SS. (질문과 같이 출력에 선행 공백을 표시하려면 이 명령에 공백을 추가하십시오.)

노트:

  • 이는 오류 처리를 수행하지 않습니다. 입력이 말한 것과 다르면 출력이 뒤섞일 것입니다.
  • 이는 월 이름을 영어로 하드코딩하며 로케일 설정에 적용되지 않습니다.

관련 정보