Risposte:
Specifica semplicemente le ancore regexp.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Dalla pagina man di grep:
-F, --fixed-strings
Interpreta PATTERN come un (elenco di) stringhe fisse
-x, --line-regexp
Seleziona solo le corrispondenze che corrispondono esattamente all'intera riga.
-F
? sei su Solaris? Se l'uso così/usr/xpg4/bin/grep
grep
uno script bash e questa opzione è meglio che usare un'espressione regolare come suggerito nella risposta accettata. Perché ho qualche carattere speciale all'interno della variabile che sto cercando (come .
) e non devo evitarli quando uso il comando.
Ecco cosa faccio, anche se usare gli ancoraggi è il modo migliore:
grep -w "ABB.log " a.tmp
ABB.log
, che non è il caso generale, ovvero fallirà la maggior parte delle volte.
La maggior parte dei suggerimenti fallirà se c'è anche un solo spazio iniziale o finale, il che sarebbe importante se il file viene modificato a mano. Questo lo renderebbe meno suscettibile in quel caso:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Un semplice ciclo while-read nella shell lo farebbe implicitamente:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
allo stesso modo con awk
awk '/^ABB\.log$/' file
Intendo aggiungere qualche spiegazione extra riguardo ai tentativi di OP e anche altre risposte.
Puoi usare anche la soluzione di John Kugelmans in questo modo:
grep -x "ABB\.log" a.tmp
quotando la stringa e facendo l'escape del punto ( .
) non serve più il -F
flag.
È necessario eseguire l'escape del .
(punto) (perché corrisponde a qualsiasi carattere (non solo .
) se non è sfuggito) o utilizzare il -F
flag con grep. -F
flag lo rende una stringa fissa (non una regex).
Se non si cita la stringa, potrebbe essere necessario un doppio backslash per evitare il punto ( .
):
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
forza per abbinare l'intera linea..
senza -F
flag sono sbagliate.-x
passaggio avvolgendo la stringa del modello con ^
e $
. In questo caso assicurati di non usare -F
, invece esegui l'escape di .
, perché -F
impedirà l'interpretazione regex di ^
e $
.Se vuoi far corrispondere una stringa che inizia con -
, dovresti usare --
con grep. Tutto ciò che segue --
sarà considerato un input (non un'opzione).
Esempio:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-F
non sarà necessario se l' .
escape è corretta.
-F
disponibile quando hai scritto questo? In caso contrario, quale sistema stavi utilizzando? Finora non sono riuscito a trovare quell'informazione nella tua risposta, cosa che accade anche adesso quando l'ho riletta di nuovo. Quindi, davvero sicuro, ho letto la tua risposta completamente almeno due volte. ;)
-F
era disponibile. (Ho detto: "o usa -F
bandiera con grep
")
-F
è la risposta, perché preoccuparsi di scappare? Qual è la tua opinione al riguardo?
Questo ha funzionato bene per me quando cercavo di fare qualcosa di simile:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
Funziona per me :
grep "\bsearch_word\b" text_file > output.txt
\b
indica / imposta i confini.
Sembra funzionare abbastanza velocemente
search_word
separati da confini di parola. Ad esempio, corrisponderebbe alla riga "foo search_word bar".
Questo è con HPUX, se il contenuto dei file ha spazio tra le parole, usa questo:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
Preferirei:
str="ABB.log"; grep -E "^${str}$" a.tmp
Saluti
ABBxlog
Avevo bisogno di questa funzionalità, ma volevo anche assicurarmi di non restituire righe con un prefisso prima di ABB.log:
grep "\WABB.log$" -w a.tmp
\W
è soddisfatta, che è qualsiasi carattere diverso da uno spazio bianco, quindi xABBxlog
.