web-dev-qa-db-ja.com

ファイルに文字列が含まれていない場合のgrepの使用方法

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

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

これは、文字列をファイルに存在させたい場合に書いた方法ですが、/ etc/passwdファイルにユーザーが見つからない場合に、「ユーザーが存在しない」と表示されるように変更するにはどうすればよいですか?

29
Chirag Vijay

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
53
Eric Renouf

別の方法は、grepの終了ステータスを探すことです。例えば:

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

grepが一致を見つけられなかった場合、1は終了するため、$?1になります。 grepは、成功すると常に0を返します。したがって、$? != 0よりも$? == 1を使用する方が安全です。

2
ssanch

grepオプション "-L/--files-without-match" を使用して、ファイルに文字列が含まれていないかどうかを確認できます。

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

私は簡単なワンライナーでそれを解決します:

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

コマンドは、拡張子がtxtのディレクトリ内のすべてのファイルをチェックし、見つかった場合は検索文字列(つまり、「タスク:」)を書き込むか、ファイルの名前を書き込みます。

1
matrik