Como imprimir a primeira linha usando o comando grep?

5

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

    
por Nithin Santhosh 07.07.2016 / 20:37

4 respostas

24

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 -m1 faz com que o grep saia após a primeira correspondência

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.
    
por 07.07.2016 / 21:10
9

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

ed é um editor de linha interativa de 1969, mas é mais provável que esteja instalado em seu sistema hoje mesmo assim. Recebemos grep de ed e pode ser visto como um atalho ou alias para uma funcionalidade específica de ed e sed , que é "stream- ed ", ou seja, um (não interativo editor de fluxo.

Vamos usar sed :

$ sed -n '1p' file.txt

A string 1p é um minúsculo sed "script" que imprime ( p ) a linha correspondente ao endereço fornecido ( 1 , a primeira linha). O comando de edição 1p faria (sem surpresa) fazer a mesma coisa no editor ed .

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

Alternativamente:

$ sed '1q' file.txt

Isto imprime todas as linhas do arquivo, mas sai ( q ) na linha 1 (depois de imprimi-lo). Isso é exatamente equivalente a head -n 1 file.txt .

No padrão POSIX, ele diz (generalizando) que head -n N é o mesmo que sed 'Nq' , ou seja, "imprima todas as linhas, mas saia na linha N ". O motivo head foi incluído no padrão foi devido à simetria com tail (e compatibilidade com versões anteriores de implementações Unix).

    
por 07.07.2016 / 21:01
3

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

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

head -n 1 * | grep [pattern]

    
por 07.07.2016 / 20:42
1

No entanto, outro uso não convencional do Grep - uma Schwartzian Transform , que passa por vários giros para numerar as linhas, e depois usa grep para procurar o número da linha, então retire 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 essa resposta aqui como um exemplo da idéia de que só porque você pode fazer algo em (grep ou bash ou ... etc), não significa que você > deve - provavelmente existe uma ferramenta melhor para o trabalho. sed ( sed 1q ou 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 1 ou sed -n '$p' . Essas ferramentas não são apenas um único comando (em vez de 3+ nas funções acima), elas também são muito mais claras para os futuros leitores - talvez você mesmo! - dos roteiros em que estão. Embora eu não seja um dos (atualmente 3) eleitores da sua pergunta, é provável que sua insistência em uma ferramenta arbitrária para o trabalho (sem qualquer motivo de apoio) seja a razão para as downvotes. É extremamente improvável que um sistema que tenha grep também não tenha head , tail e sed .

    
por 09.07.2016 / 02:28

Tags