Linux에서 텍스트 파일의 모든 일치 항목을 검색하는 방법은 무엇입니까?

Linux에서 텍스트 파일의 모든 일치 항목을 검색하는 방법은 무엇입니까?

검색할 문자열이 23개 있는데 해당 문자열을 파일에 반환하고 싶습니다.

다음 코드를 얻었습니다.

users='User1\|User2\|User3\|User4\|User5\|User6\|User7\|User8\|User9\|User10\|User11\|User12..User23'

원하는 출력:

User1 is in the file
User2 is not in the file
...
User 23 is in the file

어떻게 해야할지 모르겠습니다. 배열을 생각하고 있지만 가능하다면 몇 가지 팁을 얻고 싶습니다. 미리 감사드립니다.

답변1

배열을 사용하십시오:

users=(User1 User2 User3 User4) # et cetera
for i in "${users[@]}"; do
    echo -n "$user is "
    if grep -q "$user" inputfile; then
        echo "present"
    else
        echo "not present"
    fi
done

grep -q검색이 수행되지만 출력이 반환되지 않으므로 if테스트에서 자동으로 사용할 수 있습니다.

또는 각 사용자를 이름이 지정된 파일에 넣은 Users후 다음을 수행할 수 있습니다.

grep -o -f Users inputfile

그러면 본 모든 사용자의 목록이 출력됩니다. 현재 사용자와 부재 사용자를 보려면 다음을 수행하세요.

echo "Users present:"
grep -o -f Users inputfile
echo "Users absent:"
grep -vo -f Users inputfile

답변2

이 시도,

users=( User1 User2 User3 User4 )
for i in "${users[@]}"
do
   grep -qw $i file && echo "$i is in the file" || echo "$i is not in the file"
done

에서 man:

-q, --조용함, --무음

조용합니다. 표준 출력에 아무 것도 쓰지 마십시오. 일치하는 항목이 발견되면 오류가 감지되더라도 상태 0으로 즉시 종료됩니다.

답변3

추가 조정.

users=( User1 User2 User3 User4 )
for i in "${users[@]}"
do
   echo "$i is" $(grep -qw $i file || echo "not") "in the file"
done

답변4

파일을 스캔해 보세요. 이것은 bash입니다.

# the array of user names
users=( User{1..23} )
# an array of grep options: ( -e User1 -e User2 ...)
for u in "${users[@]}"; do grep_opts+=( -e "$u" ); done
# scan the input file and save the user names that are present in the file
readarray -t users_present < <(grep -Fo "${grep_opts[@]}" input | sort -u)
# find the user names absent from the file
# this assumes there are no spaces in any of the user names.
for u in "${users[@]}"; do
     [[ " ${users_present[*]} " == *" $u "* ]] || users_absent+=( "$u" )
done
# and print out the results
printf "%s is in the file\n" "${users_present[@]}"
printf "%s is NOT in the file\n" "${users_absent[@]}"

관련 정보