Corresponder a string exata usando grep

65

Eu tenho um arquivo de texto:

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 eu quero combinar exatamente deiauk. Quando eu faço isso:

grep "deiauk" file.txt

Eu recebo este resultado:

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

mas eu só preciso disso:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Eu sei que há uma -wopção, mas então minha corda tem que machucar toda a linha.

user3334375
fonte
4
Você realmente tentou grep -w? (Essa opção é exatamente para esse propósito e funciona para mim.) - Nota: a opção -xcorresponde à linha inteira.
Janis
"Eu quero corresponder exatamentedeiauk / " Eu só preciso disso: deiauk 1611516 afsdf 765" - de que você precisa?"
alex

Respostas:

129

Experimente um dos seguintes:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile
Janis
fonte
3
Se você tiver um traço ( - ) no final da string, esse script o trará como resultado, o que não era esperado.
Evis
@Evert correto: as palavras incluem apenas caracteres alfabéticos, dígitos e sublinhados; portanto, se você tiver abreviações ou outros itens hifenizados, isso não funcionará.
precisa saber é
@Cyrus Aprendi o segundo enquanto usava o *comando vi / vim em palavras.
shuva 13/02/19
Ele não funciona para nenhum caractere especial com o qual você tenha org.apache.avro avrorecebido org.apache.avro avro+mapred(tentado com *)
Vishrant
12

Tente isso com o GNU grepe marque os limites das palavras com \b:

grep "\bdeiauk\b" file

Resultado:

deiauk 1611516 afsdf 765

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

Cyrus
fonte
Obrigado, mas por que isso não está funcionando para mim? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
precisa saber é o seguinte
Tentegrep "\b${vard}\b" file.txt
Cyrus
11
ainda não funciona: /
user3334375
Você precisará read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus
7

Se o seu grepsuporte -P(PCRE), você pode:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd
heemail
fonte
4
Esta é a única resposta que funciona com palavras hifenizadas.
precisa saber é
5

Dependendo dos dados reais, você pode procurar a palavra seguida por um espaço:

grep 'deiauk ' file.txt 

Se você sabe que precisa estar no início da linha, verifique:

grep '^deiauk ' file.txt 
Volker Siegel
fonte
Infelizmente, todas as respostas diferentes estão incorretas.
Shatu
@Shatu Thanks! Então, vamos ver quanto tempo leva para "subir ao topo" ... estou curioso porque gosto de adicionar respostas a perguntas antigas ... acho que é suposto que sim, mas duvido. Seria bom para mim, mas realmente útil para os leitores. Para tornar este um bom exemplo, peço-lhe que escreva um comentário resumindo o que as outras respostas estão faltando?
Volker Siegel
(1) Parabéns por atingir 10.000 representantes. Agora você tem o privilégio de ver que essa resposta foi dada antes e foi excluída. (2) É sempre melhor responder à pergunta o mais amplamente possível, com base no que foi dito, e não dar uma resposta que funcione apenas para os dados da amostra. Parece, a partir dos dados de exemplo na pergunta, que as colunas são separadas por espaços - mas isso não está especificado. Todas as outras respostas também funcionarão para colunas separadas por tabulação. (3) Você evitou a falha fatal na resposta de tachomi (excluída) adicionando a ^- mas todas as outras respostas funcionam… (continua)
G-Man diz 'Reinstate Monica'
(Continuação)… se a sequência aparecer em um campo diferente do primeiro. (4) Além disso, todas as outras respostas funcionam se '' deiauk '' é o último campo (ou seja, não há nada depois dele).
G-Man diz 'Reinstate Monica'