ファイルに文字列がない場合にgrepを使用する方法

ファイルに文字列がない場合にgrepを使用する方法

私のbashスクリプトでファイルに特定の文字列がない場合は、行を印刷しようとしています。

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

文字列がファイルに存在するようにするには、次のように書くことができますが、/etc/passwdファイルにユーザーが見つからない場合は、「ユーザーが存在しません」と印刷するように変更するにはどうすればよいですか?

答え1

grepパターンのインスタンスが1つ以上見つかった場合は成功を返し、何も見つからない場合は失敗を返します。したがって、else「はい」と「いいえ」の両方を印刷するには、句を追加するか、条件を直接否定してif失敗のみを取得できます。それぞれの例:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi

答え2

あなたはそれを使用することができますgrep オプション "-L/--files-without-match"、ファイルに文字列が含まれていないことを確認してください。

if [[ $(grep -L "$user2" /etc/passwd) ]]; then   
  echo "User does not exist!!"; 
fi

答え3

別のアプローチは、終了状態を見つけることですgrep。たとえば、

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

grep一致するものが見つからない場合は終了するため終了し1ます。成功すると常に返されます。だから使いやすいです。$?1grep0$? != 0$? == 1

答え4

簡単な1行のコードで問題を解決しました。

for f in *.txt; do grep "tasks:" $f || echo $f; done

このコマンドは、ディレクトリ内のtxt拡張子を持つすべてのファイルを確認し、見つかった場合は検索文字列(「task:」など)を記録し、それ以外の場合はファイル名を記録します。

関連情報