103.2 - Processar fluxo de texto usando filtro
Esse tópico aborda os comandos do shell, o que você deve saber para operar o sistema, conhecendo seus comandos e funcionalidades.
CAT
Exibe o conteúdo dos arquivos na tela.
Opões:
-A Exibe caracteres especiais;
-E Exibe somente caractere de fim de linha ($);
-T Exibe apenas os tabs (^I);
-b Numera as linhas (exceto as linhas em branco);
-n Enumera tudo;
-s Remove linhas em branco que se repetem.
Crie um arquivo contendo o texto abaixo:
--- Conteúdo do arquivo qualquer_nome
aqui tem espaco: espaco
aqui tem um TAB: tabulacao
fim de linha:
Exibindo caracteres especiais:
linux:~/$ cat -A arquivo
aqui tem espaco: espaco$
$
$
aqui tem um TAB:^Itabulacao$
$
$
fim de linha:$
Exibe somente o caractere que mostra fim de linha:
linux:~/$ cat -E arquivo
aqui tem espaco: espaco$
$
$
aqui tem um TAB: tabulacao$
$
$
fim de linha:$
Mostra apenas os tabs:
linux:~/$ cat -T arquivo
aqui tem espaco: espaco
aqui tem um TAB:^Itabulacao
fim de linha:
Enumera as linhas, menos as linhas em branco:
linux:~/$ cat -b arquivo
1 aqui tem espaco: espaco
2 aqui tem um TAB: tabulacao
3 fim de linha:
Enumerar tudo:
linux:~/$ cat -n arquivo
1 aqui tem espaco: espaco
2
3
4 aqui tem um TAB: tabulacao
5
6
7 fim de linha:
Remove linhas em branco repetidas:
linux:~/$ cat -s arquivo
aqui tem espaco: espaco
aqui tem um TAB: tabulacao
fim de linha:
CUT
Usado para cortar bytes, caracteres ou campos de arquivo.
Opções:
-b Seleciona bytes;
-c Seleciona Caracteres;
-d Escolhe um delimitador (default = TAB)
-f Escolhe o campo.
Imprimindo o primeiro campo do passwd:
linux:~/$ cut -d ':' -f1 /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
# Apenas alguns dos nomes que podem/irão aparecer.
Esse comando vai imprimir somente os nomes de usuários contidos no passwd.
O passwd é separado por dois pontos ':', o comando diz para cortar usando como delimitador os dois pontos cut -d ':'
, e para pegar o primeiro campo -f1
.
EXPAND - Desclassificado
Converte TABs em espaços.
Opções:
-i Converte apenas os TABs do início da linha;
-t N Determina quantos espaços um TAB vai virar.
Crie um arquivo contendo a linha abaixo:
aqui tem 4 tabs: .
Mostrando os tabs do arquivo:
linux:~/$ cat -A arquivo
aqui tem 4 tabs:^I^I^I^I.$
Converter tabs em espaços
linux:~/$ expand arquivo
aqui tem 4 tabs: .
# Se você selecionar com o mouse o espaço em branco, verá que não tem mais tab,
# mas sim, vários espaços, para uma melhor verificação, faça isso usando o terminal.
UNEXPAND - Desclassificado
Converte espaços em TABs.
Opções:
-a Converte os espaços no início da linha;
-t N Define a quantidade de espaços (-t 3 = A cada 3 espaços temos 1 tab).
Usando o exemplo acima, copie a saída gerada pelo expand e cole dentro do 'arquivo'.
Convertendo espaços em tabs
linux:~/$ unexpand -t 8 arquivo
# Estamos informando que a cada conjunto de 8 espaços, ele vira um tab.
FMT - Desclassificado
Formata uma saída de texto, usado para arquivos longos, tem um padrão de 75 caracteres por linha.
Opções:
-w N Define o número de caracteres por linha;
-s Quebra linhas grandes sem preencher;
-u Um espaço entre palavras e dois espaços entre sentenças.
Exemplo:
linux:~/$ fmt -w 50 arquivo_long
# Formatando as linhas com 50 caracteres apenas.
HEAD
Exibe o começo de arquivos, por padrão as 10 primeiras linhas de um arquivo.
Opções:
-c N Exibe por bytes (Caracteres);
-n N Escolhe a quantidade de linhas.
Exemplo:
linux:~/$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# Exibindo as cinco primeiras linhas do passwd.
linux:~/$ head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# É possível omitir o '-n' passando direto o menos mais o número.
HEXDUMP - NÃO CAI NA LPIC-1
Exibe o conteúdo de arquivos binários.
Opções:
-c Exibe em hexadecimal com uma coluna ASCII.
Primeiro, digite which sed
para sabermos onde se encontra o binário do sed.
linux:~/$ which sed
/bin/sed
Exibindo o conteúdo do arquivo SED:
linux:~/$ hexdump /bin/sed | head
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0002 003e 0001 0000 2760 0040 0000 0000
0000020 0040 0000 0000 0000 17d0 0001 0000 0000
0000030 0000 0000 0040 0038 0009 0040 001c 001b
0000040 0006 0000 0005 0000 0040 0000 0000 0000
0000050 0040 0040 0000 0000 0040 0040 0000 0000
0000060 01f8 0000 0000 0000 01f8 0000 0000 0000
0000070 0008 0000 0000 0000 0003 0000 0004 0000
0000080 0238 0000 0000 0000 0238 0040 0000 0000
0000090 0238 0040 0000 0000 001c 0000 0000 0000
# Usei o 'head' para exibir apenas as dez primeiras linhas por ser muito grande.
JOIN - Desclassificado
Faz a junção de dois arquivos por meio de um campo em comum.
Opções:
-1 campo -2 campo Seleciona colunas em comum dos dois arquivos;
-j N Coluna em comum;
-o '1.x 2.y' Exibe a coluna X do 1° arquivo e a coluna Y do 2° arquivo.
Crie os arquivos abaixo:
--- Conteúdo do arquivo arq1
1 USER
2 rodrigo
3 gustavo
--- Conteúdo do arquivo arq2
1 age
2 25 anos
3 43 anos
Selecionando coluna em comum:
linux:~/$ join -j 1 arq1 arq2
1 USER age
2 rodrigo 25 anos
3 gustavo 43 anos
# Seleciona a primeira coluna em comum em ambos os arquivos.
Crie os arquivos abaixo:
--- Conteúdo do arquivo arq1
1 a
2 b
3 c
--- Conteúdo do arquivo arq2
1 a
2 b
3 c
Entrlaçando colunas:
linux:~/$ join -1 2 -2 2 arq1 arq2
a 1 1
b 2 2
c 3 3
# Junta a 2° coluna do 1° arquivo com a 2° coluna do 2° arquivo.
Crie os arquivos abaixo:
--- Conteúdo do arquivo arq1
1 a
2 b
3 c
--- Conteúdo do arquivo arq2
1 d
2 e
3 f
Entrlaçando colunas:
linux:~/$ join -o '1.1 1.2 2.2' arq1 arq2
1 a d
2 b e
3 c f
# Ele pega a 1° coluna do 1°arquivo, depois pega a 2° coluna do primeiro
# arquivo e coloca a 2° coluna do 2° arquivo.
LESS
Faz paginação de texto, usado quando apenas se quer ler o texto, e apenas isso.
Geralmente recebe a saída de um comando, mas pode ser usado diretamente. O less é bem completo por fazer buscas no texto, poder voltar a medida que avança (o paginador more não volta) O less tem modo navegação
.
Funcionamento:
Dentro do texto, aperte barra '/', depois digite o que se quer procurar e de enter.
linux:~/$ less arquivo_de_texto
NL
Exibe o conteúdo de arquivos (igual o cat) mas com uma diferença, ele enumera as linhas.
Opções:
-ba Enumera todas as linhas;
-bt Enumera as linhas (exceto as em branco).
Exemplo:
linux:~/$ nl arquivo.txt
OD
O comando octal dump (od
) é freqüentemente usado para depurar aplicativos e diversos tipos de arquivos. Por si só, o comando od
somente lista o conteúdo de um arquivo em formato octal.
Opções:
-t tipo Escolhe o formato para converter;
-a Caracteres nomeados. Idem `-t a`;
-o Formato Octal, opção default;
-c Formato ASCII, idem `-t c`;
-x Formato hexadecimal, idem `-t x2`.
Exemplos:
# Formato OCTAL.
linux:~/$ od arq1
0000000 020061 005141 020062 005142 020063 005143
0000014
# Formato ASCII.
linux:~/$ od -c arq1
0000000 1 a \n 2 b \n 3 c \n
0000014
# Formato Hexadecimal.
linux:~/$ od -x arq1
0000000 2031 0a61 2032 0a62 2033 0a63
0000014
A primeira coluna é o deslocamento de bytes para cada linha da saída. Como por padrão od
imprime informações no formato octal, cada linha começa com um deslocamento de bytes de oito bits, seguido por oito colunas, cada uma contendo o valor octal dos dados dentro dessa coluna.
PASTE
Exibe o conteúdo dos arquivos em colunas verticais delimitadas por TAB.
Opções:
-d Define um delimitador;
-s Exibe em linhas, ao invés de colunas.
Crie os arquivos abaixo:
--- Conteúdo do arquivo arq1
1
2
3
--- Conteúdo do arquivo arq2
4
5
6
Exemplos:
# Funcionamento normal
linux:~/$ paste arq1 arq2
1 4
2 5
3 6
# Exibe em linhas
linux:~/$ paste -s arq1 arq2
1 2 3
4 5 6
PR - Desclassificado
Converte os arquivos para impressão, separando por páginas com data e número de páginas. Por padrão é usado 66 linhas com 72 caracteres cada.
Opções:
-num Divide por N colunas;
-d Espaço duplo entre linhas;
-h nome Escolhe um novo nome;
-l N Seleciona número de linhas por página;
-o N Margem a esquerda com N espaços em branco;
-w CA Seleciona a quantidade de caracteres por linha, default 72.
SORT
Ordena alfabeticamente.
Opções:
-t Escolhe um delimitador;
-n Ordena numericamente;
-k Coluna Realiza a ordenação por meio da coluna selecionada;
-f Ignora case sensitive;
-b Ignora linhas em branco;
Ordenando TTY's:
linux:~/$ ls /dev/ttyS* | sort -n -t 'S' -k 2
/dev/ttyS0
/dev/ttyS1
/dev/ttyS2
/dev/ttyS3
/dev/ttyS4
/dev/ttyS5
/dev/ttyS6
/dev/ttyS7
/dev/ttyS8
/dev/ttyS9
# Como possuí muitas linhas, suprimi para até 10 linhas.
Entendendo o motivo de ser campo 2
# Vou exemplificar de uma forma bem simples,
# o comando abaixo vai cortar, para isso ele vai usar a
# letra S como delimitador e vai pegar o 1° campo:
linux:~/$ ls /dev/ttyS* | sort -n -t 'S' -k 2 | cut -d S -f 1
/dev/tty
/dev/tty
/dev/tty
/dev/tty
/dev/tty
/dev/tty
/dev/tty
/dev/tty
/dev/tty
# Antes do delimitador conta como campo 1.
# Mas depois já soma +1 no campo:
linux:~/$ ls /dev/ttyS* | sort -n -t 'S' -k 2 | cut -d S -f 2
0
1
2
3
4
5
6
7
8
9
10
11
12
SPLIT
Divide um arquivo em partes (default dividir a cada mil linhas). Mas pode ser usado para dividir arquivos que não sejam arquivos de texto.
Opções:
-b T Divide por tamanho;
-c N Separa cada linha por uma quantidade de Bytes;
-d Arquivos divididos serão nomeados com sufixo numérico;
-l L Divide por número de linhas;
-n Q Divide por quantidade.
TAC
Semelhante ao CAT, mas exibe o conteúdo de trás para frente (inverso).
TAIL
Mostra o final dos arquivos, por padrão exibe as dez últimas linhas de um arquivo.
Opções:
-c N Exibe N bytes;
-f Exibe em tempo real;
-n N Escolhe a quantidade de linhas que serão exibidas no final.
Antes de inciarmos os exemplos:
# Primeiro, vamos ver quantas linhas o arquivo passwd possui:
linux:~/$ wc -l /etc/passwd
46 /etc/passwd
# Vou usar o comando 'cat' com a opção '-n' para enumerar as linhas,
# assim posso mostrar o funcionamento do comando tail, já sabemos que o arquivo
# /etc/passwd possui 46 linhas.
Exemplos de utilização do TAIL:
# Uso do comando tail sem opções:
linux:~/$ cat -n /etc/passwd | tail
37 uuidd:x:110:118::/run/uuidd:/usr/sbin/nologin
38 avahi:x:118:126:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
39 saned:x:119:127::/var/lib/saned:/usr/sbin/nologin
40 lightdm:x:120:128:Light Display Manager:/var/lib/lightdm:/bin/false
41 colord:x:121:130:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
42 pulse:x:122:131:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
43 speech-dispatcher:x:123:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
44 hplip:x:125:7:HPLIP system user,,,:/run/hplip:/bin/false
45 user:x:1000:1000:user,,,:/home/user:/bin/bash
46 sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
# Escolhendo a quantidade de linhas
linux:~/$ cat -n /etc/passwd | tail -15
32 geoclue:x:113:122::/var/lib/geoclue:/usr/sbin/nologin
33 proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
34 usbmux:x:115:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
35 dnsmasq:x:116:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
36 sync:x:4:65534:sync:/bin:/bin/sync
37 avahi:x:118:126:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
38 saned:x:119:127::/var/lib/saned:/usr/sbin/nologin
39 lightdm:x:120:128:Light Display Manager:/var/lib/lightdm:/bin/false
40 colord:x:121:130:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
41 pulse:x:122:131:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
42 speech-dispatcher:x:123:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
43 root:x:0:0:root:/root:/bin/bash
44 hplip:x:125:7:HPLIP system user,,,:/run/hplip:/bin/false
45 user:x:1000:1000:user,,,:/home/user:/bin/bash
46 sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
# O comando 'tail -n -15' e 'tail -15' exibem o mesmo resultado.
# A opção '-N' pode ser omitida.
Diferença entre número negativo -9
e positivo +9
, ao colocar o número negativo, o comando tail
vai funcionar como deve (começar exibindo do final do arquivo).
O número positivo faz com que o comando tail
comece a exibir a partir da linha escolhida (mostrando também a linha escolhida).
Exemplos:
# Começando a exibir da linha 40
linux:~/$ cat -n /etc/passwd | tail +40
40 colord:x:121:130:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
41 pulse:x:122:131:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
42 speech-dispatcher:x:123:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
43 root:x:0:0:root:/root:/bin/bash
44 hplip:x:125:7:HPLIP system user,,,:/run/hplip:/bin/false
45 user:x:1000:1000:user,,,:/home/user:/bin/bash
46 sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
# Começando a exibir da linha 43
linux:~/$ cat -n /etc/passwd | tail +43
43 root:x:0:0:root:/root:/bin/bash
44 hplip:x:125:7:HPLIP system user,,,:/run/hplip:/bin/false
45 user:x:1000:1000:user,,,:/home/user:/bin/bash
46 sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
TR
Substitui, deleta ou agrupa caracteres originados da entrada padrão (stdin).
Opções:
-c C1 C2 Manter caractere 1 e troca tudo por caractere 2;
-d C1 Deleta caractere 1;
-s C1 Não exibe ocorrências repetitivas de um caractere.
Exemplos de utilização do TR:
# Convertendo caracteres para minúsculo
linux:~/$ echo "OLA" | tr 'A-Z' 'a-z'
ola
# Deletando a letra 'A'
linux:~/$ echo "OLA" | tr -d A
OL
# Não exibe ocorrências repetitivas de A até Z
linux:~/$ echo "OLAAAAAA" | tr -s 'A-Z'
OLA
# Mantém o primeiro caractere 'e' e substitui todo o
# resto pelo segundo caractere 'a'
linux:~/$ echo "Teste de substituicao" | tr -c e a
aeaaeaaeaaaaaaaaaaaaaa
UNIQ
Remove linhas duplicadas de um arquivo (Somente se estiver ordenado)
Opções:
-c Exibe as linhas com a quantidade de vezes que ela foi duplicada;
-d Exibe as linhas duplicadas (uma linha por grupo);
-D Exibe todas as linhas duplicadas;
-i Ignora case sensitive;
-u Exibe apenas as linhas únicas.
Crie o arquivo abaixo:
--- Conteúdo do arquivo nomes
USER
USER
rodrigo
janeir
janeir
joao
joao
marcia
Exemplos de uso do comando UNIQ
# Exibindo o resultado sem argumentos, ele apenas elimina as linhas
# repetidas, mas mantém 1 linha, das linhas repetidas:
linux:~/$ uniq arquivo
USER
rodrigo
janeir
joao
marcia
# Exibe apenas as duplicatas das linhas:
linux:~/$ uniq -D nomes
USER
USER
janeir
janeir
joao
joao
# Exibe duplicatas das linhas, uma por grupo (só as
# que se repetem)
linux:~/$ uniq -d nomes
USER
janeir
joao
# Exibe apenas as linhas que aparecem uma única vez
linux:~/$ uniq -u nomes
rodrigo
marcia
# Exibe a quantidade de vezes que a linha foi duplicada
linux:~/$ uniq -c nomes
2 USER
1 rodrigo
2 janeir
2 joao
1 marcia
WC
Exibe o número de linhas, palavras, caracteres e bytes.
Opções:
-c Número de bytes;
-l Número de linhas;
-L Número de caracteres da maior linha;
-m Número de caracteres;
-w Número de palavras.
A execução do wc sem argumento retorna:
Número de linhas;
Número de palavras;
Número/Tamanho de bytes.
Exemplo de uma saída do wc:
linux:~/$ wc nomes
8 8 49 nomes
CHECKSUMS
É uma técnica usada para verificação da integridade de dados transmitidos através de um canal não confiável e com ruídos, onde, esses dados podem sofrer com algum tipo de degradação, seja no momento da transferência, seja por problemas no Hardware que armazene esses dados, entre outros tipos de problemas.
Segue os algoritmos usados atualmente, lembrando que não será explicado como funciona o algoritmo, mas será apresentado como usá-lo.
MD5SUM
Função criada por Ron Rivest foi amplamente utilizada. Gera um hash de 16 bytes. Foi totalmente quebrada em 2005 (colisões foram encontradas). Portanto, não deve ser usada.
SHA1SUM
A função SHA-1 é atualmente a mais utilizada. Gera um hash de 20 bytes (mais forte que o MD5). Foi encontrada uma colisão em fevereiro de 2017, por esse motivo, deve ser substituída pela sha256 ou sha3.
SHA256SUM e SHA512SUM
Da mesma família que SHA-1, ainda não foram encontradas falhas nesses dois algoritmos.
SHA3SUM
Substitui o algoritmo SHA-1, é o mais recente e atual, deve ser usado.
Como Funciona:
Na prática, é gerado um hash do dado e após a transferência dele, por um canal com ruídos, e gerado novamente um hash. Se o hash novo for igual ao antigo, então não houve degradação do dado durante a transferência, mas se o hash novo for diferente do antigo, isso significa que houve degradação e o dado transferido não é mais o mesmo que foi enviado.
Pode ser gerado um hash de palavras ou arquivos, para exemplificar o que foi dito, crie um arquivo de texto chamado 'arquivo' escrito 'banana'.
linux:~/$ sha256sum arquivo
5a81483d96b0bc15ad19af7f5a662e14b275729fbc05579b18513e7f550016b1
# Gerando um hash de 256 bytes a partir de um arquivo.
Agora apague o último 'a' do banana e gere um novo hash, você verá que o código é totalmente diferente.
O seu resultado deve ser igual ao meu, qualquer bit de diferença no arquivo irá gerar um hash diferente, portanto, se o valor for diferente não se espante, muitas coisas podem fazer com que isso aconteça, por exemplo, o modo de criação de um arquivo de texto no Windows é diferente do Linux, se tiver um espaço a mais, um enter a mais, tudo isso fará com que o hash seja diferente.
Para usar outros algoritmos, basta trocar o nomes, pelos nomes informados acima.
Outra forma de usar é usando o comando echo
:
linux:~/$ echo "teste" | sha256sum
06394af259db19355ccf0b668c77ec0fdd9b8d5aa388d848e1bb5959e80e2a24 -
# Gerando um hash de 256 bytes a partir de uma palavra.
E como saber se os códigos são iguais?
Pode ser feita a verificação a olho, o que é muito sujeito a erro e muito cansativo, podemos usar um if
no Shell para comparar os valores ou podemos usar uma opção -c
que tem em todos os algoritmos informados, ele pega o Hash de um arquivo e verifica se está correto.
Pegue 'arquivo' e escreva 'banana' de novo.
Gere uma hash e salve num arquivo, exemplo abaixo:
linux:~/$ sha256sum arquivo > checksumarquivo
# Gerando um hash a partir de um arquivo e
# enviando o resultado para um outro arquivo.
Rode o comando de verificação (exemplo abaixo). O arquivo contendo o hash deve estar no mesmo diretório que o arquivo.
linux:~/$ sha256sum -c checksumarquivo
arquivo: SUCESSO
# Verificando hash's de um arquivo.
Dessa forma é possível testar vários hashs de uma única vez. Se algo der errado, ele irá informar o erro e o arquivo que deu erro.
XZCAT, BZCAT e ZCAT
O comando cat
server para exibir o conteúdo de um arquivo, mas não é possível exibir o conteudo de um arquivo de texto compactado, por isso, foi criado esses três comandos.
# XZCAT
Exibe o conteúdo de arquivos compactados com o XZ;
# BZCAT
Exibe o conteúdo de arquivos compactados com o BZ ou BZ2 (Ambos são bzip2);
# ZCAT
Exibe o conteúdo de arquivos compactados com o GZ (gzip);
Criei 3 arquivos, cada um compactado com um algoritmo mostrado acima
Exemplos:
# Mostrando o conteúdo do arquivo compactado com xz
linux:~/$ xzcat arquivo_xz.xz
Arquivo compactado com xz.
# Mostrando o conteúdo do arquivo compactado com bzip2
linux:~/$ bzcat arquivo_bz.bz2
Arquivo compactado com bzip2.
# Mostrando o conteúdo do arquivo compactado com gzip
linux:~/$ zcat arquivo_gz.gz
Arquivo compactado com gzip.