Pergunta rápida de comando de cabeça / cauda

0

Esta é a saída do arquivo que estou usando:

aaaaa
bbbbb
ccccc
ddddd
eeeee
fffff
ggggg
hhhhh
iiiii
jjjjj

Sei que usar tail -n 5 filename exibirá isso:

fffff
ggggg
hhhhh
iiiii
jjjjj

Como eu uso o comando head de maneira a exibir as mesmas linhas exatas ?

head -n 10 filename | tail -n 5 filename funciona, mas isso é apenas redundante para o que estou procurando.

    
por Morgan C. 04.04.2018 / 17:20

4 respostas

1

Seu comando

head -n 10 filename | tail -n 5 filename

é sem sentido. A saída de head nunca será lida por tail , pois tail já está lendo diretamente de filename . Portanto, o resultado é exatamente o mesmo que com apenas

tail -n 5 filename

O utilitário head é usado para obter um determinado número de linhas do topo do arquivo (ou, com GNU head , todas as linhas do arquivo, exceto por um certo número de linhas contando a partir do final do arquivo). O utilitário head não é o que você deseja usar para obter o final dos dados de um arquivo. Para isso, use tail como você mostrou.

Qualquer outra solução seria mais complexa que seu tail -n 5 básico.

Por exemplo:

tac filename | head -n 5 | tac

que assume que um tem tac de GNU coreutils instalados. Tanto o head quanto o tail serão instalados em qualquer sistema que tenha um ambiente shell compatível com POSIX remotamente, enquanto o tac será encontrado apenas em sistemas Linux e outros sistemas onde o GNU Coreutils tenha sido instalado.

Você também pode implementar seu próprio tail em awk se for tail e não quiser usá-lo:

$ awk -vn=5 '{ lines[i++ % n] = $0 } END { for (j = 0; j < n; ++j) print lines[(i+j)%n] }' filename
fffff
ggggg
hhhhh
iiiii
jjjjj
    
por 04.04.2018 / 18:54
0

head é para obter as primeiras linhas n de um arquivo. tail é para obter as últimas linhas n de um arquivo. Se você quiser algo mais genérico, confira este thread .

    
por 04.04.2018 / 17:32
0

Acho que é isso que você quer.

foo@bar~$ cat file 
aaaaa
bbbbb
ccccc
ddddd
eeeee
fffff
ggggg
hhhhh
iiiii
jjjjj

Você deseja usar head para imprimir as mesmas linhas exatas que tail .

foo@bar~$ tail -n 5 file 
fffff
ggggg
hhhhh
iiiii
jjjjj

Solução

foo@bar~$ sort -r file | head -5 | sort
fffff
ggggg
hhhhh
iiiii
jjjjj
    
por 04.04.2018 / 17:35
0

Esta implementação usa head sem tail para exibir apenas as últimas 5 linhas do arquivo.

head -n -0 filename | sed 1,$(echo "$(wc -l filename | awk '{ print $1 }')-5" | bc -l)d

head -n -0 filename -- Displays all the lines in the file.

De man head:

-n, --lines = [-] N               imprima as primeiras N linhas em vez das primeiras 10; com o principal "-", imprima todas as últimas N linhas de cada arquivo

$(echo "$(wc -l filename | awk '{ print $1 }')-5" | bc -l) -- Calculates the number of lines to delete based on the total number of lines in the file minus 5.

sed 1,(NUMBER_OF_LINES_TO_DELETE)d -- Removes all but the last 5 lines based on the previous calculation.

    
por 04.04.2018 / 20:22