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[@]}"

関連情報