Grep untuk string literal

101

Saya mencari alat tipe grep untuk mencari string literal murni. Saya sedang mencari terjadinya baris file log, sebagai bagian dari baris dalam file log terpisah. Teks pencarian dapat berisi semua jenis karakter khusus regex, misalnya []().*^$-\.

Apakah ada utilitas pencarian Unix yang tidak akan menggunakan regex, tetapi hanya mencari kemunculan literal dari sebuah string?

Ben
sumber
Bertanya-tanya mengapa pertanyaannya bukan "Dapatkah saya grepmencari string literal?" alih-alih "Apakah ada hal seperti grepitu yang dapat mencari string literal?" Obeng pipih dapat dipasang pada kepala sekrup Philips, Anda tahu;)
ADTC

Jawaban:

136

Anda dapat menggunakan grep untuk itu, dengan opsi -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Scott Stafford
sumber
"string tetap yang dipisahkan baris baru" Bagaimana saya bisa melakukan ini pada prompt terminal? Saya tahu saya dapat membuat file pola, tetapi tanpa file, apakah mungkin dilakukan saat diminta? Menekan Enter jelas menjalankan perintah.
ADTC
13
Saya akan menjawab pertanyaan saya sendiri. :) Anda hanya perlu menyediakan beberapa string tetap menggunakan -eopsi pengulangan . Seperti ini: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Tidak diperlukan baris baru;)
ADTC
2
Tidak tersedia di Solaris. Sebagai gantinya fgrepdigunakan.
majkinetor
2
@ADTC Saya menemukan bahwa saya harus menggunakan tanda kutip tunggal untuk string yang dicari yang hanya berisi karakter khusus, jika tidak, tidak akan ditemukan. Jadi ini tidak mengembalikan hasil apa pun: grep --include=\*.php -FRn -e "$$"Menggunakan quout tunggal memberi saya hasil yang diinginkan:grep --include=\*.php -FRn -e '$$'
Piemol
2
Anda adalah @ADTC benar. $dan beberapa karakter lain yang spesial dan akan diganti dengan bash setelah Anda menekan enter dan sebelum grep(atau perintah apa pun) dijalankan. Anda dapat memberi tahu bash untuk membiarkan semua karakter (kecuali satu kutipan) tidak tersentuh dengan mengapitnya di dalam tanda kutip tunggal. Jika Anda perlu mengetikkan satu kutipan lakukan seperti ini'I'\''m special'
ndemou
14

Itu salah satu fgrepatau grep -Fyang tidak akan melakukan ekspresi reguler. fgrepidentik dengan grep -Ftetapi saya lebih suka tidak perlu khawatir tentang argumen, secara intrinsik malas :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
paxdiablo
sumber
Untuk GNU grep, fgrep hanya disediakan sebagai symlink ke grep yang membuatnya mengambil -F
Daenyth
3
egrepdan fgreptidak ditentukan oleh standar POSIX; grep -Fdan grep -E yang
Richard Hansen
4

Lulus -Fke grep.

Ignacio Vazquez-Abrams
sumber
3

Anda juga dapat menggunakan awk, karena memiliki kemampuan untuk menemukan string tetap, serta kemampuan pemrograman, misalnya saja

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
anjing hantu74
sumber
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

keluaran

one:hello:world
three:3:kudos
parandhaman
sumber
2
Saya tidak setuju. Ini adalah ilustrasi yang berguna tentang cara kerjanya.
timwaagh