<Anterior | Conteúdo | Próxima>
tipo
O tipo programa classifica o conteúdo da entrada padrão, ou um ou mais arquivos especificados na linha de comando, e envia os resultados para a saída padrão. Usando a mesma técnica que usamos com gato, podemos demonstrar o processamento da entrada padrão diretamente do teclado:
[me @ linuxbox ~] $ sort> foo.txt
cba
[me @ linuxbox ~] $ gato foo.txt
abc
[me @ linuxbox ~] $ sort> foo.txt
cba
[me @ linuxbox ~] $ gato foo.txt
abc
Após inserir o comando, digitamos as letras “c”, “b” e “a”, seguidas mais uma vez por Ctrl-d para indicar o fim do arquivo. Em seguida, visualizamos o arquivo resultante e vemos que as linhas agora aparecem em ordem de classificação.
Como tipo pode aceitar vários arquivos na linha de comando como argumentos, é possível fundir vários arquivos em um único todo classificado. Por exemplo, se tivéssemos três arquivos de texto e quiséssemos combiná-los em um único arquivo classificado, poderíamos fazer algo assim:
classificar arquivo1.txt arquivo2.txt arquivo3.txt> final_sorted_list.txt
classificar arquivo1.txt arquivo2.txt arquivo3.txt> final_sorted_list.txt
sort tem várias opções interessantes. Aqui está uma lista parcial:
Tabela 20-1: Opções de classificação comuns
Opção | Opção Longa | Descrição |
-b | --ignore-Lead-blanks | Por padrão, a classificação é realizada em |
toda a linha, começando com o | ||
primeiro personagem na linha. Esse | ||
opção faz com que a classificação ignore | ||
espaços principais em linhas e | ||
calcula a classificação com base no primeiro | ||
caractere não-espaço em branco no | ||
linha. | ||
-f | --ignorar caso | Torna a classificação sem distinção entre maiúsculas e minúsculas. |
-n | --classificação numérica | Executa a classificação com base na avaliação numérica de uma string. Usar esta opção permite que a classificação seja executada em valores numéricos em vez de valores alfabéticos. |
-r | --marcha ré | Classifique na ordem inversa. Os resultados estão em |
descendente em vez de ascendente | ||
ordem. | ||
-k | --key =field1[,field2] | Classifique com base em um campo-chave localizado |
da field1 para field2 em vez de | ||
linha inteira. Veja a discussão abaixo. | ||
-m | --mesclar | Trate cada argumento como o nome |
de um arquivo pré-classificado. Mesclar vários | ||
arquivos em um único resultado classificado | ||
sem realizar nenhum adicional | ||
Ordenação. | ||
-o | --output =lima | Enviar saída classificada para lima em vez |
do que a saída padrão. | ||
-t | --field-separator =carbonizar | Defina o separador de campos |
personagem. Por padrão, os campos são | ||
separados por espaços ou tabulações. |
Embora a maioria das opções acima sejam autoexplicativas, algumas não são. Primeiro, vamos olhar para o -n opção, usada para classificação numérica. Com esta opção, é possível classificar os valores com base em valores numéricos. Podemos demonstrar isso classificando os resultados do du comando para determinar os maiores usuários de espaço em disco. Normalmente, o du comando lista os resultados de um resumo na ordem do nome do caminho:
[me @ linuxbox ~] $ du -s / usr / share / * | cabeça
252 / usr / share / aclocal
96 / usr / share / acpi-support
8 / usr / share / adduser
196 / usr / share / alacarte
344 / usr / share / alsa
8 / usr / share / alsa-base 12488 / usr / share / anthy
8 / usr / share / apmd
21440 / usr / share / app-install
48 / usr / share / application-registry
[me @ linuxbox ~] $ du -s / usr / share / * | cabeça
252 / usr / share / aclocal
96 / usr / share / acpi-support
8 / usr / share / adduser
196 / usr / share / alacarte
344 / usr / share / alsa
8 / usr / share / alsa-base 12488 / usr / share / anthy
8 / usr / share / apmd
21440 / usr / share / app-install
48 / usr / share / application-registry
Neste exemplo, canalizamos os resultados para cabeça para limitar os resultados às primeiras dez linhas. Podemos produzir uma lista classificada numericamente para mostrar os dez maiores consumidores de espaço desta forma:
[me @ linuxbox ~] $ du -s / usr / share / * | sort -nr | cabeça
509940 / usr / share / locale-langpack
242660 / usr / share / doc
197560 / usr / share / fonts
179144 / usr / share / gnome
146764 / usr / share / myspell
144304 / usr / share / gimp
135880 / usr / share / dict
76508 / usr / share / icons
68072 / usr / share / apps
62844 / usr / share / foomatic
[me @ linuxbox ~] $ du -s / usr / share / * | sort -nr | cabeça
509940 / usr / share / locale-langpack
242660 / usr / share / doc
197560 / usr / share / fonts
179144 / usr / share / gnome
146764 / usr / share / myspell
144304 / usr / share / gimp
135880 / usr / share / dict
76508 / usr / share / icons
68072 / usr / share / apps
62844 / usr / share / foomatic
Ao utilizar a blockchain da -nº opções, produzimos uma classificação numérica reversa, com os maiores valores aparecendo primeiro nos resultados. Essa classificação funciona porque os valores numéricos ocorrem no início de cada linha. Mas e se quisermos classificar uma lista com base em algum valor encontrado na linha? Por exemplo, os resultados de um ls -l:
[me @ linuxbox ~] $ ls -l / usr / bin | cabeça
152948 total
-rwxr-xr-x | 1 | raiz | raiz | 34824 | 2016-04-04 | 02:42 | [ |
-rwxr-xr-x | 1 | raiz | raiz | 101556 | 2007-11-27 | 06:08 | a2d |
-rwxr-xr-x | 1 | raiz | raiz | 13036 | 2016-02-27 | 08:22 | conectar |
-rwxr-xr-x | 1 | raiz | raiz | 10552 | 2007-08-15 | 10:34 | acpi |
-rwxr-xr-x | 1 | raiz | raiz | 3800 | 2016-04-14 | 03:51 | acpi_fakekey |
-rwxr-xr-x | 1 | raiz | raiz | 7536 | 2016-04-19 | 00:19 | acpi_listen |
-rwxr-xr-x | 1 | raiz | raiz | 3576 | 2016-04-29 | 07:57 | adicionar parte |
-rwxr-xr-x | 1 | raiz | raiz | 20808 | 2016-01-03 | 18:02 | addr2line |
-rwxr-xr-x | 1 | raiz | raiz | 489704 | 2016-10-09 | 17:02 | adept_batch |
Ignorando, por enquanto, que ls pode classificar seus resultados por tamanho, poderíamos usar tipo para classificar esta lista por tamanho de arquivo, também:
[me @ linuxbox ~] $ ls -l / usr / bin | sort -nr -k 5 | cabeça
-rwxr-xr-x | 1 | raiz | raiz | 8234216 | 2016-04-07 | 17:42 | inkscape |
-rwxr-xr-x | 1 | raiz | raiz | 8222692 | 2016-04-07 | 17:42 | vista de tinta |
-rwxr-xr-x | 1 | raiz | raiz | 3746508 | 2016-03-07 | 23:45 | gimp-2.4 |
-rwxr-xr-x | 1 | raiz | raiz | 3654020 | 2016-08-26 | 16:16 | quanta |
-rwxr-xr-x | 1 | raiz | raiz | 2928760 | 2016-09-10 | 14:31 | gdbtui |
-rwxr-xr-x | 1 | raiz | raiz | 2928756 | 2016-09-10 | 14:31 | gdb |
-rwxr-xr-x | 1 | raiz | raiz | 2602236 | 2016-10-10 | 12:56 | líquido |
-rwxr-xr-x | 1 | raiz | raiz | 2304684 | 2016-10-10 | 12:56 | clienterpc |
-rwxr-xr-x | 1 | raiz | raiz | 2241832 | 2016-04-04 | 05:56 | aptidão |
-rwxr-xr-x | 1 | raiz | raiz | 2202476 | 2016-10-10 | 12:56 | smbcacls |
Muitos usos de tipo envolvem o processamento de dados tabulares, como os resultados do ls comando acima. Se aplicarmos a terminologia de banco de dados à tabela acima, diríamos que cada linha é um registro e que cada registro consiste em vários Campos, como os atributos do arquivo, contagem de links, nome do arquivo, tamanho do arquivo e assim por diante. tipo é capaz de processar campos individuais. Em termos de banco de dados, podemos especificar um ou mais campos-chave para usar como chaves de classificação. No exemplo acima, especificamos o n e r opções para realizar uma classificação numérica reversa e especificar -k 5 para fazer vídeos tipo use o quinto campo como a chave de classificação.
O k opção é muito interessante e tem muitos recursos, mas primeiro precisamos falar sobre como tipo define campos. Vamos considerar um arquivo de texto muito simples que consiste em uma única linha contendo o nome do autor:
William Shotts
William Shotts
Por padrão, o tipo vê esta linha como tendo dois campos. O primeiro campo contém os caracteres:
"William"
e o segundo campo contém os caracteres:
“Shotts”
o que significa que os caracteres de espaço em branco (espaços e tabulações) são usados como delimitadores entre os campos e que os delimitadores são incluídos no campo quando a classificação é executada.
Olhando novamente para uma linha de nosso ls saída, podemos ver que uma linha contém oito campos e que o quinto campo é o tamanho do arquivo:
-rwxr-xr-x 1 raiz raiz 8234216 2016/04/07 17:42 inkscape
-rwxr-xr-x 1 raiz raiz 8234216 2016/04/07 17:42 inkscape
Para nossa próxima série de experimentos, vamos considerar o seguinte arquivo contendo o histórico de três distribuições populares do Linux lançadas de 2006 a 2008. Cada linha no arquivo tem três campos: o nome da distribuição, número da versão e data de lançamento em MM / DD Formato / AAAA:
SUSE | 10.2 | 12/07/2006 |
Fedora | 10 | 11/25/2008 |
SUSE | 11.0 | 06/19/2008 |
Ubuntu | 8.04 | 04/24/2008 |
Fedora | 8 | 11/08/2007 |
SUSE | 10.3 | 10/04/2007 |
Ubuntu | 6.10 | 10/26/2006 |
Fedora | 7 | 05/31/2007 |
Ubuntu | 7.10 | 10/18/2007 |
Ubuntu | 7.04 | 04/19/2007 |
SUSE | 10.1 | 05/11/2006 |
Fedora | 6 | 10/24/2006 |
Fedora | 9 | 05/13/2008 |
Ubuntu | 6.06 | 06/01/2006 |
Ubuntu | 8.10 | 10/30/2008 |
Fedora | 5 | 03/20/2006 |
Usando um editor de texto (talvez vitalidade), inseriremos esses dados e nomearemos o arquivo resultante distros.txt.
A seguir, tentaremos classificar o arquivo e observar os resultados:
[me @ linuxbox | ~] $ | classificar distros.txt |
Fedora 10 | 11/25/2008 | |
Fedora 5 | 03/20/2006 | |
Fedora 6 | 10/24/2006 | |
Fedora 7 | 05/31/2007 | |
Fedora 8 | 11/08/2007 | |
Fedora 9 | 05/13/2008 | |
SUS 10.1 | 05/11/2006 | |
SUS 10.2 | 12/07/2006 | |
SUS 10.3 | 10/04/2007 | |
SUS 11.0 | 06/19/2008 | |
Ubuntu 6.06 | 06/01/2006 | |
Ubuntu 6.10 | 10/26/2006 | |
Ubuntu 7.04 | 04/19/2007 | |
Ubuntu 7.10 | 10/18/2007 | |
Ubuntu 8.04 | 04/24/2008 | |
Ubuntu 8.10 | 10/30/2008 |
Bem, na maior parte funcionou. O problema ocorre na classificação dos números de versão do Fedora. Visto que um “1” vem antes de um “5” no conjunto de caracteres, a versão “10” termina no topo enquanto a versão “9” cai para baixo.
Para corrigir esse problema, teremos que classificar em várias chaves. Queremos realizar uma classificação alfabética no primeiro campo e, em seguida, uma classificação numérica no segundo campo. tipo permite
múltiplas instâncias do -k opção para que várias chaves de classificação possam ser especificadas. Na verdade, uma chave pode incluir uma variedade de campos. Se nenhum intervalo for especificado (como foi o caso com nossos exemplos anteriores), tipo usa uma chave que começa com o campo especificado e se estende até o final da linha. Esta é a sintaxe para nossa classificação de várias chaves:
[me @ linuxbox | ~] $ | sort --key = 1,1 --key = 2n distros.txt |
Fedora 5 | 03/20/2006 | |
Fedora 6 | 10/24/2006 | |
Fedora 7 | 05/31/2007 | |
Fedora 8 | 11/08/2007 | |
Fedora 9 | 05/13/2008 | |
Fedora 10 | 11/25/2008 | |
SUS 10.1 | 05/11/2006 | |
SUS 10.2 | 12/07/2006 | |
SUS 10.3 | 10/04/2007 | |
SUS 11.0 | 06/19/2008 | |
Ubuntu 6.06 | 06/01/2006 | |
Ubuntu 6.10 | 10/26/2006 | |
Ubuntu 7.04 | 04/19/2007 | |
Ubuntu 7.10 | 10/18/2007 | |
Ubuntu 8.04 | 04/24/2008 | |
Ubuntu 8.10 | 10/30/2008 |
Embora tenhamos usado a forma longa da opção para maior clareza, -k 1,1 -k 2n seria exatamente equivalente. Na primeira instância da opção de chave, especificamos um intervalo de campos a serem incluídos na primeira chave. Como queríamos limitar a classificação apenas ao primeiro campo, especificamos 1,1 que significa "começar no campo um e terminar no campo um". Na segunda instância, especificamos 2n, o que significa que o campo 2 é a chave de classificação e que a classificação deve ser numérica. Uma letra de opção pode ser incluída no final de um especificador de chave para indicar o tipo de classificação a ser executada. Essas letras de opção são iguais às opções globais para o tipo programa: b (ignore os espaços em branco), n (classificação numérica), r (classificação reversa) e assim por diante.
O terceiro campo em nossa lista contém uma data em um formato inconveniente para classificação. Em computadores, as datas são geralmente formatadas na ordem AAAA-MM-DD para facilitar a classificação cronológica, mas o nosso está no formato americano de MM / DD / AAAA. Como podemos classificar essa lista em ordem cronológica?
Felizmente, tipo fornece um caminho. A opção principal permite a especificação de compensações dentro dos campos, para que possamos definir as chaves dentro dos campos:
[me @ linuxbox ~] $ classificar -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
Fedora 10 11/25/2008
Ubuntu 8.10 10/30/2008
[me @ linuxbox ~] $ classificar -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
Fedora 10 11/25/2008
Ubuntu 8.10 10/30/2008
SUSE | 11.0 | 06/19/2008 |
Fedora | 9 | 05/13/2008 |
Ubuntu | 8.04 | 04/24/2008 |
Fedora | 8 | 11/08/2007 |
Ubuntu | 7.10 | 10/18/2007 |
SUSE | 10.3 | 10/04/2007 |
Fedora | 7 | 05/31/2007 |
Ubuntu | 7.04 | 04/19/2007 |
SUSE | 10.2 | 12/07/2006 |
Ubuntu | 6.10 | 10/26/2006 |
Fedora | 6 | 10/24/2006 |
Ubuntu | 6.06 | 06/01/2006 |
SUSE | 10.1 | 05/11/2006 |
Fedora | 5 | 03/20/2006 |
Especificando -k 3.7 nós instruímos tipo para usar uma chave de classificação que começa no sétimo caractere dentro do terceiro campo, que corresponde ao início do ano. Da mesma forma, especificamos -k 3.1 e -k 3.4 para isolar as partes do mês e do dia da data. Nós também adicionamos o n e r opções para obter uma classificação numérica reversa. o b opção está incluída para suprimir os espaços iniciais (cujos números variam de linha para linha, afetando assim o resultado da classificação) no campo de data.
Alguns arquivos não usam tabulações e espaços como delimitadores de campo; por exemplo, o / Etc / passwd
arquivo:
[me @ linuxbox ~] $ head / etc / passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
[me @ linuxbox ~] $ head / etc / passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
Os campos neste arquivo são delimitados por dois pontos (:), então como classificaríamos esse arquivo usando um campo-chave? tipo fornece o -t opção para definir o caractere separador de campo. Para classificar o passwd arquivo no sétimo campo (o shell padrão da conta), poderíamos fazer isso:
[me @ linuxbox ~] $ sort -t ':' -k 7 / etc / passwd | cabeça
eu: x: 1001: 1001: Eu ...: / home / me: / bin / bash
[me @ linuxbox ~] $ sort -t ':' -k 7 / etc / passwd | cabeça
eu: x: 1001: 1001: Eu ...: / home / me: / bin / bash
root: x: 0: 0: root: / root: / bin / bash dhcp: x: 101: 102 :: / inexistente: / bin / false
gdm: x: 106: 114: Gnome Display Manager: / var / lib / gdm: / bin / false hplip: x: 104: 7: usuário do sistema HPLIP ,,,: / var / run / hplip: / bin / false klog : x: 103: 104 :: / home / klog: / bin / false messagebus: x: 108: 119 :: / var / run / dbus: / bin / false polkituser: x: 110: 122: PolicyKit ,,,: / var / run / PolicyKit: / bin / false pulso: x: 107: 116: daemon PulseAudio ,,,: / var / run / pulse: / bin / false
root: x: 0: 0: root: / root: / bin / bash dhcp: x: 101: 102 :: / inexistente: / bin / false
gdm: x: 106: 114: Gnome Display Manager: / var / lib / gdm: / bin / false hplip: x: 104: 7: usuário do sistema HPLIP ,,,: / var / run / hplip: / bin / false klog : x: 103: 104 :: / home / klog: / bin / false messagebus: x: 108: 119 :: / var / run / dbus: / bin / false polkituser: x: 110: 122: PolicyKit ,,,: / var / run / PolicyKit: / bin / false pulso: x: 107: 116: daemon PulseAudio ,,,: / var / run / pulse: / bin / false
Ao especificar o caractere de dois pontos como separador de campo, podemos classificar no sétimo campo.