2016-07-14 2 views
1

내 입력은 내가 다음과 같은 기능을 사용하고 Apr 11 16 05:10:20 16 04 11 05 10 20에 변환 할유닉스에서 시간을 hh : mm : ss에서 hh mm ss로 분할하는 방법은 무엇입니까?

./filename Apr 11 16 05:10:20 Jun 12 16 06:22:35 

,

convert_date_2() 
{ 
local months=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) 
local i 

for ((i=0; i<11; i++)) 
do 
[[ $1 = ${months[$i]} ]] && break 
done 
printf "%2d %02d %02d %02d %02d %02d \n" $3 $((i+1)) $2 $4 $5 $6 
} 

Start=$(convert_date_2 $1 $2 $3 $4) 
Stop=$(convert_date_2 $5 $6 $7 $8) 
echo $Start; 
echo $Stop; 

입니다하지만 16 04 11 05 00 0016 06 12 06 00 00 같은 출력을 얻고있다. 실제로 나는 16 04 11 05 10 2016 06 12 06 22 35을 원합니다.

어떻게 수정할 수 있습니까?

답변

7

date 명령으로 간단히 수행 할 수 있습니다.

date -d 'Apr 11 2016 05:10:20' '+%y %m %d %H %M %S' 

테스트 :

$ date -d 'Apr 11 2016 05:10:20' '+%y %m %d %H %M %S' 
16 04 11 05 10 20 

$ var_date="Jun 12 2016 06:22:35" 
$ date -d "$var_date" '+%y %m %d %H %M %S' 
16 06 12 06 22 35 

참고 : 다음, 입력 날짜 형식은 2016하지 16로 해 있습니다.

업데이트 :

이 시도 :

$ var_date="Jun 12 16 06:22:35" 
$ date -d "$(echo $var_date | awk '$3="20"$3')" '+%y %m %d %H %M %S' 

$ date -d "$(awk '$3="20"$3' <<< $var_date)" '+%y %m %d %H %M %S' 
+0

감사합니다. 하지만 내 로그 파일의 데이터가 '16'형식으로되어 있기 때문에 '2016 '을 사용할 수 없습니다. 형식을 변경할 수 없습니다. '16'을 1 년 동안 사용할 수 있습니까? 어떻게 결과를 변수에 저장할 수 있습니까? '시작 = $ (convert_date_2 $ 1 $ 2 $ 3 $ 4)'이 효과가 있습니까? – Vishwaroopa

+1

@Vishwaroopa, 내 업데이트를 참조하십시오. – sat

+0

감사의 답변 괜찮습니다. – Vishwaroopa

1

당신이 당신의 코드를 변경할 수 있습니다

convert_date_2() { 
    local months='JanFebMarAprMayJunJulAugSepOctNovDec' 
    local p="${months%$1*}" 
    printf "%2d %02d %02d %s\n" $3 $((${#p}/3 +1)) $2 "${4//:/ }" 
} 

start=$(convert_date_2 $1 $2 $3 $4) 
stop=$(convert_date_2 $5 $6 $7 $8) 
echo "start=$start" 
echo "sop=$stop" 

Code Demo

새로운 기능 예 전화 :

convert_date_2 Apr 11 16 05:10:20 
16 04 11 05 10 20 
+0

감사합니다. $ 3 $ (($ {# p}/3 +1)) $ 2 "$ {4 // : /}"코드 부분을 설명해 주시겠습니까? – Vishwaroopa

+0

'$ (($ {# p}/3 +1))''$ p'의 길이를 3으로 나눈 다음 결과에'1'을 더하여 달을 얻으려고합니다 # – anubhava

관련 문제