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.