grep 명령의 문자열 검색을 if 문에 어떻게 넣나요?

grep 명령의 문자열 검색을 if 문에 어떻게 넣나요?

두 파일에서 여러 문자열을 검색하고 싶습니다. 두 파일 모두에서 문자열이 발견되면 해당 문자열로 뭔가를 하십시오. 문자열이 하나의 파일에서만 발견되면 다른 작업을 수행하십시오.

내 명령은 다음과 같습니다.

####This is for the affirmative sentence in both files
if grep -qw "$users" "$file1" && grep -qw "$users" "$file2"; then

####This is for the affirmative sentence in only one file, and negative for the other one
if grep -qw "$users" "$file1" ! grep -qw "$users" "$file2"; then

진술을 거부하고 확인하는 올바른 방법이 있습니까? pd 저는 KSH 쉘을 사용하고 있습니다.

미리 감사드립니다.

답변1

또 다른 옵션:

grep -qw -- "$users" "$file1"; in_file1=$?
grep -qw -- "$users" "$file2"; in_file2=$?

case "${in_file1},${in_file2}" in
    0,0) echo found in both files ;;
    0,*) echo only in file1 ;;
    *,0) echo only in file2 ;;
      *) echo in neither file ;;
esac

답변2

이 시도:

if grep -wq -- "$user" "$file1" && grep -wq -- "$user" "$file2" ; then
   echo "string avail in both files"
elif grep -wq -- "$user" "$file1" "$file2"; then
   echo "string avail in only one file"
fi
  • grep 여러 파일에서 패턴을 검색할 수 있으므로 OR/NOT 연산자를 사용할 필요가 없습니다.

답변3

n=0

#Or if you have more files to check, you can put your while here. 
grep -qw -- "$users" "$file1" && ((n++))
grep -qw -- "$users" "$file2" && ((n++))

case $n in 
   1) 
       echo "Only one file with the string"
    ;;
   2)
       echo "The two files are with the string"
   ;;
   0)
       echo "No one file with the string"
   ;;
   *)
       echo "Strange..."
   ;;
esac 

참고: ((n++))ksh 확장자입니다( zsh및 에서도 지원됨 bash). POSIX sh구문에서는 으로 변경해야 합니다 n=$((n + 1)).

답변4

파일 이름에 개행 문자가 포함되어 있지 않으면 grepgrep이 일치하는 파일 이름을 인쇄하고 결과를 계산하도록 하여 여러 호출을 피할 수 있습니다.

 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 )사용할 수 있는 방법이 없습니다 . 어쩌면 bash의 내장 기능이 이것을 할 수 있을까요? 그러나 아마도 그렇지 않을 것입니다. 로 구분 기호를 지정했기 때문입니다 .\0\nmapfile-d string


가능 하지만 두 개의 외부 프로세스가 있으므로 두 파일을 별도로 실행하는 count=$(grep -l | wc -l)것이 좋습니다 . (시작 오버헤드와 시작 오버헤드 의 차이는 grep별도의 프로세스를 시작하는 fork+exec + 동적 링커에 비해 작습니다 .)grepwc

그리고 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]}첫 번째 배열 요소의 약어입니다.

관련 정보