Ho un file di testo:
deiauk 1611516 afsdf 765 minkra 18415151 asdsf 4152 linkra sfsfdsfs sdfss 4555 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4 deiauk 1611516 afsdf ddfgfgd luktol1 4545 4 9 luktol 1
e io desidera corrispondere esattamente a deiauk
. Quando lo faccio:
grep "deiauk" file.txt
ottengo questo risultato:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
ma io ho solo bisogno di questo:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
So che cè “unopzione -w
, ma la mia stringa deve essere completamente riga.
Commenti
Risposta
Prova uno di:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Commenti
- Se hai un trattino ( – ) alla fine della stringa questo script lo porterà come risultato, cosa non prevista.
- Correggi @Eve rt: le parole includono solo caratteri alfabetici, cifre e trattini bassi, quindi se hai abbreviazioni o altri elementi sillabati, questo non funziona.
- @Cyrus ho imparato il secondo usando vi / vim
*
sulle parole. - Non funziona per nessun carattere speciale che ha, ad esempio
org.apache.avro avro
greped conorg.apache.avro avro+mapred
(provato con *) - Utilizza
-wE
per corrispondenza di più parole (booleano OR)
Risposta
Prova con GNU grep
e contrassegna i confini delle parole con \b
:
grep "\bdeiauk\b" file
Risultato:
deiauk 1611516 afsdf 765
Vedi: http://www.regular-expressions.info/wordboundaries.html
Commenti
- Grazie, ma perché per me non funziona?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Prova
grep "\b${vard}\b" file.txt
- ancora ' non funziona: /
- ' avrai bisogno di
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Rispondi
Se il tuo grep
supporta -P
(PCRE), puoi fare:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Commenti
- Questa è lunica risposta che funziona con le parole sillabate.
- Perché
\K
( PCRE ripristina linizio della partita) necessario? Questa soluzione proposta sembra funzionare perfettamente senza di essa.
Risposta
A seconda dei dati reali, potresti cerca la parola seguita da uno spazio:
grep "deiauk " file.txt
Se sai che deve essere allinizio della riga, controllala:
grep "^deiauk " file.txt
Commenti
- Purtroppo, tutte le risposte diverse da questa non sono corrette.
- @Shatu grazie! Quindi, vediamo ' quanto tempo ci vuole per " bolla fino in cima " … Sono ' curioso perché mi piace aggiungere risposte a vecchie domande … Penso che si presume lo sia, ma ne dubito. Sarebbe bello per me, ma in realtà utile per i lettori. Per fare di questo un buon esempio, potrei chiederti di scrivere un commento che riassuma ciò che manca alle altre risposte?
- (1) Congratulazioni per aver raggiunto 10K rep. Ora hai il privilegio di vedere che questa risposta è stata data prima ed è stata cancellata. (2) È sempre meglio rispondere alla domanda nel modo più ampio possibile, sulla base di ciò che viene detto e non fornire una risposta che funzioni solo per i dati di esempio. Dai dati di esempio nella domanda sembra che le colonne siano separate da spazi, ma non è specificato. Tutte le altre risposte funzioneranno anche per colonne separate da tabulazioni. (3) Hai evitato il difetto fatale nella risposta (eliminata) di tachomi aggiungendo
^
– ma tutte le altre risposte funzionano … (continua) - ( Continua) … se la stringa appare in un campo diverso dal primo. (4) Inoltre, tutte le altre risposte funzionano se “deiauk” è lultimo campo (cioè, non cè niente dopo).
Risposta
Ho trovato che -x
ha funzionato per me.
Esempio
$ grep -inx -d skip "favicon.ico" * test.txt:1:favicon.ico
Grep Manual
-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
Commenti
- Per 1: 1 corrispondente allintera riga che contiene trattini,
-x
lunica opzione. Ad esempiogrep -w "abc" <<<"abc-hac101-bb0"
corrisponderà magrep -x "abc" <<<"abc-hac101-bb0"
non
grep -w
? (Questa opzione è esattamente per questo scopo e per me funziona.) – Nota: lopzione-x
corrisponde allintera riga.deiauk
/ " Mi serve solo questo:deiauk 1611516 afsdf 765
" – di cosa hai bisogno?