2012-04-25 2 views
3

파이프와 함께 grep 사용에 문제가 있습니다. 시나리오는 다음과 같습니다 : 화면에 디버그 메시지를 출력 (인쇄 사용)하는 python 스크립트를 실행하고 있습니다. 나는 ./prog | grep "\[\[\[\["을 사용하여 "[[["안에 문자열을 포착합니다. 일치하는 결과는 거의 반환하지 않지만 다른 결과는 반환하지 않습니다 (또 다른 관찰 : grep에서 찾은 결과가 grep에서 찾지 못한 결과보다 먼저 나타납니다). 나는 파이프와 grep없이 ./prog을 돌렸고 "[[[["pattern.grep이 일치하는 모든 패턴을 찾을 수 없습니다. " [ [ [" "

답변

2

오류 메시지는 보통 stderr으로 전송되며 stdout이 아닙니다. 귀하의 파이프는 stdout입니다. (귀하의 "또 다른 관찰은"이 암시.) 당신은 파이프에 stdout와 함께 stderr를 리디렉션 할 수 있습니다 :

./prog 2>&1 | grep '\[\[\[\[' 
+0

미안하지만 분명히 말하지 않았지만 메시지를 인쇄하기 위해 'print'를 사용하고 있다고 말할 때 나는 그 모두가 표준 출력으로 갈 것이라고 생각했습니다. 어쨌든, 나는 당신의 제안도 시도했지만 도움이되지 않았습니다. 다른 아이디어? – user1126425

+0

질문을 자세히 업데이트해야 할 수도 있습니다. 또한 마크 업 도움말 링크를 따라 가면 예제가 HTML로 잘못 해석되지 않습니다. – geekosaur

3

문제는 왼쪽 대괄호는 정규 표현식에서 특수 문자 것입니다. "grep"은 문자열 일치자가 아닙니다. 정규 표현식은 텍스트 패턴을 설명 할 수있는 관련 언어입니다. Grep은 [[[[을 문자열이 아닌 정규 표현식으로 해석하려고합니다.

질문 주제에서 알 수 있듯이 일반적으로 특수 문자는 백 슬래시로 이스케이프 처리 할 수 ​​있습니다. 그래서 다음은 작동 할 수 있습니다 :

./prog | grep '\[\[\[\[' 

당신은 또한 그들에게 내부 대괄호를 넣어 대괄호 "탈출"할 수 있습니다. 따라서 grep 버전에서 처리하는 경우 [[][[][[][[] 또는 [[]{4}입니다.

또한 프로그램이 ./prog의 출력을 "표준 출력"또는 "표준 오류"로 보낼지 여부를 결정해야합니다.

./proc 2>&1 | egrep '[[]{4}' 

UPDATE : 당신과 함께 파이프를 통해 모든 표준 에러를 넣을 수 있습니다

[[email protected] ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | grep '\[\[\[\[' 
[[[[ 
[[[[ 
[[[[[ 
[[email protected] ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | egrep '[[]{4}' 
[[[[ 
[[[[ 
[[[[[ 
[[email protected] ~]$ 

물론, 내 결과가 당신과 일치하지 않습니다. 처리중인 데이터에 대해 더 자세한 정보를 제공 할 수 있다면 결과를 복제하는 데 도움이됩니다.

+0

Ghoti, 답장을 보내 주셔서 감사합니다. 앞서 언급하지는 않았지만 첫 번째 옵션으로 설명한 것처럼 일치 패턴에 이스케이프 시퀀스를 사용하고 있습니다. 그러나 문제는 동일한 패턴을 따르더라도 처음 두 문장이 화면에 인쇄되고 마지막 두 문장은 인쇄되지 않는다는 것입니다. – user1126425

+0

또한 화면에 인쇄 할 때 '인쇄'기능 만 사용하기 때문에 stderr와 아무 관련이 없습니다. 어쨌든, 나는 그런 방식으로 시도해 보았지만 효과가 없었다. 다른 생각은 많이 감사 할 것입니다. – user1126425

+0

@ user1126425 - 내가 제공 한 답변은 귀하의 질문에서 세부 사항의 양을 고려할 때 내가 생각해 낼 수있는 최선입니다. 결과를 복제 할 수 있도록 예제 데이터로 질문을 업데이트 할 수 있다면 문제가 무엇인지 파악할 수 있습니다. 그것이 그대로, 이것은 제가 갈 수있는 한입니다. – ghoti

관련 문제