2013-03-28 2 views
0

은 내가이 패턴과 일치하는이 파일의 라인을 추출하기 위해 필요한이문제는

%name=ABC 
%value=123 
sample text in file 
sample text in file 
%name=XYZ 
%value=789 
sample text in file 

같은 내용을 가진 파일 "INPUT_FILE"가 grep을.

str="%name=*\n%value=*" 

나는이 방법

gawk -v st=$str '/"$st"/ {print}' $Input_file 

내가

grep -e "$str" $Input_file 

같이해도 그렙에 오류

gawk:   ^backslash not last character on line 

납니다을가 그런 없다 말한다 일하고 있었다 일치하는 패턴. 나는 어디가 잘못 됐어.

+0

-'grep'은 그래서 여러 패턴이 일치하지 않습니다, 라인 지향 . 둘째 -'gawk'는 기본적으로 줄 중심입니다. 따라서 여러 줄 패턴을 일치 시키려면 [레코드 구분 기호'RS'] (http://www.gnu.org/software/gawk/)를 설정해야합니다. manual/gawk.html # 기록)을 적절한 것으로 수정하십시오. 세 번째로 - 디버깅을 위해서 Bash 변수를 사용하는 대신 gawk 명령을 직접 작성하는 것이 더 낫다고 생각합니다 (예 :'gawk '/ % name = * \ n % value = */{print}'). 후자의 경우 AWK 또는 Bash쪽에 문제가 있는지 여부를 알기가 어려울 수 있습니다. – ruakh

+0

네 번째 -'= * '는 "0 개 이상의 등호"를 의미합니다. "등호 , 플러스 0 개 이상의 문자 ",'=. *'를 쓰십시오. – ruakh

답변

2

이 시도 :

grep -A1 "^%name=" $Input_file | grep -B1 "^%value=" | grep -v "^--" 
+2

'% name ='과'% value ='가 샘플 텍스트에 나타나면'grep - A1 : "^ % name ="$ Input_file | grep -B1 "^ % value ="| grep -v "^ -"'그것은 잔인 할 수 있습니다 ... – ToddR

+0

@ToddR 사실. 패턴도 있지만, 그 다음 잊어 버렸습니다. –

0

당신은 당신의 $ str을 변수에 다른 구문을 사용할 수 있으며, '*'둔한를 들어, 리터럴 값을 패턴을하지 찾고 있기 때문에 쓸모가 그럴 수 없어 죄송

이 시도 도움 : 검색

str="\%name=|\%value=" 
egrep $str $input_file 

그래서 당신은 당신의 두 가지 기준을 일치시킬 수 있습니다

+0

이 작업은 다른 작업을 수행합니다. ** 이름이 ** 인접한 행이 아니더라도 모두 "name ="및 "value ="를 찾습니다. – Kent

+0

필요하다 구문 분석은 항상 쌍을 이룬다. 어쩌면 내 접근 방식이 너무 단순하다. – Diego

1

awk에서 직접 "패턴 (str)"을 사용할 수 없습니다. 왜냐하면 awk default는 여러 줄 모드에서 작동하지 않기 때문입니다. 위의 한 줄의 출력 귀하의 예제와

awk '/^%name=/{n=$0;next}/^%value=/&&n{print n"\n"$0}{n=""}' file 

: : 당신이 AWK이 할 수 그러나 첫째

%name=ABC 
%value=123 
%name=XYZ 
%value=789