Abbina la stringa esatta usando grep


65

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 voglio abbinare esattamente deiauk. Quando faccio questo:

grep "deiauk" file.txt

Ottengo questo risultato:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

ma ho solo bisogno di questo:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

So che c'è -wun'opzione, ma poi la mia stringa deve lavorare tutta la linea.


4
Ci hai provato grep -w? (Questa opzione è esattamente per quello scopo, e funziona per me.) - Nota: l'opzione -xcorrisponde all'intera riga.
Janis,

"Voglio abbinare esattamentedeiauk / " Ho solo bisogno di questo: deiauk 1611516 afsdf 765" - Di cosa hai bisogno?
alex

Risposte:


129

Prova uno di:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Se hai un trattino ( - ) alla fine della stringa, questo script lo porterà come risultato, cosa che non era prevista.
Evis,

@Evert corretto: le parole includono solo caratteri alfa, cifre e caratteri di sottolineatura, quindi se hai abbreviazioni o altri elementi sillabati, questo non funziona.
ingherequi

@Cyrus Ho imparato il secondo usando il *comando vi / vim sulle parole.
shuva,

Non funziona per nessun personaggio speciale con cui è stato ad esempio org.apache.avro avrocitato org.apache.avro avro+mapred(provato con *)
Vishrant,

12

Prova questo con GNU grepe segna i confini delle parole con \b:

grep "\bdeiauk\b" file

Produzione:

deiauk 1611516 afsdf 765

Vedi: http://www.regular-expressions.info/wordboundaries.html


Grazie ma perché questo non funziona per me? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

Provagrep "\b${vard}\b" file.txt
Cyrus,

1
continua a non funzionare: /
user3334375

Avrai bisogno di read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus il

7

Se il tuo grepsupporto -P(PCRE), puoi fare:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

4
Questa è l'unica risposta che funziona con parole sillabate.
ingherequi

5

A seconda dei tuoi dati reali, potresti cercare la parola seguita da uno spazio:

grep 'deiauk ' file.txt 

Se sai che deve essere all'inizio della riga, controlla:

grep '^deiauk ' file.txt 

Purtroppo, tutte le risposte diverse da questa non sono corrette.
Shatu,

@Shatu Grazie! Vediamo quindi quanto tempo impiega "a salire in cima" ... Sono curioso perché mi piace aggiungere risposte a vecchie domande ... Penso che si presuma che lo faccia, ma ne dubito. Sarebbe carino per me, ma in realtà utile per i lettori. Per rendere questo un buon esempio, potrei chiederti di scrivere un commento che riassuma ciò che mancano le altre risposte?
Volker Siegel,

(1) Congratulazioni per aver raggiunto il 10K di rep. Ora hai il privilegio di vedere che questa risposta è stata data in precedenza ed è stata eliminata. (2) È sempre meglio rispondere alla domanda nel modo più ampio possibile, in base a ciò che viene detto, e non dare 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 ciò non è specificato. Tutte le altre risposte funzioneranno anche per colonne separate da tabulazioni. (3) Hai evitato il fatale difetto della risposta (cancellata) di Tachomi aggiungendo il ^- ma tutte le altre risposte funzionano ... (proseguendo)
G-Man dice 'Reinstate Monica'

(Proseguendo) ... se la stringa appare in un campo diverso dal primo. (4) Inoltre, tutte le altre risposte funzionano se '' deiauk '' è l'ultimo campo (cioè, non c'è nulla dopo di esso).
G-Man dice "Ripristina Monica" il
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.