Cara menggunakan grep saat file tidak mengandung string

26

Dalam skrip bash saya, saya mencoba untuk mencetak garis jika string tertentu tidak ada dalam file.

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

Ini adalah bagaimana saya menulisnya jika saya ingin string ada di file tetapi bagaimana saya bisa mengubah ini untuk membuatnya mencetak "pengguna tidak ada" jika pengguna tidak ditemukan dalam file / etc / passwd?

Chirag Vijay
sumber

Jawaban:

49

grepakan mengembalikan kesuksesan jika menemukan setidaknya satu contoh dari pola dan kegagalan jika tidak. Jadi Anda bisa menambahkan elseklausa jika Anda ingin keduanya "tidak" dan "tidak" dicetak, atau Anda bisa meniadakan ifkondisi hanya untuk mendapatkan kegagalan. Contoh masing-masing:

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
Eric Renouf
sumber
2

Alternatifnya adalah mencari status keluar dari grep. Sebagai contoh:

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

Jika grepgagal menemukan kecocokan maka akan keluar 1, demikian $?juga halnya 1. grepakan selalu kembali 0jika berhasil. Jadi lebih aman untuk digunakan $? != 0daripada $? == 1.

ssanch
sumber
ini benar-benar cara yang lebih lama untuk mengatakan apa yang Eric katakan .
Jeff Schaller
Nah, bagi saya if ! grep ...pernyataan negatif itu tidak berhasil. Jadi ini merupakan alternatif.
ssanch
1

Saya menyelesaikannya dengan liner sederhana:

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

Perintah akan memeriksa semua file dalam direktori dengan ekstensi txt dan menulis string pencarian (yaitu "tugas:") jika ditemukan atau nama file tersebut.

matrik
sumber
0

Anda dapat menggunakan opsi grep "-L / --files-without-match" , untuk memeriksa apakah file tidak mengandung string:

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