Exemplo de utilização do | (pipe)

Como já comentei em alguns posts atrás, o | (pipe) é um redirecionador de comandos muito útil. Ele funciona como se fosse um tubo…  pegando a saída de um comando e passando para outro!

Vejamos a utilização do pipe com os comandos head e tail. Vamos usar o tão-usado /etc/passwd para exemplo. Com os comandos head e o tail, consigo ver o início e o fim do arquivo.

Agora, imaginando que eu por algum motivo queira ver o que tem no meio de /etc/passwd!

Infelizmente, eu teclei “m<tab><tab>” e não apareceu nenhum comando chamado meiol =/

Então, lancei mão do pipe, e olha abaixo o que resultou essa experiência…

Problema:
Meu arquivo /etc/passwd possui 30 linhas! Como descobri isso?

Utilizei o comando:

# wc -l /etc/passwd
30 /etc/passwd

Esse wc vem de “word count” e o parâmetro -l serve para contagem de linhas 🙂 .

Continuando com o problema, sei que meu arquivo tem 30 linhas, e eu desejo ver da linha 15 até a linha 25. Como resolver isso, utilizando os comandos head e tail?

Solução

1º) Verificar onde está a linha 15 do arquivo… para isso, usamos o comando cat (que é um visualizador de arquivos em modo texto) com a opção -n, que serve para numerar as linhas:

# cat -n /etc/passwd

2º) Agora, vamos fazer uma “continha de padeiro”:
25 (a linha final que desejo ver) – 15 (a linha inicial) = 10
Tenho agora em mãos, a quantidade de linhas que desejo visualizar 😉 .

3º) Resolvendo o problema com o head, pipe e o tail:

# cat -n /etc/passwd | head -25 | tail -11
15  list:x:38:38:Mailing List Manager:/var/list:/bin/sh
16  irc:x:39:39:ircd:/var/run/ircd:/bin/sh
17  gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
18  nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
19  Debian-exim:x:100:102::/var/spool/exim4:/bin/false
20  statd:x:101:65534::/var/lib/nfs:/bin/false
21  identd:x:102:65534::/var/run/identd:/bin/false
22  ivani:x:1000:1000:,,,:/home/ivani:/bin/bash
23  sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
24  vana:x:1001:1001:,,,:/home/vana:/bin/bash
25  josue:x:1002:1002:,,,:/home/josue:/bin/bash

E colocamos para o tail mostrar 11 linhas ao invés de 10 pois o tail mostra exatamente as 10 últimas linhas… e queremos ver a linha anterior também que é exatamente a linha 15.

Vimos nesse exemplo, que o pipe trabalhou bastante! Pegou a saída do comando cat -n /etc/passwd e passou para o head mostrar as 25 primeiras linhas do arquivo, e depois, ainda entrou em ação, pegando a saída do comando head e passou para o tail finalizar, mostrando as últimas 11 linhas, que é o nosso resultado final!

Anúncios

head e tail – visualizando o início e o fim de um arquivo em modo texto

Nesse post, vou falar de dois comandos que nos ajudam a visualizar o início e o fim de um arquivo!

Comando head

Esse comando permite visualizar as primeiras linhas de um arquivo em modo texto. Por exemplo:

# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh

Por padrão, sem nenhum parâmetro, o head nos mostra as 10 primeiras linhas… sendo que, se quisermos modificar essa opção, ver mais linhas ou menos linhas, basta fazer:

# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync


Acima, eu pedi para ver somente as 5 primeiras linhas do arquivo /etc/passwd.

Comando tail

Esse comando, mostra as últimas linhas de um arquivo em modo texto! E, assim como o head, por padrão o tail sem nenhum parâmetro, sempre vai mostrar as 10 últimas linhas do arquivo!

Exemplo:

# tail /etc/passwd
identd:x:102:65534::/var/run/identd:/bin/false
ivani:x:1000:1000:,,,:/home/ivani:/bin/bash
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
vana:x:1001:1001:,,,:/home/vana:/bin/bash
josue:x:1002:1002:,,,:/home/josue:/bin/bash
familia:x:1003:1003:,,,:/home/familia:/bin/bash
priscila:x:1004:1004:,,,:/home/priscila:/bin/bash
manasses:x:1005:1005:,,,:/home/manasses:/bin/bash
messagebus:x:104:104::/var/run/dbus:/bin/false
haldaemon:x:105:105:Hardware abstraction layer,,,:/home/haldaemon:/bin/false

E, assim como o head, se quisermos ver mais ou menos linhas do final do arquivo, basta fazer:

# tail -5 /etc/passwd
familia:x:1003:1003:,,,:/home/familia:/bin/bash
priscila:x:1004:1004:,,,:/home/priscila:/bin/bash
manasses:x:1005:1005:,,,:/home/manasses:/bin/bash
messagebus:x:104:104::/var/run/dbus:/bin/false
haldaemon:x:105:105:Hardware abstraction layer,,,:/home/haldaemon:/bin/false

E aqui, uma dica sobre o tail: ele permite ver as últimas linhas de um  arquivo em tempo real.

Isso é muito útil quando você quer ler o que está sendo escrito em um log… então, para não ficar abrindo o arquivo de log, basta acrescentar o parâmetro -f:

# tail -f /var/log/syslog

Acima, será mostrado em tempo real, o que está sendo escrito no arquivo /var/log/syslog.

Para saber mais…

# man head

# man tail