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 deseja corresponder exatamente a deiauk
. Quando eu faço isso:
grep "deiauk" file.txt
Eu obtenho 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 opção “sa -w
, mas então minha string deve ser inteira linha.
Comentários
Resposta
Tente um dos seguintes:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Comentários
- Se tiver um travessão ( – ) no final da string, este script trará como resultado, o que não era esperado.
- Corrija @Eve rt: As palavras incluem apenas caracteres alfa, dígitos e sublinhados, então se você tiver abreviações ou outros itens hifenizados, isso não funciona.
- @Cyrus Eu aprendi o segundo enquanto usava vi / vim
*
comando em palavras. - Não funciona para nenhum caractere especial que tenha, por exemplo,
org.apache.avro avro
greped comorg.apache.avro avro+mapred
(tentado com *) - Use
-wE
para o exato correspondência de várias palavras (booleano OR)
Resposta
Tente isso com GNU grep
e marcar os limites das palavras com \b
:
grep "\bdeiauk\b" file
Resultado:
deiauk 1611516 afsdf 765
Veja: http://www.regular-expressions.info/wordboundaries.html
Comentários
- Obrigado, mas por que isso não está funcionando para mim?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Experimente
grep "\b${vard}\b" file.txt
- ainda não ' não funciona: /
- Você ' precisará
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Resposta
Se o seu grep
suporta -P
(PCRE), você pode fazer:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Comentários
- Esta é a única resposta que funciona com palavras hifenizadas.
- Por que
\K
( PCRE reset (início da partida) necessário? Esta solução proposta parece funcionar bem sem ela.
Resposta
Dependendo de seus dados reais, você poderia procure a palavra seguida por um espaço:
grep "deiauk " file.txt
Se você sabe que deve estar no início da linha, verifique:
grep "^deiauk " file.txt
Comentários
- Infelizmente, todas as respostas além desta estão incorretas.
- @Shatu Obrigado! Portanto, vamos ' s ver quanto tempo leva para " atingir o topo " … Eu ' estou curioso porque gosto de adicionar respostas a perguntas antigas … Acho que se presume que sim, mas duvido. Seria muito bom para mim, mas realmente útil para os leitores. Para tornar este um bom caso de exemplo, eu poderia pedir que você escrevesse um comentário resumindo o que as outras respostas estão faltando?
- (1) Parabéns por alcançar 10K repetições. Agora você tem o privilégio de verificar se esta resposta foi dada antes e foi excluída. (2) É sempre melhor responder à pergunta da forma mais ampla possível, com base no que é dito , e não dar uma resposta que funcione apenas para os dados de amostra. Parece, a partir dos dados de exemplo na pergunta, que as colunas são separadas por espaços – mas isso não é 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
^
– mas todas as outras respostas funcionam… (Cont.) - ( Continuação)… se a string aparecer em um campo diferente do primeiro. (4) Além disso, todas as outras respostas funcionam se deiauk for o último campo (ou seja, não há nada depois dele).
Resposta
Descobri que -x
funcionou para mim.
Exemplo
$ grep -inx -d skip "favicon.ico" * test.txt:1:favicon.ico
Manual Grep
-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 $.
Comentários
- Para 1: 1 correspondendo a toda a linha que contém hifens,
-x
a única opção. Por exemplo,grep -w "abc" <<<"abc-hac101-bb0"
corresponderá, masgrep -x "abc" <<<"abc-hac101-bb0"
não
grep -w
? (Essa opção é exatamente para essa finalidade e funciona para mim.) – Observação: a opção-x
corresponde a toda a linha.deiauk
/ " Só preciso disso:deiauk 1611516 afsdf 765
" – de qual você precisa?