Yanıtlar:
grep -Fxq "$FILENAME" my_list.txt
Ad bulunursa çıkış durumu 0 (true), değilse 1 (false) olur, bu nedenle:
if grep -Fxq "$FILENAME" my_list.txt
then
# code if found
else
# code if not found
fi
Man sayfasınıngrep
ilgili bölümleri :
grep [options] PATTERN [FILE...]
-F
,--fixed-strings
PATTERN'i, herhangi biri eşlenecek olan yeni satırlarla ayrılmış sabit dizelerin bir listesi olarak yorumlayın.
-x
,--line-regexp
Yalnızca tüm çizgiyle tam olarak eşleşen maçları seçin.
-q
,--quiet
,--silent
Sessiz; standart çıktıya hiçbir şey yazmayın. Herhangi bir eşleşme bulunursa, bir hata tespit edilse bile hemen sıfır durumuyla çıkın. Ayrıca
-s
veya--no-messages
seçeneğine bakın.
Yorumlarda doğru bir şekilde belirtildiği gibi, yukarıdaki yaklaşım hata durumlarını sessizce dize bulunmuş gibi ele alır. Hataları farklı bir şekilde işlemek istiyorsanız, -q
seçeneği atlamanız ve hataları çıkış durumuna göre tespit etmeniz gerekir :
Normalde, seçilen satırlar bulunursa çıkış durumu 0, aksi takdirde 1 olur. Ancak,
-q
veya--quiet
veya--silent
seçeneği kullanılmazsa ve seçilen bir satır bulunmazsa , bir hata oluşursa çıkış durumu 2'dir . Bununla birlikte, bu gibi programlar için POSIX sadece görev,grep
,cmp
, vediff
, hata durumunda çıkış durumu 1'den büyük olması; bu nedenle, taşınabilirlik uğruna, 2 ile sıkı eşitlik yerine bu genel durumu test eden mantık kullanılması tavsiye edilir.
Kaynağındaki normal çıktıyı bastırmak için grep
adresine yönlendirebilirsiniz /dev/null
. Standart hatanın yönlendirilmeden kaldığına dikkat edin, bu nedenle grep
yazdırabilecek hata iletileri konsolda muhtemelen istediğiniz gibi sonuçlanacaktır.
Üç vakayı ele almak için bir case
ifade kullanabiliriz :
case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
0)
# code if found
;;
1)
# code if not found
;;
*)
# code if an error occurred
;;
esac
$?
. if
ifadenin yanında grep komutunu da kullanabilirsiniz (güncellenmiş yanıtta gösterildiği gibi).
grep -Fqx "$FILENAME"
ve değişken içeriği regex karakterler hakkında endişe gerekmez ve arama dizede bunları kullanmak zorunda olmayacaktır.
-q / --silent
gerekli mi? Bir hata oluşsa bile yanlış bir şekilde bash için "hepsi iyi" diyor. Eğer bunu doğru anladıysam. Bu dava için kusurlu bir kavram gibi görünüyor.
Aşağıdaki çözümle ilgili olarak:
grep -Fxq "$FILENAME" my_list.txt
Merak ediyorsanız (yaptığım gibi) -Fxq
düz İngilizce'de ne anlama gelir:
F
: PATTERN'in nasıl yorumlandığını etkiler (normal ifade yerine sabit dize)x
: Tüm çizgiyi eşleştirq
: Şşşt ... minimum baskı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.)
Aklımdaki üç yöntem:
1) Yoldaki bir isim için kısa test (Durumunuzun bu olduğundan emin değilim)
ls -a "path" | grep "name"
2) Bir dosyadaki dize için kısa test
grep -R "string" "filepath"
3) Normal ifade kullanan daha uzun bash betiği:
#!/bin/bash
declare file="content.txt"
declare regex="\s+string\s+"
declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
then
echo "found"
else
echo "not found"
fi
exit
Herhangi bir döngüdeki normal ifadeyi değiştirmek için bir döngü kullanarak bir dosya içeriğinde birden çok dizeyi test etmeniz gerekiyorsa bu daha hızlı olmalıdır .
Daha basit bir yol:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
İpucu: /dev/null
Komutun çıkış durumunu istiyor, ancak çıktılar istemiyorsanız gönder .
-q
ile aynı olanı kullanın--quiet
-q
burada da en iyi cevap konusunda hemfikir ve dördüncü sırada bu dünyada adalet yok.
En kolay ve basit yol:
isInFile=$(cat file.txt | grep -c "string")
if [ $isInFile -eq 0 ]; then
#string not contained in file
else
#string is in file at least once
fi
grep -c dizginin dosyada kaç kez meydana geldiğini döndürür.
Sorunuzu doğru anladıysam, ihtiyacınız olanı yapmalısınız.
Bir satırda :check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
grep -q
grep'i doğrudan if
Thomas'ın cevabında yaptığı gibi kullanabilir ve çağırabilirsiniz . Buna ek olarak, soru, dizinin listeye eklenmeden önce var olup olmadığını kontrol etmeyi içermiyordu (sonuçta silinmiş dizinlerin bir listesi olabilir).
grep -E "(string)" /path/to/file || echo "no match found"
-E seçeneği grep'in düzenli ifadeler kullanmasını sağlar
@ Thomas'ın çözümü bir nedenden dolayı benim için işe yaramadı, ancak özel karakterler ve boşluklarla daha uzun bir dize vardı, bu yüzden sadece bu gibi parametreleri değiştirdim:
if grep -Fxq 'string you want to find' "/path/to/file"; then
echo "Found"
else
echo "Not found"
fi
Umarım birine yardımcı olur
Sorunsuz bir çözüm benim için çalışıyor:
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It's there!"
else
echo "its not there"
fi
grep -q
tanımlanan en etkili yaklaşımdır.
grep -Fxq "String to be found" | ls -a