다음 입력 샘플 데이터가 포함된 파일이 있습니다.
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