2013-11-01 4 views
0

로그 파일을 처리하는 데 도움이되는 스크립트를 작성하고 있습니다. 그것에, 내 grep 플래그를 변수에 저장되어 있습니다. 플래그와 문자열 자체는 잘 작동하지만 변수를 사용하여 grep에 전달할 때 이스케이프 된 문자를 사용하는 문자열 부분은 일치 항목을 생성하지 않습니다. 아래를 참조변수에서 오는 grep이 문자열과 일치하지 않습니다.

grepvars="-B4 -Psihe 'caused\sby|unable|fault|error|deadlock|checkpoint|corrupt|fail|exception|fatal|severe|\tat\s'" 
grep -B4 -Psihe 'caused\sby|unable|fault|error|deadlock|checkpoint|corrupt|fail|exception|fatal|severe|\tat\s' adapter_15.log > adapter_15-error1.log 
grep $grepvars adapter_15.log > adapter_15-error2.log 
wc -l *-error?.log 
    51398 adapter_15-error1.log 
    25032 adapter_15-error2.log 

당신이 볼 수 있듯이, \ 문신 grep을하기 위해 변수를 통해 전달 될 때 일치하는 항목을 생성하지 않습니다 \의 일부입니다. 일치해야하는 것은 (리터럴 공간에서) (리터럴 탭)입니다. 이 변수를 사용하지 않고 제대로 작동하지만, 내 복수 grep 호출을 관리하기 쉽게하기 때문에 하나를 사용하고 싶습니다. grep이 변수를 통과 할 때이 일치를 올바르게 수행하도록하려면 어떻게해야합니까?

+0

'egrep' /'grep -E'를 대신 쓰면 어떨까요? – fedorqui

+0

변수를 확장 할 때 따옴표가 처리되지 않습니다. – Barmar

+1

그것은 나를 위해, grep -E 또는 egrep을 사용하여 작동합니다. – michael501

답변

1

어떤 행운을 보지도 못했지만, 해결 방법을 찾았습니다. 필요한 경우 함수를 만들고 호출하십시오.

grep4j() { 
unset IFS 
nice -n 15 grep -B3 -Psihe '\tat\s|caused\sby|unable|fault|error|deadlock|checkpoint|corrupt|fail|exception|fatal|severe' $1 
IFS=$'\n' 
} 

예, 나는 이전과 가변적이고을 사용하고 있던 그렙 문자열 후 IFS를 설정 해제하려고 않은 : 여기에 내가 무엇을 최대 온입니다. 그것은 작동하지 않았다 (그리고 나는 다른 것들이 작동하도록 설정되어 있어야한다). 이 같은 기능을 수행하는 것은 내 필요를 충족 시켰고 아마도 다른 사람에게도 도움이 될 것입니다. 건배!

궁금한 점이 있다면, 이것은 log4j 형식의 로그에서 관련 메시지를 가져 오도록 설계되었습니다. 그것은 나에게 많은 시간을 절약 해 준다.

0

당신은 문자열의 grep 모든 옵션을 저장하는 경우는 당신이 악을 사용할 필요가 생각 eval :

str="grep $grepvars adapter_15.log > adapter_15-error2.log" 
eval "$str" 
+1

괄호 제거 - eval은 함수가 아닌 명령문입니다. – Barmar

+0

@Barmar : 고마워, 네가 맞아. JS로부터의 나쁜 습관, PHP가 쉘 스크립트에 오는 것 같아요. – anubhava

+1

@anubhava : 고마워. 내가 선택한 해결책이 아니지만 올바른 방향으로 나를 지적하고 기능을 사용하는 아이디어를 주었다. – MrDrMcCoy

0

그것은 환경에 변수 GREP_OPTIONS 및 패턴 물건 옵션에보다 쉽게 ​​할 수있다 다음과 같은 파일 :

+0

외부 파일 종속성을 피하려고 노력하고 있지만 필자는이를 고려할 것입니다. – MrDrMcCoy

관련 문제