#!/bin/bash
while :
do
echo Paste some input, then press Control-D:
cat > /tmp/sortme ; diff <(sort /tmp/sortme) <(sort -u /tmp/sortme)
done
Eu tenho uma lista que copiei e quero colá-la no shell para me dar apenas as linhas repetidas.
1
1
3
2
Quando leio sobre os comandos do bash, eu já fiz isso:
cat > /tmp/sortme ; diff <(sort /tmp/sortme) <(sort -u /tmp/sortme)
Quando escrevo o comando acima eu colo minha lista e pressiono CTRL+Z
para parar o gato e ele mostra as linhas repetidas. Eu não quero comparar arquivos, apenas colei a entrada de várias linhas.
Agora, à pergunta:
Existe alguma maneira de transformar esse comando em script? Porque quando eu tento fazer isso como um script e CTRL+Z
pára.
PS: Por favor não ria. Este é o meu primeiro momento tentando. Até agora apenas lendo. :)
O primeiro problema é o controle Z, em uma configuração padrão, ele suspende o trabalho, deixando em segundo plano não rodando. Você vai notar isso com a saída, que vai dizer que você parou de emprego. (outros comandos de controle de trabalho também podem) O que você queria era o Controle D que, quando digitado em um terminal, envia um Fim de Arquivo. Isso é muito diferente dos dos e das janelas.
Em segundo lugar, quando você vê cat em um script, 90% do tempo não é necessário. Existem três maneiras de fazer o que você está tentando fazer sem o uso do gato que vem ao topo da minha cabeça:
tee tee /tmp/sortme | sort | diff - <(sort -u /tmp/sortme)
você também pode substituir o arquivo temporário por um link nomeado.
usando uniq -d sort | uniq -d
xclip que permite acessar a área de transferência a partir da linha de comando para que você não precise enviar um EOF. Ele também pode ser combinado com as duas opções anteriores para que todas as quatro linhas façam o que você deseja.
xclip -o > /tmp/sortme ; diff <(sort /tmp/sortme) <(sort -u /tmp/sortme)
diff <(xclip -o|sort) <(xclip -o|sort -u)
xclip -o|tee /tmp/sortme | sort | diff - <(sort -u /tmp/sortme)
xclip -o|sort | uniq -d
Tags bash diff sort shell-script