명령 실행 결과를 기반으로 텍스트 스트림을 필터링하는 표준 도구가 있습니까?
grep
예를 들어 이것을 고려하십시오. 정규식을 기반으로 텍스트 스트림을 필터링할 수 있습니다. 그러나 더 일반적인 문제는 필터를 확장하는 것입니다. 예를 들어, 특정 기준과 일치하는 모든 파일을 선택하거나( find
사용 가능한 검사가 엄청나게 많지만 어쨌든 하위 집합임) 다른 프로그램을 사용하여 데이터를 필터링할 수 있습니다. 다음 파이프라인을 고려해보세요.
produce_data | xargs -l bash -c '[ -f $0 ] && ping -c1 -w1 $1 && echo $0 $@'
전혀 쓸모가 없지만 일반적인 접근 방식을 제공합니다. bash oneliner를 사용하여 각 줄을 테스트할 수 있습니다. 이 예에서는 기존 파일과 액세스 가능한 호스트로 구성된 행을 원합니다. 나는 이 작업을 수행하는 표준 도구를 원합니다.
produce_data | super_filter -- bash -c '[ -f $0 ] && ping -c1 -w1 $1'
다음과 함께 쉽게 사용할 수 있습니다 find
.
find here | super_filter -- test -r
find
제가 항상 잊어버린 특정 플래그 대신 일반 도구를 사용하여 파일을 필터링하는 방법에 주목하세요 .
보다 현실적인 예는 특정 기호가 포함된 개체 파일을 찾는 것입니다. 이러한 도구는 도움이 될 것입니다.
따라서 super_filter
모든 조건 검사기는 스트리밍 모드에서 실행될 수 있습니다. 구문은 in xargs
또는 와 유사할 수 있습니다 parallel
.
답변1
추가하면 GNU 병렬이 작동하지 않습니까 && echo
?
... | parallel 'test -r {} && echo {}'
답변2
while read
방법(순수한 bash)
while read
입력을 한 줄씩 처리하기 위한 일반적인 관용어입니다(파일의 줄을 반복하는 방법은 무엇입니까?). echo
원래 입력 라인에 대한 검사 및 조건부 작업을 수행합니다.
... | while IFS= read -r line; do test -r "$line" && echo "$line"; done
특별한 경우:find
find
-exec
임의의 작업을 수행하고 발견된 파일을 확인하는 작업이 있습니다 .
에서 man find
:
-exec command ; Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current file name be‐ ing processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory. There are unavoid‐ able security problems surrounding use of the -exec action; you should use the -execdir option instead.
예:
find here -exec test -r {} \; -print
-exec
작업은 기본 -print
작업을 재정의 하므로 -print
명시적으로 지정해야 합니다. 이 동작은 find(1) 매뉴얼 페이지의 EXPRESSION 섹션에 설명되어 있습니다. 추가 처리를 적용하려면 대신 -print0
+를 사용하세요 .xargs --null
-print