Dosya dizge içermediğinde grep nasıl kullanılır


26

Bash betiğimde bir dosyada belirli bir dize yoksa bir satır basmaya çalışıyorum.

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

Bu, dizede dosyada bulunmasını istiyorsam nasıl yazdım, ancak kullanıcı / etc / passwd dosyasında bulunmazsa, "kullanıcı yok" u yazdırmak için bunu nasıl değiştirebilirim?

Yanıtlar:


49

grepDesenin en az bir örneğini bulursa başarıyı ve eğer olmazsa başarısızlığı verir. Böylece elsehem "yapar" hem de "yok" yazdırmak istiyorsanız ya da sadece ifbaşarısızlık almak için koşulu olumsuzlayabilirsiniz . Her birine bir örnek:

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

Alternatif olarak, çıkış durumunu aramaktır grep. Örneğin:

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

Eğer grepbu çıkılacak bir eşleşme bulmak için başarısız 1, bu yüzden $?olacak 1. başarılı grepolursa her zaman geri döner 0. Bu yüzden kullanmak $? != 0daha güvenlidir $? == 1.


bu gerçekten Eric’in söylediklerini söylemenin daha uzun bir yolu .
Jeff Schaller

Benim için olumsuz if ! grep ...ifade işe yaramadı. Yani bu bir alternatif.
ssanch

1

Basit bir astarla çözüyorum:

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

Komut, dizindeki tüm dosyaları txt uzantılı olarak kontrol eder ve eğer bulunursa ya da başka bir deyişle, arama dizesini yazar (ya da "görevler:") yazar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.