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

Conhecendo o | (pipe) , o more e o grep

No post do comando ls, vimos como listar o conteúdo de um diretório. Vimos a opção de listar de forma recursiva e também listar arquivos ocultos.

Com a opção -R, quando listamos o diretório /, as informações passam praticamente “voando” na tela. Seria mais ou menos como dar aquela olhadinha rápida em um livro… somente olhando as páginas sem realmente analisar o conteúdo!

Só prá relembrar:

# ls -R /

O comando more no Linux é o paginador, que pode ser usando com vários outros comandos que precisam de uma ‘pausa’ na tela.

No nosso caso, queremos paginar a saída do ls , que está muito grande e não conseguimos ver tudo! Mas, para usar o comando estou conseguindo ver tudo!

E, para fazer isso, preciso de um ajudante, o | (pipe)!!!

O pipe no shell, faz com que eu possa jogar um comando, para dentro de outro!!

Ihh.. enrolou tudo. Vamos explicar melhor: todo comando no Linux, irá mostrar um resultado que chamamos de “saída do comando”.

E essa saída do comando sempre irá aparecer na tela (monitor) que é a saída padrão.

O pipe, tem o poder de fazer com que a saída de um comando não vá para a tela, e sim para o outro comando;

O nosso ls recursivo passou tudo muito rápido! Então, vamos usar o comando more para paginar!

Vejam:

# ls /R | more

Agora sim, o ls vai esperar um <enter > a cada tela cheia! Fazendo uma comparação, (uiiiii!) o more aqui funcionaria como a opção -p do comando dir usado no DOS!

E usamos o | (pipe) para dizer que a saída do comando ls que vinha muito rápido, não deveria ir para a tela, e sim para o comando more!

Onde o comando more recebeu toda a informação do ls e na hora de mostrar, paginou!

Agora, vamos ver como localizar um determinado arquivo dentro de um diretório! Vamos listar o diretório /etc.

# ls /etc

Quando executamos o comando acima, ele irá mostrar a listagem do diretório /etc de uma forma muito rápida. Então, podemos combinar o ls com o more para mostrar a lista de forma pausada:

# ls /etc | more

Bem, isso já resolve o nosso problema de ver a listagem do /etc de forma pausada. Mas… e se quisermos localizar um determinado arquivo ou diretório?

Vejam que mesmo paginando, ainda temos muita coisa… Daí, pra facilitar, podemos usar o comando grep, que funciona como uma espécie de filtro no Linux!

Dentro do diretório /etc, vamos localizar arquivos que contenham a cadeia de caracteres ‘pa’; para isso, primeiro vamos ter que listar para depois filtrar:

# ls | grep pa
manpath.config
pam.conf
pam.d
passwd

Vejam que o resultado do comando acima, trouxe não somente o que começa com pa como também tudo que tem pa no nome! Isso é o básico de uma filtragem!

Agora, melhorando nossa pesquisa e incrementando mais o filtro… e se quisessemos ver tudo o que começa com pa?

Exemplo:

# ls | grep ^pa
pam.conf
pam.d
passwd

Vejam que apenas acrescentamos a opção ^ que significa começo de linha, ou seja, tudo que começar com pa!

Ainda falando o grep, vamos fazer ao contrário… vamos listar tudo “que não comece” com pa:

# ls /etc/ | grep -v ^pa

Onde a opção -v aqui é inverso, ou seja, mostre tudo exceto o que comece com pa!

Vejam que usamos o pipe para unir comandos, e o legal de tudo isso, é que podemos usar o pipe mais de uma vez em uma mesma linha de comando!

Exemplo:

# ls /etc/ | grep -v ^m | more

No exemplo acima, jogamos um comando dentro do outro!

Primeiro, listamos o que tem dentro do /etc e jogamos para o grep, que irá tirar tudo que começa com m, e jogar para o more, que por sua vez, irá paginar o que sobrou do filtro!

Bem é isso aí… por enquanto vamos ficando por aqui e até o próximo post!