2014-10-15 7 views
0

다양한 대형 로그 파일의 일부 항목을 검사하는 해킹 스크립트가 있습니다. perl과 bash가 혼합되어 있습니다. 제대로 작동합니다. 스크립트는 필요한 부분을 얻습니다. . 유일한 문제는 "$ chdk_subscription"형식입니다. 키워드로 출력을 구분하려고했습니다. 'STATS'및 'added'. 이 두 단어는 각 줄의 시작과 끝에 있으며 읽고 싶습니다. 'IFS'에 의해 "$의 chdk_subscription"를 끊기bash에서 에코 출력 포맷하기

#!/bin/bash 
pid_foo_process=$(pgrep foo_process) 
check_primary=$(grep $1 /data/foo_process-0210.$pid_foo_process.log | perl -nle 'print /(primary book \w+:\w+)/ ') 
check_primary_symbol=$(grep $1 /data/foo_process-0210.$pid_foo_process.log | perl -nle 'print /primary book (\w+:\w+)/ ') 
chdk_subscription=$(grep $1 /data/foo_process-0210.$pid_foo_process.log | perl -nle 'print if /(subscription for \w+:\w+.*)/ ') 
echo $check_primary 
echo $check_primary_symbol 

IFS="STAT" 
while read line 
echo $line 
done < echo $chdk_subscription 

는 AWK가 작동하지 않는 사용

echo $chdk_subscription| awk -F"STATS" '{print $0}' 

작동하지 않는 것 중 하나 -가없는 줄 바꿈과 하나 개의 큰 라인으로 나올 때마다.

STATS 10/15 08:03:09.391048 32978 (0)SB: subscription for APA:T added STATS 10/15 08:03:09.391164 32978 (0)SB: subscription for APA:P added STATS 10/15 08:03:09.391226 32978 (0)SB: subscription for APA:Z added STATS 10/15 08:03:09.391537 32978 (0)SB: subscription for APA:n added STATS 10/15 08:03:09.391599 32978 (0)SB: subscription for APA:A added STATS 10/15 08:03:09.391686 32978 (0)SB: subscription for APA:a added STATS 10/15 08:03:09.391756 32978 (0)SB: subscription for APA:K added STATS 10/15 08:03:09.391818 32978 (0)SB: subscription for APA:J added STATS 10/15 09:38:12.826928 32978 (0)SB: subscription for APA:N, XNYSAPA:3 added 

나는 이것을 읽을 수있는 뭔가를 원한다.

STATS 10/15 08:03:09.391048 32978 (0)SB: subscription for APA:T added 
STATS 10/15 08:03:09.391164 32978 (0)SB: subscription for APA:P added 
STATS 10/15 08:03:09.391226 32978 (0)SB: subscription for APA:Z added 
STATS 10/15 08:03:09.391537 32978 (0)SB: subscription for APA:n added 
STATS 10/15 08:03:09.391599 32978 (0)SB: subscription for APA:A added 
STATS 10/15 08:03:09.391686 32978 (0)SB: subscription for APA:a added 
STATS 10/15 08:03:09.391756 32978 (0)SB: subscription for APA:K added 
STATS 10/15 08:03:09.391818 32978 (0)SB: subscription for APA:J added 
STATS 10/15 09:38:12.826928 32978 (0)SB: subscription for APA:N, XNYSAPA:3 added 
+1

이미 제시된 예상 출력에 해당하는 필터링 전에 어떻게 보이는지 예를 들려 주시겠습니까? – Rein

+1

나는 당신이하려고하는 것에 대한 세부적인 것을 드러내지는 않지만 중요한 한 가지 : 견적! 'echo $ line' ** ** echo와 동일하지 않습니다 $ line "'; 전자는 개행 문자를 공백 문자로 바꾸고, glob 표현식을 확장하고, 거의 확실하게 원하지 않는 형식으로 다른 종류의 혼란을 일으킬 것입니다. –

+0

또한,'\ n '이 두 문자에서 단일 개행으로 바뀐 것처럼 역 슬래시 이스케이프 시퀀스를 구문 분석하지 않으려면'read -r'을 사용하고'read'를 사용하지 마십시오. –

답변

1

여러 행을 bash 변수로 읽는 대신 임시 파일을 사용하는 것이 더 좋습니다.

temp_file=$(mktemp) 

if [ 0 -eq $? ]; then 
    trap 'rm -f -- "${temp_file}"' 0 
else 
    echo "Unable to create temporary file!" 
    exit 1 
fi 

# Fill temporary file. 
pid_foo_process=$(pgrep foo_process) 
grep $1 /data/foo_process-0210.${pid_foo_process}.log | perl -nle 'print /(primary book \w+:\w+)/ ' >>"${temp_file}" 
grep $1 /data/foo_process-0210.${pid_foo_process}.log | perl -nle 'print /primary book (\w+:\w+)/ ') >>"${temp_file}" 
grep $1 /data/foo_process-0210.${pid_foo_process}.log | perl -nle 'print if /(subscription for \w+:\w+.*)/ ' >>"${temp_file}" 

# Print contents. 
while read line 
    echo "${line}" 
done < "${temp_file}" 

상단의 trap 문은 스크립트가 끝날 때 임시 파일을 자동으로 삭제합니다.

+0

좋은 인용. :-) – amphetamachine

+0

대폭 개선되었습니다. 나는'read -r'을 사용할 것을 제안 할 것입니다. 그렇지 않으면 특별한 이유가 있습니다. 또한,'read' 연산 중에 IFS를 지우지 않으면 후행 공백이 제거됩니다. –

+0

@amphetamachine - 감사합니다 : D –

0
awk 'BEGIN { RS=" ?STATS "} NR > 1 {print "STATS "$0}' 

RS = "기록"은 그 후 공간 그 앞에 제로 하나 공백 어떤 통계를 잡고, 세퍼레이터이다. 이 구분 기호는 첫 번째 빈 레코드가됩니다. NR은 레코드 번호이므로 NR> 1은 첫 번째 레코드를 무시합니다.