Grep per stringhe letterali


101

Sto cercando uno strumento di tipo grep per cercare stringhe puramente letterali. Sto cercando l'occorrenza di una riga di un file di registro, come parte di una riga in un file di registro separato. Il testo di ricerca può contenere tutti i tipi di caratteri speciali regex, ad esempio []().*^$-\.

Esiste un'utilità di ricerca Unix che non userebbe regex, ma cercherebbe solo le occorrenze letterali di una stringa?


Mi chiedo perché la domanda non fosse "Posso grepcercare stringhe letterali?" invece di "C'è qualcosa del genere in grepgrado di cercare stringhe letterali?" I cacciaviti a testa piatta possono adattarsi alle teste delle viti Philips, sai;)
ADTC

Risposte:


136

Puoi usare grep per questo, con l'opzione -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

"stringhe fisse separate da una nuova riga" Come posso farlo al prompt del terminale? So di poter creare un file di pattern, ma senza un file è possibile farlo al prompt? Premendo Invio ovviamente si esegue il comando.
ADTC

13
Risponderò alla mia domanda. :) Devi solo fornire più stringhe fisse usando le ripetizioni -edell'opzione. Come questo: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Non sono richieste nuove righe;)
ADTC

2
Non disponibile su Solaris. Invece fgrepè usato.
Majkinetor

2
@ADTC Ho scoperto che dovevo usare virgolette singole per la stringa cercata contenente solo caratteri speciali, altrimenti non verrà trovato nulla. Quindi questo non ha prodotto alcun risultato: l' grep --include=\*.php -FRn -e "$$"utilizzo di singole quout mi ha dato il risultato desiderato:grep --include=\*.php -FRn -e '$$'
Piemol

2
Si è corretta @ADTC. $e pochi altri caratteri sono speciali e verranno sostituiti da bash dopo aver premuto invio e prima che grep(o qualsiasi comando) venga eseguito. Puoi dire a bash di lasciare tutti i caratteri (tranne una singola virgoletta) intatti racchiudendoli tra virgolette singole. Se hai bisogno di digitare una singola citazione, fallo in questo modo'I'\''m special'
ndemou

14

Questo è fgrepo grep -Fche non farà espressioni regolari. fgrepè identico a grep -Fma preferisco non doversi preoccupare degli argomenti, essendo intrinsecamente pigro :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).

Per GNU grep, fgrep è fornito solo come collegamento simbolico a grep, il che fa sì che venga utilizzato -F
Daenyth

3
egrepe fgrepnon sono specificati dallo standard POSIX; grep -Fe grep -E sono
Richard Hansen


3

puoi anche usare awk, poiché ha la capacità di trovare stringhe fisse, così come capacità di programmazione, ad esempio solo

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

produzione

one:hello:world
three:3:kudos

2
Non sono d'accordo È un'utile illustrazione di come funziona.
timwaagh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.