Bash kullanarak bir dosyanın belirli bir dize içerip içermediğini kontrol etme


Yanıtlar:


466
if grep -q SomeString "$File"; then
  Some Actions # SomeString was found
fi

[[ ]]Burada ihtiyacın yok. Sadece komutu doğrudan çalıştırın. -qBulunduğunda görüntülenen dizeye ihtiyacınız olmadığında seçenek ekleyin .

grepKomut arama sonucuna göre çıkış kodu 0 veya 1 değerini döndürür. Bir şey bulunursa; 1 aksi takdirde.

$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0

Komutlarını bir koşulu olarak belirtebilirsiniz if. Komut çıkış kodunda 0 döndürürse, koşulun doğru olduğu anlamına gelir; aksi halde yanlış.

$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$

Gördüğünüz gibi burada programları doğrudan çalıştırıyorsunuz. Ek []veya yok [[]].


grepAsnwer için daha fazla bilgi ve mevcut seçenekler stackoverflow.com/a/4749368/1702557
Pawel


3
-m 1tarama performansını artırmak için kullanmayı düşünün . İlk olayı döndürür.
AlikElzin-kilaka

1
eğer SomeStringnormal ifadedeki özel karakterler içeren (gibi .) beklenmeyen sonuçlar alabilirsiniz. Her zaman fgrep(veya grep -F) kullanmak daha güvenlidir (gerçekten bir regex'e ihtiyacınız yoksa, bu durumda egrep(veya grep -E) muhtemelen en iyi seçimdir)
Walter Tross

ifYalnızca çıkış kodunun 0 dışında olup olmadığını kontrol ettiğinden örnek örnek yanlıştır. Dosya okunamıyor gibi herhangi bir hata oluşursa, çıkış kodu da 0 değildir. Yani böyle bir şey yapmalı ec=$?ve bunun 0(bulunup bulunmadığını), sonra 1(bulunamadığını) ve sonra başka bir şey olup olmadığını (başarısız) kontrol etmelisiniz .
ddekany

40

İstediğiniz şeyi nasıl yapacağınızı söyleyen diğer cevaplara ek olarak, neyin yanlış olduğunu açıklamaya çalışıyorum (bu da istediğiniz şeydir.

Bash'de, ifbir komutla takip edilir. Bu komutun çıkış kodu 0'a eşitse, thenparça yürütülür, elsevarsa yürütülür.

Bunu diğer cevaplarda açıklandığı gibi herhangi bir komutla yapabilirsiniz: if /bin/true; then ...; fi

[[dosya varlığı, değişken karşılaştırmaları gibi bazı testlere ayrılmış dahili bir bash komutudur. Benzer şekilde [, /usr/bin/[kabaca aynı testleri gerçekleştiren ancak ]son bir argüman olarak ihtiyaç duyan harici bir komut (tipik olarak bulunur ) , bu yüzden ]solda bir boşlukla doldurulmalıdır, ki durum böyle değildir ]].

Burada gerek [[ne de [.

Başka bir şey, şeyleri alıntılama şeklidir. Bash'da, çift tırnakların yuvalandığı tek bir durum vardır "$(command "argument")". Ama 'grep 'SomeString' $File'sadece bir kelimeniz var, çünkü 'grep 'birleştirilmiş bir birimdir, birleşik bir birimdir SomeStringve sonra tekrar birleştirilir ' $File'. $FileTek tırnak kullanımı nedeniyle değişkenin değeri bile değiştirilmez. Bunu yapmanın doğru yolu grep 'SomeString' "$File".


15

Eğer dosya yok olmadığını kontrol etmek istiyorsanız durumda değil belirli bir dize içeren, bunu aşağıdaki gibi yapabilirsiniz.

if ! grep -q SomeString "$File"; then
  Some Actions # SomeString was not found
fi

10
##To check for a particular  string in a file

cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME  
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi

2
Dizini değiştirmek genellikle iyi bir fikir değildir (ve burada tamamen gereksizdir, sadece dosya adını hedef dizine uygun hale getirin). Ve sonra sahip olduğunuz şey, sadece daha az ayrıntıyla, kabul edilen cevapla aynı şeydir.
Mat

Tavsiye için teşekkürler Mat
Nevin Raj Victor

7

En kısa (doğru) sürüm:

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"

olarak da yazılabilir

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"

ancak bu durumda açıkça test etmenize gerek yoktur, bu nedenle:

grep -q "something" file && echo "yes" || echo "no"

3
if grep -q something file; then echo yes; else echo no; fi. Hiç uğraşmak için bir sebep yok $?.
Charles Duffy

6

Dizenin tüm satırla eşleşmesini istiyorsanız ve sabit bir dize ise, bu şekilde yapabilirsiniz

grep -Fxq [String] [filePath]

misal

 searchString="Hello World"
 file="./test.log"
 if grep -Fxq "$searchString" $file
    then
            echo "String found in $file"
    else
            echo "String not found in $file"
 fi

Man dosyasından:

-F, --fixed-strings

          Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of 

which is to be matched.
          (-F is specified by POSIX.)
-x, --line-regexp
          Select only those matches that exactly match the whole line.  (-x is specified by 

POSIX.)
-q, --quiet, --silent
          Quiet; do not write anything to standard output.  Exit immediately with zero 

status  if  any  match  is
          found,  even  if  an error was detected.  Also see the -s or --no-messages 

option.  (-q is specified by
          POSIX.)

6
grep -q [PATTERN] [FILE] && echo $?

0Desen bulunursa çıkış durumu (true) olur; aksi takdirde körleme.


4
if grep -q [string] [filename]
then
    [whatever action]
fi

Misal

if grep -q 'my cat is in a tree' /tmp/cat.txt
then
    mkdir cat
fi

2

Bunu dene:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi

3
Kararsızlıktan kaçınıyorum, ancak Stack Overflow bu tür pretzel mantığını sürdürmemelidir. grepçok iyi bir nedenle çıkış durumunu döndürür; çıktıyı bir dizgiye yakalamak, arabellekte büyük miktarda metin depolayacaktır, böylece boş olmadığını söyleyebilirsiniz.
Üçlü

-1

Bunu yaptım, iyi çalışıyor gibi görünüyor

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi

Alıntı bozuldu ve muhtemelen çıktıyı görmekten kaçınmak istiyorsunuz grep.
üçlü

-3
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"

1
Yazım hatası var -!? $ olması gerekiyordu?
lzap

... sadece amaçlanan değil $?, aynı zamanda buna da gerek yokif grep -q ...
Charles Duffy

1
Dahası, foo && truthy_action || falsey_actiongerçek bir üçlü operatör değildir - truthy_actionbaşarısız olursa, ek olarakfalsey_action çalıştırılır .
Charles Duffy

Daha genel olarak amacı , ifbir komutu çalıştırmak ve çıkış kodunu kontrol etmektir. Çok nadiren $?açıkça incelemelisiniz .
tripleee
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.