Pular para o conteúdo

Combinando os comandos head e tail

Dica publicada em Linux / Comandos
Fábio Berbert de Paula fabio
Hits: 65.547 Categoria: Linux Subcategoria: Comandos
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Combinando os comandos head e tail

A diversidade de comandos via shell no Linux é espantosa, sendoassim, com um pipe (|) e uma pitada de criatividade, umadministrador de sistemas vai longe.

Na dica de hoje vamos aprender a combinar os comandos head etail para exibir determinadas partes de um arquivo texto. Vamosa um exemplo prático para ver como funcionará nossa combinação. Suponhaque temos o arquivo lista_nomes.txt com o seguinte conteúdo:

01. Aline Tavares Silva
02. Bruno Delgado Bonfim
03. Carla Garantizado Bela
04. Danilo Servantes
05. Eliane Costa Pinheiro
06. Elivaldo Pereira
07. Fábio Berbert de Paula
08. Felipe Azambuja
09. Gardineu Marques
10. Romário Belleza
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
Em nosso estudo de caso, quero exibir na tela somente o intervaloentre as linhas 5 e 8. Vamos às contas:
  • O intervalo de linhas de 5 à 8 contém 4 linhas (5, 6, 7 e 8)
  • Vamos usar o comando head para exibir as primeiras 8 linhas
  • Vamos usar o comando tail para exibir as últimas 4 das 8 linhas

Assim sendo, podemos construir o comando:
$ head -n 8 lista_nomes.txt | tail -n 4
Logo, se considerarmos a primeira linha quista como L1 e a última L2, podemosmontar o comando da seguinte forma:

$ head -n L2 <arquivo> | tail -n ((L2- L1) + 1)

Para simplificar ainda mais, vamos a um simples shell script:

#!/bin/bash
# linhas.sh
# Sintaxe: ./linhas.sh arquivo L1 L2

ARQ=$1
L1=`expr $2 + 1`
L2=$3

head -n $L2 $ARQ | tail -n $L1


Atenciosamente,
Fábio Berbert de Paula
fabio@vivaolinux.com.br
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Executando um projeto em React JS no modo HTTPS

Login automático em servidores FTP

Gnome 2.2 para Debian

Como mapear teclas no Vim

Como somar todos os números contidos num arquivo texto

Find - Pesquisar trechos (strings) dentro de arquivos

Utilizando o comando cat

Visualizando arquivos em modo texto

Guia básico de referência do DPKG

Remoção de pacotes RPM

#1 Comentário enviado por uxhsilva em 23/06/2003 - 16:42h
O script correto fica da seguinte forma :

#!/bin/bash
# linhas.sh
# Sintaxe: ./linhas.sh arquivo L1 L2

if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]
then
echo -e "\nSintaxe : $0 arquivo Linha_inicio Linha_fim\n"
exit
fi

ARQ="${1}"
L1=`expr ${3} \- ${2}`
L1=`expr ${L1} + 1`
L2="${3}"

head -n $L2 ${ARQ} | tail -n ${L1}
#2 Comentário enviado por AprendiNoLinux em 05/09/2011 - 12:26h
Se eu preciso das duas primeiras linhas do arquivo e as duas últimas linhas do arquivo ?
#3 Comentário enviado por Miqueloti em 26/03/2012 - 18:20h
AprendiNoLinux, basta utilizar os comandos head e tail que pegam n linhas do inicio / n linhas do fim do arquivo respectivamente.

Comando:
head -n 2 seu_arquivo.txt; tail -n 2 seu_arquivo.txt;

Este comando mostraria na tela, caso queira redirecionar para um novo arquivo bastaria utilizar o operador para tal:
head -n 2 seu_arquivo.txt >> novo_arquivo.txt; tail -n 2 seu_arquivo.txt >> novo_arquivo.txt;
#4 Comentário enviado por jlaudirt em 01/11/2014 - 12:35h
Ressucitando o topico...

Tenho uma lista de 996 arquivos com o nome arquivonome_01.txt até arquivonome_996.txt
Gostaria de renomear os arquivos usando o título (primeira linha) como o novo nome do arquivo.
Olhando esta dica do "head -n NUMERO" pensei em concatenar os comandos.

Eis a solução:
ls -w1 *.txt | while read FILE;
do
mv "$FILE" "$(echo $FILE | head -n 1 $FILE)".txt;
done
#5 Comentário enviado por fernandomsilva em 11/02/2015 - 23:09h

Muito bom, aprendendo cada dia mais. Viva o Linux \0/
#6 Comentário enviado por juniormarangao em 19/03/2019 - 09:30h
Linuxers,

eu gostaria de saber se tem como fazer mostrar relacionado ao conteúdo, por exemplo:


A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
SP UNIT FAULT

SPG NODE
0 A

FAULT TYPE
INTERNAL DIAGNOSTIC ERROR

SUSPECTED BOARD(S)

CABINET MAG PCB UNIT FAULT WEIGHT
SPG-0-A SPVCM HDD HD-1 83
SPG-0-A SPVCM CPU 17

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA
ERSUN.SEGURANCA


Nessa caso, estaria salvo isso num arquivo, mas tem muitas coisas não muito úteis, e queria tudo o que for conteúdo da linha que contenha "A1" e mais 3 linhas em sequencia abaixo. Um comando que fizesse exibir assim:


A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
SP UNIT FAULT

SPG NODE

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA
ERSUN.SEGURANCA


Alguma ideia de como fazer isso?

Contribuir com comentário

Entre na sua conta para comentar.