@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
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:
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.
head -1 file.txt
não funciona?grep
não é a melhor ferramenta para imprimir a primeira linha de um arquivo. Se você simplesmente quis dizer que deseja imprimir a primeira linha correspondentegrep
ou se tem algum uso específicogrep
, informe-nos para que serve. Se tivéssemos mais contexto, talvez pudéssemos dar uma resposta que melhor ajudasse você e a comunidade.Respostas:
Embora seja uma aplicação não convencional do grep, você pode fazer isso usando
Funciona porque a expressão vazia corresponde a qualquer coisa, enquanto
-m1
faz com que o grep saia após a primeira correspondênciafonte
grep: unknown option -- m
Isso não é algo que
grep
faz. O nome "grep" em si é um acrônimo para " pesquisar globalmente uma expressão regular e imprimir", que é o que oed
comandog/re/p
faz (para uma determinada expressão regularre
).ed
é um editor de linhas interativo de 1969, mas provavelmente está instalado no seu sistema hoje em dia. Temosgrep
a partir deed
, e pode ser vista como um atalho ou aliás para uma funcionalidade específicaed
, esed
, o que é "stream-ed
", isto é, uma (não interactivo) editor de fluxo.Vamos usar
sed
:A
1p
string é um pequenosed
"script" que imprime (p
) a linha correspondente ao endereço fornecido (1
, a primeira linha). O comando de edição1p
(sem surpresa) faria a mesma coisa noed
editor a propósito.Ele
-n
suprime a saída de qualquer coisa que não seja explicitamente impressa pelo script, então tudo o que obtemos é a primeira linha do arquivofile.txt
.Alternativamente:
Isso imprime todas as linhas do arquivo, mas sai (
q
) na linha 1 (após a impressão). Isso é exatamente equivalente ahead -n 1 file.txt
.No padrão POSIX, diz (generalizando) que
head -n N
é praticamente o mesmo quesed 'Nq'
, por exemplo , "imprime todas as linhas, mas sai na linhaN
". O motivohead
foi incluído no padrão devido à simetriatail
(e compatibilidade retroativa com implementações existentes do Unix).fonte
A menos que a primeira linha tenha uma string única, você não poderá fazer isso usando apenas grep.
head -n 1 file.txt
iria 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]
fonte
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:
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 1q
oused -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ê temtail -n 1
oused -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 temgrep
também não temhead
,tail
esed
.fonte