Como usar Pipes no Linux
Use pipes 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 unilateral.Nós mostramos a você como.
Os canos estão em toda parte
Os canos são um dosos recursos de linha de comando mais úteis que os sistemas operacionais Linux e Unix possuem. Tubos são usados de inúmeras maneiras. Veja qualquer artigo de linha de comando do Linux em qualquer site, não apenas o nosso, e você verá que os pipes aparecem mais frequentemente do que não. Analisei alguns dos artigos sobre Linux do How-To Geek, e os pipes são usados em todos eles, de uma maneira ou de outra.
Os pipes do Linux permitem executar ações que não são suportadas-a-caixa pela concha. Mas, como a filosofia de design do Linux é ter muitos utilitários pequenos que executam muito bem sua função dedicada, e sem funcionalidade desnecessária, a "fazer uma coisa e fazer bem" ”mantra - você pode plugar seqüências de comandos junto com pipes, para que a saída de um comando se torne a entrada de outro. Cada comando que você usa traz seu talento único para a equipe, e logo você descobre que montou uma equipe vencedora.
Um exemplo simples
Suponha que tenhamos um diretório completode muitos tipos diferentes de arquivos. Queremos saber quantos arquivos de um determinado tipo estão nesse diretório. Existem outras maneiras de fazer isso, mas o objetivo deste exercício é introduzir pipes, então vamos fazê-lo com pipes.
Podemos obter uma lista dos arquivos facilmente usando ls:
ls
Para separar o tipo de arquivo de interesse, usaremos grep. Queremos encontrar arquivos com a palavra “ página ”em seu nome de arquivo ou extensão de arquivo.
Usaremos o caractere especial do shell “ | ”canalizar a saída de ls para grep.
ls |grep "página"
grep imprime linhas que correspondem ao seu padrão de pesquisa. Portanto, isso nos fornece uma lista contendo apenas "página". arquivos.
Mesmo este exemplo trivial exibe a funcionalidade dos pipes.A saída de ls não foi enviada para a janela do terminal. Foi enviado ao grep como dados para o comando grep trabalhar.A saída que vemos vem do grep, que é o último comando dessa cadeia.
Estendendo nossa cadeia
Vamos começar a estender nossa cadeia de comandos canalizados. Podemos contar a página "“."arquivos adicionando o comando wc. Usaremos a opção -l (contagem de linhas) com wc. Observe que também adicionamos a opção -l (formato longo) ao ls. Usaremos isso em breve.
ls - |grep "página" |wc -l
grep não é mais o último comando da cadeia, portanto, não vemos sua saída.A saída do grep é alimentada no comando wc.A saída que vemos na janela do terminal é de wc. wc relata que existem 69 “ . page ”arquivos no diretório.
Vamos estender as coisas novamente. Vamos retirar o comando wc da linha de comando e substituí-lo por awk. Existem nove colunas na saída de ls com a opção -l (formato longo). Usaremos o awk para imprimir as 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 ''
Obtemos uma lista dessas colunas, para cada um dos arquivos correspondentes.
Nós & #8217; passará agora essa saída pelo comando de classificação. Usaremos a opção -n (numérico) para informar a classificação que a primeira coluna deve ser tratada como números.
ls -l |grep "página" |awk '' |sort -n
A saída agora está classificada em ordem de tamanho de arquivo, com nossa seleção personalizada de três colunas.
Adicionando outro comando
Nós terminaremos adicionando o comando tail. Vamos dizer para listar apenas as últimas cinco linhas de saída.
ls -l |grep "página" |awk '' |classificar -n |tail -5
Isso significa que nosso comando se traduz em algo como “ mostre-me os cinco maiores “ . page ”arquivos neste diretório, ordenados por tamanho. ”Obviamente, não há comando para fazer isso, mas, usando tubos, criamos o nosso. Poderíamos adicionar esse "— ou qualquer outro comando longo" como um apelido ou função de shell para salvar toda a digitação.
Aqui está a saída:
Podemos reverter a ordem do tamanho adicionando a opção -r (reverse) ao comando de classificação e usando head em vez de tail paraescolha as linhas da parte superior da saída.
Desta vez, as cinco maiores páginas da página ”os arquivos são listados do maior para o menor:
Alguns exemplos recentes
Aqui estão dois exemplos interessantes de artigos recentes sobre como fazer geeks.
Alguns comandos, como o xargscommand, são projetados para ter a entrada canalizada para eles. Aqui está uma maneira de contarmos as palavras, os caracteres e as linhas em vários arquivos, canalizando ls para xargs, que depois alimenta a lista de nomes de arquivos para wc, como se eles tivessem sido passados para wc como parâmetros de linha de comando./ p>
ls * .página |xargs wc
O número total de palavras, caracteres e linhas está listado na parte inferior da janela do terminal.
Aqui está uma maneira de obter uma lista classificada das extensões de arquivo exclusivas no diretório atual, com uma contagem de cada tipo.
ls |rev |cut -d '.'-f1rev |ordenar |uniq -c
Há muita coisa acontecendo aqui.
- ls: lista os arquivos no diretório
- rev: inverte o texto nos nomes dos arquivos.
- cut: Corta a string na primeira ocorrência do delimitador especificado "“." # 8221 ;.O texto depois disso é descartado.
- rev: reverte o texto restante, que é a extensão do nome do arquivo.
- sort: classifica a lista em ordem alfabética.
- uniq: Countso número de cada entrada exclusiva na lista.
A saída mostra a lista de extensões de arquivo, classificadas em ordem alfabética com uma contagem de cada tipo exclusivo.
Canais nomeados
Existe outro tipo de canal disponível para nós, chamado pipes nomeados. Os pipes nos exemplos anteriores são criados instantaneamente pelo shell quando ele processa a linha de comando. Os tubos são criados, usados e depois descartados.São transitórios e não deixam vestígios de si mesmos. Eles existem apenas enquanto o comando que os utiliza estiver em execução.
Os pipes nomeados aparecem como objetos persistentes no sistema de arquivos, para que você possa vê-los usando ls. Eles são persistentes porque sobreviverão a uma reinicialização do computador, embora todos os dados não lidos neles sejam descartados na época.
Os pipes nomeados foram usados muito ao mesmo tempo para permitir que diferentesprocessos para enviar e receber dados, mas eu não os vejo sendo usados dessa maneira há muito tempo. Sem dúvida, existem pessoas por aí ainda usando-as com grande efeito, mas eu não a encontrei recentemente. Mas por completude ’ou apenas para satisfazer sua curiosidade, veja como você pode usá-los.
Canais nomeados são criados com o comando mkfifo. Este comando criará um pipe nomeado chamado "geek-pipe" ”no diretório atual.
mkfifo geek-pipe
Podemos ver os detalhes do pipe nomeado se usarmos o comando ls coma opção -l (formato longo):
ls -l geek-pipe
O primeiro caractere da listagem é um & #8220; p ”, o que significa que é um tubo. Se fosse um “ d ”, isso significaria que o objeto do sistema de arquivos é um diretório e um traço “ - ”significaria que é um arquivo comum.
Usando o pipe nomeado
Vamos usar o nosso pipe. Os pipes não nomeados que usamos em nossos exemplos anteriores passaram os dados imediatamente do comando de envio para o comando de recebimento. Os dados enviados através de um pipe nomeado permanecerão no pipe até serem lidos. Na verdade, os dados são mantidos na memória; portanto, o tamanho do pipe nomeado não varia nas listagens ls, independentemente de haver dados nele ou não.
Vamos usar duas janelas de terminal para isso. exemplo. Vou usar o rótulo:
# Terminal-1
em uma janela do terminal e
# PRE-Terminal-2
no outro, para que você possa diferenciar entre eles.O hash “ # ”informa ao shell que o que se segue é um comentário, e para ignorá-lo.
Vamos pegar a totalidade do nosso exemplo anterior e redirecioná-la para o pipe nomeado. Então, estamos usando pipes não nomeados e nomeados em um comando:
ls |rev |cut -d '.'-f1rev |ordenar |uniq -c >geek-pipe
Nada demais parece acontecer. Você pode notar que não é retornado ao prompt de comando, portanto algo está acontecendo.
Na outra janela do terminal, emita este comando:
gato <geek-pipe
Estamos redirecionando o conteúdo do pipe nomeado para o gato, para que o gato exiba esse conteúdo na segunda janela do terminal. Aqui está a saída:
E você verá que retornou ao prompt de comando na primeira janela do terminal.
Então, o que aconteceu.
- Redirecionamos algumas saídas para o pipe nomeado.
- A primeira janela do terminal não retornou parao prompt de comando.
- Os dados permaneceram no canal até serem lidos no canal 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 objetivo de não usar o processamento em segundo plano era destacar que um pipe nomeado é um processo de bloqueio. Colocar algo em um tubo nomeado abre apenas uma extremidade do tubo.O outro lado não é aberto até que o programa de leitura extraia os dados.O kernel suspende o processo na primeira janela do terminal até que os dados sejam lidos na outra extremidade do canal.
O poder dos tubos
Atualmente, os tubos nomeados são uma novidadeato.
Tubos simples e antigos do Linux, por outro lado, são uma das ferramentas mais úteis que você pode ter no seu kit de ferramentas da janela de terminal.A linha de comando do Linux começa a ganhar vida e você recebe uma nova energia quando pode orquestrar uma coleção de comandos para produzir um desempenho coeso.
Dica de despedida: É melhor escrever suacomandos canalizados, adicionando um comando de cada vez e fazendo com que essa parte funcione; em seguida, canalize o próximo comando.
Via: How to Geek
Nenhum comentário