Cara memeriksa apakah file berisi string tertentu menggunakan Bash

Jawaban:

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

Anda tidak perlu di [[ ]]sini. Jalankan saja perintah secara langsung. Tambahkan -qopsi ketika Anda tidak perlu menampilkan string ketika ditemukan.

The grepperintah mengembalikan 0 atau 1 dalam kode keluar tergantung pada hasil pencarian. 0 jika ada sesuatu yang ditemukan; 1 sebaliknya.

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

Anda dapat menentukan perintah sebagai syarat if. Jika perintah mengembalikan 0 pada kode keluarnya, itu berarti bahwa kondisinya benar; jika tidak salah.

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

Seperti yang Anda lihat, Anda menjalankan program di sini secara langsung. Tidak ada tambahan []atau [[]].

Igor Chubin
sumber
Informasi lebih lanjut tentang grepdan opsi yang tersedia di asnwer stackoverflow.com/a/4749368/1702557
Pawel
2
mungkin ingin mempertimbangkan -Fxqparameter seperti di stackoverflow.com/a/4749368/544721
Grzegorz Wierzowiecki
3
pertimbangkan untuk menggunakan -m 1guna meningkatkan kinerja pemindaian. Mengembalikan pada kejadian pertama.
AlikElzin-kilaka
1
jika SomeStringberisi karakter khusus regex (seperti .) Anda mungkin mendapatkan hasil yang tidak terduga. Lebih aman untuk selalu menggunakan fgrep(atau grep -F) (kecuali jika Anda benar-benar membutuhkan regex, dalam hal ini egrep(atau grep -E) mungkin merupakan pilihan terbaik)
Walter Tross
Contoh ifcontoh tidak benar, karena hanya memeriksa apakah kode keluar itu bukan-0. Jika terjadi kesalahan, seperti file tidak dapat dibaca, kode keluar juga bukan-0. Jadi Anda harus melakukan sesuatu seperti ec=$?, dan memeriksa apakah itu 0(ditemukan), lalu jika itu 1(tidak ditemukan), dan kemudian jika itu sesuatu yang lain (gagal).
ddekany
40

Selain jawaban lain, yang memberi tahu Anda bagaimana melakukan apa yang Anda inginkan, saya mencoba menjelaskan apa yang salah (yang Anda inginkan.

Di Bash, ifharus diikuti dengan perintah. Jika kode keluar dari perintah ini sama dengan 0, maka thenbagian dieksekusi, atau elsebagian jika ada yang dieksekusi.

Anda dapat melakukannya dengan perintah apa pun seperti yang dijelaskan dalam jawaban lain: if /bin/true; then ...; fi

[[adalah perintah bash internal yang didedikasikan untuk beberapa tes, seperti keberadaan file, perbandingan variabel. Demikian pula [adalah perintah eksternal (biasanya terletak di /usr/bin/[) yang melakukan tes kira-kira sama tetapi perlu ]sebagai argumen akhir, yang mengapa ]harus diisi dengan ruang di sebelah kiri, yang tidak demikian halnya dengan ]].

Di sini Anda tidak perlu [[juga [.

Hal lain adalah cara Anda mengutip sesuatu. Dalam bash, hanya ada satu kasus di mana pasangan kutipan bersarang, yaitu "$(command "argument")". Tetapi di dalam 'grep 'SomeString' $File'kamu hanya ada satu kata, karena 'grep 'ini adalah unit yang dikutip, yang digabungkan dengan SomeStringdan kemudian digabungkan dengan ' $File'. Variabel $Filebahkan tidak diganti dengan nilainya karena penggunaan tanda kutip tunggal. Cara yang tepat untuk melakukannya adalah grep 'SomeString' "$File".

Benoit
sumber
15

Jika Anda ingin memeriksa apakah file tidak mengandung string tertentu, Anda dapat melakukannya sebagai berikut.

if ! grep -q SomeString "$File"; then
  Some Actions # SomeString was not found
fi
Lahiru Chandima
sumber
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
Nevin Raj Victor
sumber
2
Mengubah direktori biasanya bukan ide yang baik (dan sama sekali tidak perlu di sini, cukup kualifikasi nama file dengan direktori target). Dan kemudian apa yang Anda miliki persis sama dengan jawaban yang diterima, hanya dengan perincian yang lebih sedikit.
Mat
Terima kasih atas sarannya Mat
Nevin Raj Victor
7

Versi terpendek (benar):

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

dapat juga ditulis sebagai

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

tetapi Anda tidak perlu mengujinya secara eksplisit dalam kasus ini, jadi sama dengan:

grep -q "something" file && echo "yes" || echo "no"
lzap
sumber
3
if grep -q something file; then echo yes; else echo no; fi. Tidak ada alasan untuk mengacaukannya $?sama sekali.
Charles Duffy
6

Jika Anda ingin memeriksa apakah string cocok dengan seluruh baris dan jika itu adalah string tetap, Anda dapat melakukannya dengan cara ini

grep -Fxq [String] [filePath]

contoh

 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

Dari file man:

-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.)
Shubham Khatri
sumber
6
grep -q [PATTERN] [FILE] && echo $?

Status keluar adalah 0(benar) jika pola ditemukan; jika tidak blankstring.

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

Contoh

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

Coba ini:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi
vgokul129
sumber
3
Saya ragu-ragu menghindari downvoting ini, tetapi Stack Overflow seharusnya tidak mengabadikan semacam logika pretzel. grepmengembalikan status keluar karena alasan yang sangat bagus; menangkap keluaran ke string berpotensi menyimpan sejumlah besar teks dalam buffer hanya agar Anda dapat mengatakan itu tidak kosong.
tripleee
-1

Saya melakukan ini, tampaknya berfungsi dengan baik

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi
madarekrap
sumber
Kutipan rusak , dan Anda mungkin ingin menghindari melihat hasil dari grep.
Tripleee
-3
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
chemila
sumber
1
Anda salah ketik -!? seharusnya $?
lzap
... tidak hanya itu dimaksudkan untuk menjadi $?, tetapi tidak perlu sama sekali - Anda bisa melakukannyaif grep -q ...
Charles Duffy
1
Selain itu, foo && truthy_action || falsey_actionbukan operator ternary nyata - jika truthy_actiongagal, maka falsey_actionakan dijalankan sebagai tambahan .
Charles Duffy
Lebih umum, tujuan dari ifyaitu untuk menjalankan perintah dan memeriksa kode keluar nya. Anda harus sangat jarang perlu memeriksa $?secara eksplisit.
tripleee