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


26

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

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

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

回答:


49

grepパターンのインスタンスが少なくとも1つ見つかった場合は成功を返し、見つからない場合は失敗を返します。したがってelse、「does」と「does not」の両方を印刷する場合は句を追加するか、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。例えば:

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

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


これは本当にエリックが言ったことを言う長い方法です。
ジェフシャラー

まあ、私にとって否定的なif ! grep ...声明はうまくいきませんでした。したがって、これは代替です。
sansan

1

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

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.