나는 외부 프로그램을 사용하여 스트림 라인을 필터링하는 프로그램을 찾고 있습니다. grep
이 프로그램의 거의 버전은 각 라인에 대해 지정된 프로그램이 0 종료 코드(예: find
의 -exec
옵션 )로 종료되었는지 여부를 기반으로 합니다. ).
루프와 서브쉘을 사용하여 쉘에서 이 작업을 수행할 수 있다는 것을 알고 있습니다.
some-program |(while read line; do
if predicate "$line"; then
echo "$line"
fi
done)
이 작업을 더 쉽게 할 수 있는 프로그램이 있는지 궁금합니다.
some-program |filter predicate
# want negation as well
some-program |filter ! predicate
향상된 Sed가 "패턴 공간을 통과합니까?"라고 질문하면서 이를 지원할 수 있다고 생각할 수도 있지만 GNU Sed에는 그러한 기능이 없는 것 같습니다.
아직 찾지 못한 프로그램이 있습니까? 아니면 쉘(또는 Perl)에서 실행해야 합니까?
답변1
쉘은 이 작업을 위한 훌륭한 도구입니다. 공백과 백슬래시를 끊지 않도록 주의하세요.
while IFS= read -r line; do
if predicate "$line"; then printf '%s\n' "$line"; done
done
awk를 사용할 수도 있습니다. 각 줄이 셸에 전달될 때 인용해야 합니다(아래 코드 조각은 줄 주위에 작은따옴표를 배치하고 줄의 작은따옴표를 '\''
; is 로 바꿉니다 ). 모든 명령 호출은 셸을 통과하기 때문에 awk가 행을 구문 분석하는 데 더 빠를지라도 이것이 순수한 셸 접근 방식보다 느릴 것으로 예상됩니다. 하지만 아직 벤치마크를 해본 적은 없습니다.\047
'
awk '{quoted=$0; gsub(/\047/, "\047\\\\\047\047")}
!system("predicate \047" $0 "\047")'