Se você estivesse ajudando alguém a aprender o conceito de pipes na linha de comando, que exemplo você usaria? O exemplo que realmente surgiu foi o seguinte:
cat whatever.txt | less
Sinto que esse não é o melhor exemplo, ou seja, porque há apenas um passo. De que serve um uso bom, porém fundamental |
?
Idealmente, o exemplo que apresentarei usará programas que possuem saídas próprias que podem ser executadas independentemente e depois mostradas juntas.
command-line
pipe
Mateus
fonte
fonte
cat
disso, poisless whatever.txt
funciona muito bem.Respostas:
Vou orientá-lo em um exemplo um tanto complexo, baseado em um cenário da vida real.
Problema
Digamos que o comando
conky
parou de responder na minha área de trabalho e quero matá-lo manualmente. Conheço um pouco do Unix, então sei que o que preciso fazer é executar o comandokill <PID>
. Para recuperar o PID, posso usarps
outop
ou qualquer outra ferramenta que minha distribuição Unix me deu. Mas como posso fazer isso em um comando?Responda
AVISO LEGAL: Este comando funciona apenas em certos casos. Não copie / cole no seu terminal e comece a usá-lo, pois isso pode matar os processos sem suspeitar. Em vez disso, aprenda como construí-lo .
Como funciona
1-
ps aux
Este comando exibirá a lista de processos em execução e algumas informações sobre eles. A informação interessante é que ele produzirá o PID de cada processo em sua 2ª coluna. Aqui está um extrato da saída do comando na minha caixa:
2-
grep conky
Estou interessado apenas em um processo, então eu uso
grep
para encontrar a entrada correspondente ao meu programaconky
.3-
grep -v grep
Como você pode ver na etapa 2, o comando
ps
gera ogrep conky
processo em sua lista (afinal, é um processo em execução). Para filtrá-lo, eu posso corrergrep -v grep
. A opção-v
indicagrep
para corresponder a todas as linhas, excluindo as que contêm o padrão.NB: Eu adoraria saber uma maneira de executar as etapas 2 e 3 em uma única
grep
chamada.4-
awk '{print $2}'
Agora que eu isolei meu processo de destino. Eu quero recuperar seu PID. Em outras palavras, quero recuperar a segunda palavra da saída. Para minha sorte, a maioria (todos?) Dos escritórios modernos fornecerá uma versão de
awk
uma linguagem de script que faz maravilhas com dados tabulares. Nossa tarefa se torna tão fácil quantoprint $2
.5-
xargs kill
Eu tenho o PID. Tudo que eu preciso é passar para
kill
. Para fazer isso, eu vou usarxargs
.xargs kill
lerá da entrada (no nosso caso, do canal), formará um comando que consiste emkill <items>
(<items>
seja o que for que for lido da entrada) e, em seguida, execute o comando criado. No nosso caso, ele será executadokill 1948
. Missão cumprida.Palavras finais
Observe que, dependendo da versão do unix que você está usando, determinados programas podem se comportar de maneira um pouco diferente (por exemplo,
ps
pode gerar o PID na coluna $ 3). Se algo parecer errado ou diferente, leia a documentação do seu fornecedor (ou melhor, asman
páginas). Também tenha cuidado, pois tubos longos podem ser perigosos. Não faça suposições, especialmente ao usar comandos comokill
ourm
. Por exemplo, se houvesse outro usuário chamado 'conky' (ou 'Aconkyous'), meu comando também poderia matar todos os seus processos em execução!O que estou dizendo é ter cuidado, especialmente para tubos longos. É sempre melhor construí-lo interativamente, como fizemos aqui, do que fazer suposições e sentir pena depois.
fonte
kill $(pgrep conky)
pkill conky
grep
chamada.grep [c]onky
é o que você está procurando.O meu favorito é este:
youtube-dl $1 -q -o - | ffmpeg -i - $2
baixa um vídeo do URL do YouTube fornecido
$1
e o exibe como o arquivo fornecido por$2
. Observe como o arquivo é-q
baixado silenciosamente para STDOUT-o -
, canalizado para ffmpeg e usado como entrada por lá-i -
.Especialmente para iniciantes no Linux, este pode ser um exemplo prático do motivo pelo qual a linha de comando pode ser útil e facilitar as coisas do que usar ferramentas da GUI. Não sei quanto tempo levaria para baixar um vídeo do youtube e converter seu som em um mp3. A linha acima pode fazer isso em alguns segundos.
fonte
youtube-dl --extract-audio --audio-format mp3 -a -
. Ainda é um exemplo legal, mas existem maneiras mais fáceis de fazer isso. (Chama ffmpeg internamente).youtube-dl $1 -q -o - | mplayer -
reproduz diretamente o vídeo no mplayer. Eu uso esse comando no meu laptop para dizer ao meu servidor (conectado à TV) para reproduzir vídeos. Tenho que acrescentar-display :0.0 -geometry 400x300+1200+200
para permitir que a janela do mplayer apareça na tela correta.O uso geral (leia-se: o modo como uso na maioria das vezes) é quando, por algum motivo, tenho que executar alguns dados através de várias ferramentas para executar tarefas de processamento diferentes.
Então, eu diria que o uso de tubos é como cola para montar vários blocos de construção (as diferentes ferramentas UNIX) juntos. Como Ulrich disse,
sort
euniq
é uma estrofe comum.Dependendo da audiência, se você quiser destacar esse uso de pipes, poderá, por exemplo, começar com: "ei, este programa contém links para vários PDFs interessantes com papéis e notas de aula, mas alguns deles são repetidos. de alguma forma automatizar isso? "
Em seguida, você pode mostrar como
lynx --dump --listonly
fica a lista de links, comogrep
filtrar os links que terminam em.pdf
, comocolrm
oused
pode se livrar dos númeroslynx
gravados restantes em cada URL, comosort
euniq
se livrar das duplicatas e, finalmente, comowget -i -
pode ser usado para recuperar o arquivos (usando--wait
para ser gentil com o servidor, é claro).Receio que este seja um exemplo complexo. Por outro lado, pode ajudar a mostrar a potência dos tubos quando você apenas o canaliza e faz com que a concha execute tudo de uma vez.
fonte
sort -u
em coreutils GNU também.Eu não sei exatamente o que é bom, mas a tubulação
grep
deve ser um dos usos mais comuns, possivelmente seguido porwc -l
. (Sim,grep
possui a opção pouco conhecida-c
.)Outra estrofe comum é
| sort | uniq
, apenas porqueuniq
requer que sua entrada seja classificada.fonte
... | sort -u
se disponível!Não que você precise para este exemplo, mas:
... inverter a ordem dos greps preserva a colorização, mas é MUITO menos eficiente. presumivelmente em grandes listas, a cor não importaria.
Além disso, esta página da Web sugere:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
... mas isso não funcionará se você estiver procurando uma única letra (como o processo 'X').
fonte
Eu finalmente posso compartilhar essa bagunça que eu fiz há cerca de um ano e meio ...
Isto...
Isso poderia ter sido muito melhor com um único script Python, aposto.
fonte
Esta é a primeira coisa que me veio à mente ...
mysqldump
é um aplicativo de console que envia dados, esquema e, opcionalmente, procedimentos e funções ao stdout. Geralmente, ele é redirecionado para um arquivo para backup.mysqldump <options> > mydb.dump
Isso daria a você um script sql não compactado. Para economizar espaço, você pode compactá-lo com o bzip2.
bzip2 mydb.dump
Como alternativa, você pode fazer as duas coisas em uma etapa:
mysqldump <options> | bzip2 > mydb.dump.bz2
Neste exemplo acima, o stdout from
mysqldump
é canalizado para o bzip2, que, em seguida, é redirecionado para um arquivo.fonte
bzcat mydb.dump.bz2 | mysql <options>
.Aqui está um exemplo que eu uso no meu trabalho de vários pipes em um comando. Isso usa o gawk para pesquisar o log de consultas gerais do MySQL ($ OFILE) e encontrar os logins negados. Em seguida, classifica essa lista por nome, canaliza a lista para uniq, que conta as ocorrências e, em seguida, canaliza uma última vez para classificar a lista contada numericamente ...
fonte
Os tubos funcionam melhor com filtros e tradutores
Dessa forma, os dados podem fluir de um programa para o próximo buffer e, em nenhum momento, todos os dados precisam estar na memória de uma só vez.
fonte
cat filename | less
é um uso terrível da tubulação, já que você pode simplesmente fazerless filename
Aqui está um exemplo de pips que eu uso todos os dias (mas também pode ser um mau exemplo):
ls -la | more -c
As respostas de scott hoffman e njsg são melhores exemplos.
fonte
Que tal: pesquisar padrões e exibir o último padrão ocorrido?
Mostra como usar
tail
,sed
egrep
num contexto tubo que pode ser construída passo a passo.fonte
execute este em qualquer diretório que você deseja classificar para analisar o tamanho da pasta (depois role para baixo com a tecla END):
Sortiert nach Ordnergrösse
fonte
Aqui está um exemplo que eu usei para definir a variável DISPLAY quando o xauth não era uma opção ...
O primeiro comando obtém os dados necessários, ou seja, nome do host ou IP. O segundo comando obtém apenas esses dados (último campo). Finalmente, o último comando retira parênteses dos dados.
fonte
Tubulação de comando que você pode usar em qualquer lugar que achar que a saída do primeiro comando pode ser alimentada como entrada para a próxima.
Exemplos.
exemplo de gato txt | grep {some_line} | awk {some_command}
É simplesmente o conceito de que, se você sentir a saída do comando executada, pode ser a entrada de outro comando, pode canalizá-los.
fonte