Como o “-dc” funciona em “cat / dev / urandom | tr -dc "01"?

2

Até agora eu sei o arquivo /dev/urandom é um dos arquivos especiais, seu objetivo é gerar caracteres aleatórios. Quando executo cat /dev/urandom de um fluxo de caracteres estranhos, alguns ideogramas chineses são exibidos continuamente. No entanto, se canalizar esse fluxo de caracteres estranhos para tr com a opção -dc , um fluxo aleatório de 0 e 1 ou qualquer caractere será colocado entre aspas em tr -dc "setofcharacters" .

Eu tentei ler o manual para tr, mas em -d e -c obtive explicações que não entendo ou que poderiam fazer sentido, como

   -c, -C, --complement
          use the complement of SET1

   -d, --delete
          delete characters in SET1, do not translate

alguém poderia ser gentil e fornecer uma explicação passo a passo da lógica por trás do cat /dev/urandom | tr -dc "01"

    
por Abdul Al Hazred 05.03.2015 / 16:30

4 respostas

5

Acho que o maior problema é entender o que "complemento" significa na descrição da opção -c . Refere-se a complementar como na teoria dos conjuntos, leia sobre isso na Wikipedia :

In set theory, a complement of a set A refers to things not in (that is, things outside of) A.

Complemento do conjunto 01 significa todos os caracteres, exceto 0 e 1. Assim, a opção -d removerá todos os caracteres que não sejam 0 nem 1.

    
por 05.03.2015 / 17:25
2

-d significa excluir todos os caracteres em SET1 e -c significa usar o "complemento" de SET1. Combinado, isso significa: excluir todos os caracteres que não estão no SET1

Você está recebendo uma lista de caracteres, incluindo 0s e 1s, e o tr -dc "01" está excluindo todos os caracteres que não estão na lista "01", exibindo apenas 0s e 1s.

    
por 05.03.2015 / 16:44
1

A opção de complemento simplesmente fornece o conjunto inverso do conjunto que você fornece. Então, se você der 01, isso afetará tudo que não é 0 ou 1 caractere ASCII. E a opção delete excluirá o conjunto selecionado. Então você está simplesmente excluindo tudo na entrada que não é um caractere ASCII 0 ou 1.

Por favor, entenda que estes são apenas caracteres ASCII da saída de / dev / urandom, eles não são os valores binários reais que representam a saída de todos os caracteres em / dev / urandom.

    
por 05.03.2015 / 16:43
1

Se você ler cuidadosamente o manual , poderá explicar facilmente o comando .

A forma geral:

tr [option]... set1 [set2]

Com seu comando:

tr -dc "01"

set1 contém 0 e 1 . Com a opção -c , tr substituirá set1 pelo seu complemento, o que significa todos os caracteres, exceto 0 e 1 .

Assim, o comando pode ser interpretado como Excluir todos os caracteres, exceto zero e um .

    
por 05.03.2015 / 16:44