파이프 및 앰 퍼와 함께 grep을 사용하여 찾기에서 오류 필터링


22

cygwin을 사용하여 cygdrive에서 파일을 찾습니다.

그러나 권한 거부 메시지를 억제해야합니다 (그렇지 않으면 오류 메시지에 결과가 숨겨 짐). 다음 명령이 작동합니다.

find -name 'myfile.*' |& grep -v "Permission denied"

앰퍼샌드 가이 명령에 들어가야하는 이유를 이해하지 못하지만 이것이 작동 할 것으로 예상했지만 작동하지 않습니다.

find -name 'myfile.*' | grep -v "Permission denied"

앰퍼샌드의 의미를 설명하십시오.

답변:


24

유닉스 계열 시스템에는 수정되지 않은 상태로두면 출력이 화면에 전송되는 두 개의 출력 경로가 있습니다. 표준 오류 (또는 표준 오류)는 대부분의 오류와 오류 조건을 캡처하는 오류입니다.

stderr의 권한 거부 메시지를 "일반 출력"과 동일한 출력 스트림으로 전달하려면 둘을 결합해야합니다. 예를 들어, grep -v제대로 작동 하기 위해 stdout (표준 출력)과 stderr을 비전 구문과 결합합니다.

에서 GNU 배쉬 매뉴얼 섹션 3.2.2 파이프 라인 :

' |&'를 사용하면 표준 출력과 함께 command1 의 표준 오류 가 파이프를 통해 command2 의 표준 입력에 연결됩니다 . 에 대한 속기입니다 2>&1 |. 표준 오류를 표준 출력으로 암시 적으로 재지 정하는 것은 명령에 의해 지정된 재 지정 후에 수행됩니다.

또한 geirha가 지적했듯이 stderr 출력을 제거하려면 다음과 같은 작업을 수행하십시오.

find -name 'myfile.*' 2> /dev/null

또는 아마도

find -name 'myfile.*' 2> /tmp/errorlog

또한 find출력을 전달하는 등의 명령 문자열이있는 경우 명령의 xargs모든 구성 요소에서 출력을 캡처하려면 전체 명령 파이프 라인을 괄호 안에 넣어야합니다. 예 :

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

괄호를 생략하고 대신 수행 한 경우-

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

find 또는 egrep에서 권한 거부 오류가 계속 표시되지만 xargs에 대해 stderr이 경로 재 지정됩니다.

보시다시피 테스트 실행 중에 내용을 본 후에 만 ​​stderr를 버릴 것입니다.

GNU find와 POSIX 호환 가능한 한 find, -print옵션은 암시 적입니다. 원하는 경우 명시 적으로 제공 할 수 있습니다.



1
@LukeExton 예. 다른 쉘 2>&1 |에서 대신 사용될 수 있습니다 |&(즉, stderr을 stdout으로 명시 적으로 리디렉션 한 다음 파이프 라인의 다음 명령으로 파이프 할 수 있음).
Eliah Kagan

2> >( grep filter )편리합니다
user1133275


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.