파일 이름에 줄 바꿈이 없으면 grep
grep이 일치하는 파일 이름을 인쇄하고 결과를 계산하여 여러 번의 호출을 피할 수 있습니다 .
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
일치 횟수는입니다 "${#matches[@]}"
.
grep --null -lw
여기 에 사용하는 방법이있을 수 있지만 출력을 구문 분석하는 방법을 모르겠습니다 . Bash var=( array elements )
는 \0
대신 구분 기호 를 사용하는 방법이 없습니다 \n
. bash의 mapfile
내장 기능이 가능할까요? 그러나 구분 기호를로 지정하기 때문에 아마도 아닐 것입니다 -d string
.
가능 count=$(grep -l | wc -l)
하지만 두 개의 외부 프로세스가 있으므로 grep
두 파일을 개별적으로 실행할 수도 있습니다 . ( 개별 프로세스를 시작하기 위해 포크 + 실행 + 동적 링커와 비교할 때 시작 오버 헤드 grep
와 의 차이 wc
는 적습니다.)
또한 일치 하는 파일을 wc -l
찾지 못합니다 .
배열에서 결과를 캡처하면 이미 원하는 결과이거나 정확히 1 개의 일치 항목이있는 경우 첫 번째 입력인지 여부를 확인할 수 있습니다.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
# print the matching filenames
[[ -n $matches ]] && printf 'match in %s\n' "${matches[@]}"
# figure out which input position the name came from, if there's exactly 1.
if [[ "${#matches[@]" -eq 1 ]]; then
if [[ $matches == "$file1" ]];then
echo "match in file1"
else
echo "match in file2"
fi
fi
$matches
는 ${matches[0]}
첫 번째 배열 요소의 약어입니다 .