2013-05-15 14 views
0

몇 분을 지정할 수있는 작은 bash 스크립트를 작성하려고하는데 마지막 X 분의 로그 파일 행이 표시됩니다. 가 나는 그러나 나의 스크립트에서, CLI에Bash 스크립트 : sed에서 변수/매개 변수 사용

sed -n '/time/,/time/p' LOGFILE 

나오지이 완벽하게 작동 사용하고, 선을 얻으려면, 그렇지 않습니다.

# Get date 
now=$(date "+%Y-%m-%d %T") 

# Get date minus X number of minutes -- $1 first argument, minutes 
then=$(date -d "-$1 minutes" +"%Y-%m-%d %T") 

# Filter logs -- $2 second argument, filename 
sed -n '/'$then'/,/'$now'/p' $2 

나는 다른 접근을 시도하고 그들 중 누구도 제대로 작동하지 :

result=$(sed -n '/"$then"/,/"$now"/p' $2) 
sed -n "/'$then'/,/'$now'/p" "$2" 
sed -n "/$then/,/$now/p" $2 
sed -n "/$then/,/$now/p" "$2 

모든 sugesstions를? 스크립트는 어떠한 출력을 생성하지 않기 때문에 게재 오류가 없습니다 : 내가 데비안 5 일 오전, echo $SHELL/bin/sh

EDIT 말한다. 로그 파일에서 모든 항목이 다음과 같은 날짜로 시작됩니다. 2013-05-15 14:21:42,794

+0

로그에서 한 행을 표시 할 수 있습니까? – choroba

답변

1

문자열 일치로 산술 비교를 수행하는 것이 주된 문제라고 가정합니다. sed -n '/23/,/27/p'23을 포함하는 첫 번째 줄과 을 포함하는 다음 줄 (다시 27을 포함하는 다음 줄까지 23을 포함하는 다음 줄부터 다시 다음 줄까지)을 제공합니다. 그것은하지 하지 당신에게 입력이

19 
22 
24 
26 
27 
30 

(더 23가 없기 때문에)은 아무것도 출력하지 않는 것처럼 보인다면 (23)과 27 사이의 숫자를 포함하는 모든 라인을 제공합니다. 문자열 일치를 사용하는 awk 솔루션은 동일한 문제를 가지고 있습니다. 따라서 then 날짜 문자열이 로그 파일에서 그대로 발생하지 않으면 메서드가 실패합니다. 날짜 문자열을 숫자 (-, <space>:)로 변환 한 다음 문자열이 아닌 산술 비교를 사용하여 결과 값이 올바른 범위에 있는지 확인해야합니다. 이것은 sed의 기능을 뛰어 넘습니다. awk와 perl은 쉽게 할 수 있습니다. 다음은 펄 솔루션입니다.

#!/bin/bash 

NOW=$(date "+%Y%m%d%H%M%S") 
THEN=$(date -d "-$1 minutes" "+%Y%m%d%H%M%S") 

perl -wne ' 
    if (m/^(....)-(..)-(..) (..):(..):(..)/) { 
    $date = "$1$2$3$4$5$6"; 
    if ($date >= '"$THEN"' && $date <= '"$NOW"') { 
     print; 
    } 
    }' "$2" 
+0

좋아,이 작품. 쉘 도구를 사용하여 상자를 움직이지 않는 것이 싫은 경우입니다. – Gregsen

+0

'sed -e 's/^ \ (.... \) - \ (.. \) - \ (.. \) \ (.. \) : \ (.. \) : \ (.. \)/\ 1 \ 2 \ 3 \ 4 \ 5 \ 6/\ ""$ 2 "| awk '$ 1> =' "$ THEN" '&& $ 1 <=' "$ NOW"| sed -e는/^ \ (.... \) \ (.. \) \ (.. \) \ (.. \) \ (.. \) \ (.. \) \ 2- \ 3 \ 4 : \ 5 : \ 6/'', 전통적인 셸 파이프 라인을 선호하는 경우에는 더 읽기 쉽지 않습니다. – Uwe

1

중첩 된 따옴표가있는 두통을주지 마십시오. 스크립트에 쉘 변수의 값을 전달 awk-v 옵션을 사용

#!/bin/bash 

# Get date 
now=$(date "+%Y-%m-%d %T") 

# Get date minus X number of minutes -- $1 first argument, minutes 
delta=$(date -d "-$1 minutes" +"%Y-%m-%d %T") 

# Filter logs -- $2 second argument, filename 
awk -v n="$now" -v d="$delta" '$0~n,$0~d' $2 

또한 then을 즉 쉘 내장 명령의 변수 이름을 사용하지 않습니다.

+0

나는 약간의 오타 ('-v' 대신'= v')를 고쳤습니다. 불행하게도 출력이 없습니다. – Gregsen

+0

좋은 지점. 그런 다음 문제를 디버깅하고 스크립트에서'echo $ $ $ delta "'를 추가하고 형식이 로그 파일의 형식과 일치하는지 확인하십시오. –

+0

음, 그 말이 올바른 힌트였습니다. 나는 HH : MM : SS에 대한 검사를하고 있기 때문에 로그는 HH : MM : SS, MS입니다. 스크립트는 아무 것도 찾지 못했습니다. 스크립트를'sed -n "/ $ then * /,/$ now */p"$ 2 "로 조정했습니다. awk 명령을 적절하게 적용하는 방법을 잘 모르지만 한 번 적용하면 확실합니다. 작동해야합니다. – Gregsen