sed 또는 awk를 사용하여 각 행의 unix epoch 타임스탬프 열 변환

sed 또는 awk를 사용하여 각 행의 unix epoch 타임스탬프 열 변환

다음 입력 샘플 데이터가 포함된 파일이 있습니다.

1137921146.499 180900 61.153.158.197 1409 
1137921158.698 181622 61.153.158.197 1409
1137921758.163 180026 221.226.124.114 1374
1137921802.016 179485 121.13.128.132 1409

첫 번째 열은 unix epoch 타임스탬프이며 이를 사람이 읽을 수 있는 형식으로 변환해야 하며 데이터를 다음과 같이 분리하고 싶습니다.

Sun Jan 22 01:12:26 PST 2006|180900|61.153.158.197|1409   
Sun Jan 22 01:12:38 PST 2006|181622|61.153.158.19|1409

sed 's/{1,}/|/g'를 사용하여 구분 기호를 추가하고 date -d @1137921146.499를 사용하여 날짜를 변환해 보았습니다. 하지만 이 둘을 하나의 명령으로 결합할 수는 없습니다..

답변1

다음과 같이 awk 프로그램을 사용할 수 있습니다.

awk '{ print strftime("%c",$1)"|" $2"|"$3"|"$4 }' file

핵심은 strftime 함수를 사용하여 epoch를 날짜 형식으로 변환하는 것입니다.

출력은 다음과 같습니다.

#awk '{ print strftime("%c",$1)"|" $2"|"$3"|"$4 }' file
Sun Jan 22 10:12:26 2006|180900|61.153.158.197|1409
Sun Jan 22 10:12:38 2006|181622|61.153.158.197|1409
Sun Jan 22 10:22:38 2006|180026|221.226.124.114|1374
Sun Jan 22 10:23:22 2006|179485|121.13.128.132|1409

PS 또는 암시적 출력 구분 기호를 사용할 수도 있습니다.

awk  'BEGIN { OFS="|"} {$1= strftime("%c",$1) }1' file

답변2

이미 알고 있는 것을 활용하세요:

  • date타임스탬프를 형식화된 날짜로 변환하기 위해 GNU를 제공할 수 있습니다 @timestamp.
  • 공백을 바꾸면 |원하는 결과를 얻을 수 있습니다.

이를 위해 우리는 추가합니다

  • GNU는 date파일에 대해 작업을 수행하고 날짜를 일괄적으로 변환할 수 있습니다.

GNU를 사용하여 날짜를 일괄 변환하려면 date타임스탬프를 추출하고 접두사를 추가해야 합니다 @.

$ sed 's/^\([^ ]*\).*$/@\1/' data.in
@1137921146.499
@1137921158.698
@1137921758.163
@1137921802.016

sed표현식은 각 줄을 접두사가 붙은 공백으로 구분된 첫 번째 필드로 바꿉니다 @.

bash(and ksh93또는 프로세스 대체를 이해하는 모든 쉘)을 사용하십시오 .

$ date -f <( sed 's/^\([^ ]*\).*$/@\1/' data.in )
Sun Jan 22 10:12:26 CET 2006
Sun Jan 22 10:12:38 CET 2006
Sun Jan 22 10:22:38 CET 2006
Sun Jan 22 10:23:22 CET 2006

그런 다음 입력 데이터의 다른 필드를 가져와 구분 기호를 바꿔야 합니다.

$ cut -d ' ' -f 2- data.in | tr ' ' '|'
180900|61.153.158.197|1409
181622|61.153.158.197|1409
180026|221.226.124.114|1374
179485|121.13.128.132|1409

그런 다음 |다음 두 가지를 구분 기호와 함께 붙여넣습니다.

$ paste -d '|' <( date -f <( sed 's/^\([^ ]*\).*$/@\1/' data.in ) ) <( cut -d ' ' -f 2- data.in | tr ' ' '|' )
Sun Jan 22 10:12:26 CET 2006|180900|61.153.158.197|1409
Sun Jan 22 10:12:38 CET 2006|181622|61.153.158.197|1409
Sun Jan 22 10:22:38 CET 2006|180026|221.226.124.114|1374
Sun Jan 22 10:23:22 CET 2006|179485|121.13.128.132|1409

답변3

또는 쉘을 사용하여:

while read timestamp pid ip port; do
  echo "$(date -d @$timestamp)|$pid|$ip|$port"
done <yourfile

관련 정보