Como imprimir a primeira linha usando o comando grep?


16

Eu tenho um arquivo chamado file.txt. Como posso imprimir a primeira linha usando apenas o grepcomando?


4
Será que head -1 file.txtnão funciona?
Clk

@steeldriver, você precisa dar uma resposta, pois é a maneira de fazê-lo com o grep, ferramenta estranhamente selecionada para o trabalho.
MelBurslan 07/07

1
grepnão é a melhor ferramenta para imprimir a primeira linha de um arquivo. Se você simplesmente quis dizer que deseja imprimir a primeira linha correspondente grepou se tem algum uso específico grep, informe-nos para que serve. Se tivéssemos mais contexto, talvez pudéssemos dar uma resposta que melhor ajudasse você e a comunidade.
DKing

@MelBurslan No arquivo.txt, tenho três linhas, por exemplo: Este é um novo arquivo. Segunda linha: O nome do arquivo é newFile Terceira linha: Eu não criei a nova linha. Então, usando o comando grep, como posso imprimir apenas a primeira linha? Também como qual comando me ajudará a imprimir a primeira e a última linha? Vocês podem me dizer os comandos para ambas as perguntas?
Nithin Santhosh 08/07

Se alguma das respostas existentes resolver seu problema, considere aceitá-lo através da marca de seleção. Obrigado!
Jeff Schaller

Respostas:


37

Embora seja uma aplicação não convencional do grep, você pode fazer isso usando

grep -m1 "" file.txt

Funciona porque a expressão vazia corresponde a qualquer coisa, enquanto -m1faz com que o grep saia após a primeira correspondência

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

+1 por mostrar que a banana coberta de chocolate não é tão inútil aqui quanto eu pensava.
Kamil Maciorowski

4
Isso pode funcionar em alguns sistemas, mas não é portátil:grep: unknown option -- m
Kusalananda

1
Observe a diferença entre 'primeira linha' e 'primeira linha combinado'
Charles

13

Isso não é algo que grepfaz. O nome "grep" em si é um acrônimo para " pesquisar globalmente uma expressão regular e imprimir", que é o que o edcomando g/re/pfaz (para uma determinada expressão regular re).

edé um editor de linhas interativo de 1969, mas provavelmente está instalado no seu sistema hoje em dia. Temos grepa partir de ed, e pode ser vista como um atalho ou aliás para uma funcionalidade específica ed, e sed, o que é "stream- ed", isto é, uma (não interactivo) editor de fluxo.

Vamos usar sed:

$ sed -n '1p' file.txt

A 1pstring é um pequeno sed"script" que imprime ( p) a linha correspondente ao endereço fornecido ( 1, a primeira linha). O comando de edição 1p(sem surpresa) faria a mesma coisa no ededitor a propósito.

Ele -nsuprime a saída de qualquer coisa que não seja explicitamente impressa pelo script, então tudo o que obtemos é a primeira linha do arquivo file.txt.

Alternativamente:

$ sed '1q' file.txt

Isso imprime todas as linhas do arquivo, mas sai ( q) na linha 1 (após a impressão). Isso é exatamente equivalente a head -n 1 file.txt.

No padrão POSIX, diz (generalizando) que head -n Né praticamente o mesmo que sed 'Nq', por exemplo , "imprime todas as linhas, mas sai na linha N". O motivo headfoi incluído no padrão devido à simetria tail(e compatibilidade retroativa com implementações existentes do Unix).


Esta é a resposta mais esclarecedora, a primeira resposta é um truque estranho. Eu sabia que havia algo estranho, obrigado por me mostrar a história do grep e ed. Tudo faz sentido agora.
Tomas Zubiri

6

A menos que a primeira linha tenha uma string única, você não poderá fazer isso usando apenas grep. head -n 1 file.txtiria trabalhar em seu lugar.

Se você quiser imprimir apenas a primeira linha se ela corresponder a um padrão, encane a cabeça para grep

head -n 1 * | grep [pattern]


2

Ainda outro uso não convencional de Grep - uma transformação schwartziana que passa por várias rotações para numerar as linhas, depois usa grep para procurar o número da linha e retira o número da linha:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

Estou colocando esta resposta aqui como um exemplo da idéia de que apenas porque você pode fazer algo (grep ou bash ou ... etc), não significa que você deveria - provavelmente há uma ferramenta melhor para o trabalho. sed ( sed 1qou sed -n 1p) e head ( head -n 1) são as ferramentas mais apropriadas para imprimir a primeira linha de um arquivo. Para imprimir a última linha de um arquivo, você tem tail -n 1oused -n '$p'. Essas ferramentas não são apenas um único comando (em vez de 3 ou mais nas funções acima), mas também são muito mais claras para futuros leitores - talvez você mesmo! - dos scripts em que eles estão. Embora eu não seja um dos (atualmente) 3 eleitores negativos da sua pergunta, é provável que sua insistência em uma ferramenta arbitrária para o trabalho (sem nenhuma razão de suporte) seja a razão para os votos negativos. É extremamente improvável que um sistema que tem greptambém não tem head, taile sed.

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.