Como imprimir apenas a primeira correspondência com grep


14

Estou tentando grep nome de usuário:

users | grep "^\b\w*\b" -P

Como posso mostrar apenas a primeira correspondência grep?


3
Por que grep? grepé para pesquisar. Você parece precisar de um cutou awk, mas o readbuilt-in também parece adequado.
Manatwork

este trabalho como @peterph propôs ^ \ w * \ b. Os cortes ou sed / awk são mais convenientes? meu caso é simples. eu posso usar myVar = `users | grep -o "^ \ w * \ b" `, não?
precisa saber é o seguinte

3
Compará-los: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Se você deseja armazená-lo em uma variável, use bash: read myVar blah < <(users)ou read myVar blah <<< $(users).
manatwork

@ Yurij73 a diferença está principalmente no tempo de execução. com readvocê não gera um novo processo. Se você fizer isso muitas vezes, perceberá a diferença.
Peterph 07/12

É melhor usar awk? #! / bin / bash (usuários | awk '$ 0 = $ 1')> arquivo; leia myVar <arquivo; arquivo rm -f; echo $ myVar;
precisa saber é o seguinte

Respostas:


9

Se você realmente deseja retornar apenas a primeira palavra e deseja fazer isso, grepe por grepacaso é uma versão recente do GNU grep, provavelmente deseja a -oopção. Eu acredito que você pode fazer isso sem o -Peo \bno início não é realmente necessário. Assim: users | grep -o "^\w*\b".

No entanto, como o @manatwork mencionou, o shell embutido readou cut/ sed/ awkparece ser mais apropriado (principalmente quando você chega ao ponto em que precisa fazer algo mais).


Sintaxe alternativa:grep -o "[^ ]*"
kenorb

@kenorb, que é um pouco diferente, na verdade (mas funcionará na maioria dos casos).
Peterph

34

Para mostrar apenas a primeira correspondência com grep, use o -mparâmetro, por exemplo:

grep -m1 pattern file

-m num, --max-count=num

Pare de ler o arquivo depois que num corresponder.


1

funcionou para mim. a primeira partida pega com:

users | grep -m 1 "^\b\w*\b"

e a última partida pega com

users | grep "^\b\w*\b" |tail -1

0

Por que grep? O grepcomando é para pesquisar. Você parece precisar de um cutou awk, mas a leitura incorporada também parece adequada.

Compara-os:

users | cut -d' ' -f1
users | sed 's/\s.*//'
users | awk '$0=$1'

Se você deseja armazená-lo em uma variável, usando o bash:

read myVar blah < <(users)

ou:

read myVar blah <<< $(users). 

Resposta acima com base nos comentários @manatwork .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.