Qual é o significado das opções -d e -f de cut?

0

Como esse pipeline pode ser explicado:

cat /etc/passwd | cut -d : -f 9 2>&1 | sort | uniq 2>&1 | wc -l

Estou aprendendo sozinho o Unix e não entendo. O que significa cut -d : -f 7 2>&1 aqui?

    
por kim yuna 15.10.2013 / 20:22

1 resposta

4

cut -d : -f 9 2>&1

Esse é um comando individual no estilo Unix, no contexto maior, parte de um pipeline. Você pode dizer que pelo comando inteiro ter '|' personagens nele.

Você lê linhas de comando no estilo Unix da esquerda para a direita. O executável real (ou alias) será cut . Os argumentos para cut são "-d: -f 9" e o comando inteiro tem sua saída stderr redirecionada para stdout por "2 > & 1".

Uma das habilidades que você precisa como um usuário de linha de comando Unix ou Linux é como procurar por comandos e sua sintaxe. Então, execute man cut . Isso nos dá a "man page", um pequeno manual de como invocar o comando. cut recebe entrada em seu stdin (conforme alimentado pelo pipe de cat em seu comando geral). Considera sua entrada como colunas separadas por caracteres, algum número por registro, em que um registro é uma linha. Ele "corta" certas colunas de cada linha e coloca essas colunas (que são apenas strings) em seu stdout, que são alimentadas em sort em seu exemplo.

Comandos estilo Unix frequentemente (mas nem sempre) usam caracteres '-' ou '-' para marcar partes especiais da linha de comando. '-d' significa usar o próximo caractere como o delimitador de coluna, que é um ':', dois pontos. O '-f' significa cortar a coluna 9 das linhas de entrada e imprimir a string na stdout.

A frase de redirecionamento de saída 2>&1 tem o shell que configura o pipeline inteiro enviando mensagens de erro, convencionalmente impressas no descritor de arquivo 2, para o mesmo local que o descritor de arquivo 1 (também conhecido como stdout), o canal para sort .

No geral, o pipeline faz um tipo comum de coisa: contar o número de strings exclusivas em um arquivo. cat /etc/passwd coloca o conteúdo do arquivo "/ etc / passwd", o bem conhecido arquivo Unix / Linux / * BSD que define as características de um ID de usuário, em seu stdout.

O cut reduz a coluna 9, que no meu sistema não existe. Vamos supor que seja a forma numérica de "ID do usuário". As representações de string do ID do usuário (ou qualquer outro) entram em sort , que não possui opções. sort neste caso reordena suas linhas de entrada em ordem lexical, mas isso realmente não importa, porque estamos atrás de dupes ou IDs de usuário únicos.

sort envia sua saída para uniq . uniq sem nenhum sinalizador apenas observa cada linha que aparece no stdin. Se essa linha é lexicalmente igual à linha anterior, ela não faz nada, caso contrário, imprime a linha. Como a entrada é lexicamente classificada, isso significa que uniq imprime apenas linhas exclusivas. Quaisquer duplicados não são impressos.

wc recebe a entrada de uniq . Com o sinalizador "-l", wc imprime apenas a contagem de linhas que recebe. Então: o número de valores exclusivos do ID do usuário (ou o que quer que esteja na coluna 9 do / etc / passwd).

Com apenas mods menores, você pode fazer com que o pipeline conte IDs de usuário duplicados (ou qualquer outro). O uniq -c não apenas imprime linhas exclusivas, mas também mostra quantos pontos obteve em uma linha. Você poderia canalizar isso em awk '{if ($2 > 1) {print $0}} para obter apenas as linhas com uma contagem maior que 1, as linhas duplicadas. wc -l contaria apenas linhas duplicadas.

    
por 15.10.2013 / 20:32

Tags