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?


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

"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).

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


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

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

2
Saya tidak setuju. Ini adalah ilustrasi yang berguna tentang cara kerjanya.
timwaagh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.