Como usar Pipes no Linux

Conteúdo

Terminal Linux em um laptop

Use os pipelines do Linux para coreografar como os utilitários de linha de comando colaboram. Simplifique processos complexos e aumente sua produtividade, aproveitando uma coleção de comandos independentes e transformando-os em uma equipe de propósito único. Nós mostramos como.

Pipes estão por toda parte

Pipelines são um dos recursos de linha de comando mais úteis disponíveis no Linux e em sistemas operacionais semelhantes ao Unix.. Os tubos são usados ​​de inúmeras maneiras. Veja qualquer artigo de linha de comando do Linux, em qualquer portal da web, não só no nosso, e você verá que os tubos aparecem na maioria das vezes. Eu verifiquei algumas das postagens do How-To Geek sobre Linux, e em todos eles são usados ​​tubos, de uma forma ou outra.

Os canais do Linux permitem que você execute ações que não são suportadas pelo Linux Concha. Mas porque a filosofia de design do Linux é ter um monte de pequenos utilitários que fazem o seu função dedicada muito beme sem funcionalidade desnecessária, o mantra "faça uma coisa e faça bem", você pode conectar strings de comando junto com tubos para que a saída de um comando se torne a entrada de outro. Cada comando que entra traz seu talento único para a equipe, e você logo descobrirá que montou um time vencedor.

Um exemplo simples

Suponha que temos um diretório cheio de muitos tipos diferentes de arquivos. Queremos saber quantos arquivos de um determinado tipo estão nesse diretório. Existem outras alternativas para fazer isso, mas o objetivo deste exercício é introduzir tubos, é por isso que faremos isso com tubos.

Podemos obter uma lista dos arquivos facilmente usando ls:

ls

Para separar o tipo de arquivo de interesse, usaremos grep. Queremos encontrar arquivos que tenham o chão “página” em seu nome de arquivo ou extensão de arquivo.

Usaremos o caráter especial shell “|“Para canalizar a saída de ls dentro de grep.

ls | grep "página"

grep imprimir linhas que corresponde ao seu padrão de pesquisa. Então, isso nos dá uma lista contendo apenas arquivos “.página”.

Mesmo este exemplo trivial mostra a funcionalidade de tubos. A saída de ls não foi enviado para a janela do terminal. Foi enviada para grep como dados para o grep comando para trabalhar. A saída que vemos vem de grep, qual é o último comando nesta string.

Expandindo nossa rede

Vamos começar a estender nossa cadeia de comando em pipeline. Nós podemos contar os arquivos “.página” adicionando o wc comando. Nós vamos usar o -l (contagem de linha) opção com wc. Observe que, ao mesmo tempo, adicionamos o -l (formato longo) opção para ls . Nós o usaremos em breve.

ls - | grep "página" | wc -l

grep não é mais o último comando da cadeia, então não vemos sua saída. A saída de grep alimenta o wc comando. A saída que vemos na janela do terminal é wc. wc informa que existe 69 Arquivos ".page" no diretório.

Vamos espalhar as coisas de novo. Vamos levar o wc comando fora da linha de comando e substitua-o por awk. Existem nove colunas na saída de ls com ele -l opção (formato longo). Usaremos awk para imprimir colunas cinco, três e nove. Estes são o tamanho, o proprietário e o nome do arquivo.

ls -l | grep "página" | awk '{imprimir $5 " " $3 " " $9}'

Temos uma lista dessas colunas, para cada um dos arquivos correspondentes.

Agora vamos passar essa saída pelo sort comando. Nós vamos usar o -n opção (numérico) Deixar sort saiba que a primeira coluna deve ser tratado como números.

ls -l | grep "página" | awk '{imprimir $5 " " $3 " " $9}' | sort -n

A saída agora é classificada pelo tamanho do arquivo, com nossa seleção personalizada de três colunas.

Adicionar outro comando

Terminaremos adicionando o tail comando. Diremos a você para listar o últimas cinco linhas de partida só.

ls -l | grep "página" | awk '{imprimir $5 " " $3 " " $9}' | sort -n | cauda -5

Isso significa que nosso comando se traduz em algo como “mostre-me os cinco arquivos” .página “maior neste diretório, classificado por tamanho”. Desde depois, não há comando para alcançá-lo, mas ao usar canos, nós criamos o nosso. Nós poderíamos adicionar isso, ou qualquer outro comando longo, como um apelido ou função shell para salvar toda a escrita.

Aqui está o resultado:

Poderíamos reverter a ordem de tamanho adicionando o -r opção (reverter) a sort comando, e usando head ao invés de tail escolha as linhas do topo da tomada.

Desta vez, os cinco arquivos “.página” maiores são listados de mais alto para menor:

Alguns exemplos recentes

Aqui estão dois exemplos interessantes de postagens recentes sobre como fazer geek.

Alguns comandos, como ele xargscomando, são projetados ter a entrada canalizada para eles. Aqui está uma maneira que podemos ter wc conte o palavras, personagens e falas em vários arquivos, canalização ls dentro de xargs que posteriormente alimenta a lista de nomes de arquivos para wc como se tivessem sido passados ​​para wc como parâmetros de linha de comando.

ls * .page | xargs wc

O número total de palavras, caracteres e linhas são listados na parte inferior da janela do terminal.

Esta é uma maneira de obter uma lista ordenada das extensões de arquivo exclusivas no diretório atual, com uma contagem de cada tipo.

ls | rev | cut -d '.' -f1 | rev | ordenar | uniq -c

Muita coisa está acontecendo aqui.

A saída mostra a lista de extensões de arquivo, classificados em ordem alfabética com uma contagem de cada tipo único.

Tubos nomeados

Existe outro tipo de tubo disponível para nós, chamados de tubos nomeados. Os tubos nos exemplos anteriores são criados instantaneamente através do shell ao processar a linha de comando. Pipes são criados, usado e depois descartado. Eles são passageiros e não deixam rastros de si mesmos. Eles só existem enquanto o comando que os usa está em execução.

Pipes nomeados aparecem como objetos remanescentes no sistema de arquivos, então você pode vê-los usando ls. Eles são persistentes porque sobreviverão a uma reinicialização do computador, mesmo que todos os dados não lidos que eles contêm naquele momento sejam descartados.

Pipes nomeados eram usados ​​muito ao mesmo tempo para permitir que diferentes processos enviassem e recebessem dados, mas eu não os vejo usados ​​dessa forma há muito tempo. Sem dúvida, há pessoas que ainda os usam com grande efeito, mas eu não encontrei nenhum recentemente. Mas por uma questão de integridade, ou apenas para satisfazer sua curiosidade, é assim que você pode usá-los.

Pipes nomeados são criados com o mkfifo comando. Este comando irá criar um tubo nomeado chamado “geek-pipe” no diretório atual.

mkfifo geek-pipe

Podemos ver os detalhes do tubo nomeado se usarmos o ls comando com o -l (formato longo) opção:

ls -l geek-pipe

O primeiro personagem da lista é um “p”, o que significa que é um cano. Se fosse um “d”, significaria que o objeto do sistema de arquivos é um diretório, e um roteiro “-” significaria que é um arquivo normal.

Use o tubo nomeado

Vamos usar nosso cachimbo. Os canais não nomeados que usamos em nossos exemplos anteriores transmitiram os dados imediatamente do comando de envio para o comando de recebimento. Os dados enviados por meio de um pipeline nomeado permanecerão no pipeline até que sejam lidos. Os dados são realmente armazenados na memória, então o tamanho do tubo nomeado não irá variar em ls listado se há dados nele ou não.

Usaremos duas janelas de terminal para este exemplo. Vou usar a tag:

# Terminal 1

em uma janela de terminal e

# Terminal 2

no outro, então você pode diferenciá-los. O hash “#” diz à casca que o que se segue é um comentário e ignora.

Vamos pegar todo o nosso exemplo anterior e redirecioná-lo para o canal nomeado. Então, estamos usando tubos nomeados e não nomeados em um comando:

ls | rev | cut -d '.' -f1 | rev | ordenar | uniq -c > geek-pipe

Não vai parecer que muita coisa vai acontecer. Qualquer forma, você pode notar que ele não retorna ao prompt de comando, então algo está acontecendo.

Na outra janela do terminal, emitir este comando:

gato < geek-pipe

Estamos redirecionando o conteúdo do pipe nomeado para cat, é por isso cat iráexibir esse conteúdo na segunda janela do terminal. Aqui está o resultado:

E você verá que voltou ao prompt de comando na primeira janela do terminal.

Então, o que aconteceu?

  • Redirecionamos alguns resultados para o canal nomeado.
  • A primeira janela do terminal não retornou ao prompt de comando.
  • Os dados permaneceram no pipeline até serem lidos no pipeline no segundo terminal.
  • Voltamos ao prompt de comando na primeira janela do terminal.

Você pode estar pensando que poderia executar o comando na primeira janela do terminal como uma tarefa em segundo plano, adicionando um & até o final do comando. E você estaria certo. Nesse caso, teríamos retornado ao prompt de comando imediatamente.

O ponto de não O uso de processamento em segundo plano foi para destacar que um canal nomeado é um procedimento de bloqueio. Colocar algo em um tubo nomeado abre apenas uma extremidade do tubo. A outra extremidade não abre até que o leitor extraia os dados. O kernel suspende o procedimento na primeira janela do terminal até que os dados sejam lidos da outra extremidade do tubo.

O poder dos tubos

Atualmente, Pipes nomeados são uma espécie de ato perturbador.

Os velhos tubos do Linux, por outro lado, eles são uma das ferramentas mais úteis que você pode ter em seu kit de ferramentas de janela de terminal. A linha de comando do Linux começa a ganhar vida para você, E você ganha um poder totalmente novo quando pode orquestrar uma coleção de comandos para produzir uma performance coesa..

Sugestão de despedida: é melhor escrever seus comandos em pipeline adicionando um comando ao mesmo tempo e fazendo essa parte funcionar, mais tarde, canalizando no seguinte comando.

setTimeout(função(){
!função(f,b,e,v,n,t,s)
{E se(f.fbq)Retorna;n = f.fbq = função(){n.callMethod?
n.callMethod.apply(n,argumentos):n.queue.push(argumentos)};
E se(!f._fbq)f._fbq = n;n.push = n;n.loaded =!0;n.version = ’2.0′;
n.queue =[];t = b.createElement(e);t.async =!0;
t.src = v;s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, documento,'roteiro',
‘Https://connect.facebook.net/en_US/fbevents.js ’);
fbq('iniciar', ‘335401813750447’);
fbq('acompanhar', ‘PageView’);
},3000);

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.