Exibindo textos no Bash

Curso de Bash

Seção do curso de Bash sobre processamento de textos com cat, tac, nl, head, tail, less, sort e shuf.

Linux conta com vários comandos para processsamento de texto. Neste capítulo abordaremos como exibir textos integral e parcialmente e também como reorganizá-los.

Conteúdo

  1. Arquivos a serem utilizados nas seções abaixo
  2. Exibindo textos completos com cat
  3. Exibindo texto completo invertido com tac
  4. Exibindo texto completo e linhas numeradas com nl
  5. Exibindo o início do texto com head e o fim com tail
  6. Visualizando textos com less
  7. Ordenando linhas com sort
  8. Aleatorizando linhas com shuf
  9. Exercícios

Arquivos a serem utilizados nas seções abaixo

Criaremos alguns arquivos abaixo utilizando o comando printf e o operador de redirecionamento >. Ambos serão abordados em capítulos posteriores.

printf exibe na saída palavras formatadas de acordo com alguns símbolos próprios do comando.

> redireciona o texto, que seria exibido na saída do terminal, para um arquivo. Caso não exista, o arquivo à direita de > é criado já com o conteúdo redirecionado.

printf "\nA\nD\nC\nB\n" > letras
printf "1\n0\n4\n1\n0\n" > numeros
printf "%s\n" {A..Z} > alfabeto
printf "C\n23\nc\n2\nb\n03\nBA\n\`\n2\n" > desordem

Exibindo textos completos com cat

cat é a forma mais comum de exibir textos em Bash. O comando exibe na saída o texto integral dos arquivos informados como argumentos.

cat letras

A
D
C
B

Com dois ou mais argumentos, cat exibe o conteúdo dos arquivos na sequência especificada.

cat numeros letras
1
0
4
1
0

A
D
C
B

⚠️ cat não é viável quando o arquivo a ser exibido contém milhares de linhas. Os comandos head, tail e less são alternativas mais interessantes.

Exibindo texto completo invertido com tac

tac exibe da última a primeira linha dos arquivos informados como argumentos.

tac letras
B
C
D
A

Com mais de um argumento, tac concatena os arquivos.

tac numeros letras
0
1
4
0
1
B
C
D
A

Exibindo texto completo e linhas numeradas com nl

nl como cat exibe o conteúdo integral dos arquivos informados no argumento, na sequência em que eles aparecem.

Adicionalmente à cat, nl exibe números à frente de cada uma das linhas não-vazias.

nl numeros letras
     1  1
     2  0
     3  4
     4  1
     5  0

     6  A
     7  D
     8  C
     9  B

A opção -s permite especificar um separador que sucede o número. O separador é envolvido entre ' ' para evitar que . seja intepretado como diretório atual e espaço como separador de palavras.

nl -s '. ' letras

     1. A
     2. D
     3. C
     4. B

-w muda a quantidade padrão (6) de colunas para os números.

nl -w 1 -s '. ' letras

1. A
2. D
3. C
4. B

-b a inclui linhas vazias na numeração.

nl -b a  -w 1 -s '. ' letras
1.
2. A
3. D
4. C
5. B

Exibindo o início do texto com head e o fim com tail

head exibe as 10 primeiras linhas do arquivo de texto...

head alfabeto
A
B
C
D
E
F
G
H
I
J

... e tail as 10 últimas.

tail alfabeto
Q
R
S
T
U
V
W
X
Y
Z

As opções -n ou -5 (Onde 5 pode ser substituído por qualquer número) de head e tail alteram a quantidade de linhas a serem exibidas.

A seguir, head exibe a primeira linha do arquivo alfabeto.

head -1 alfabeto
A

Aqui tail exibe as 3 últimas linhas.

tail -n 3 alfabeto
X
Y
Z

Ambos os comandos suportam dois ou mais argumentos. Um cabeçalho é exibido antes de cada arquivo se a opção -q não for informada.

tail -n 2 alfabeto numeros
==> alfabeto <==
Y
Z

==> numeros <==
1
0

A opção -f de tail permite exibir o conteúdo de um arquivo de texto sendo continuamente atualizado. Opção especialmente útil para monitorar logs.

tail -f /var/log/syslog
Nov 16 22:27:48 FX505DV NetworkManager[794]: <info>  [1605576468.3928] manager: rfkill: Wi-Fi now disabled by radio killswitch
Nov 16 22:27:53 FX505DV systemd[1]: systemd-rfkill.service: Succeeded.
Nov 16 22:27:58 FX505DV systemd[1]: NetworkManager-dispatcher.service: Succeeded.
Nov 16 22:27:58 FX505DV systemd-resolved[705]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.

Pressione Ctrl + C para terminar.

Visualizando textos com less

less é um paginador e visualizador de arquivos. Útil para exibir arquivos de texto grandes, especialmente para pesquisa de palavras nesses textos.

Ao executar less, o paginador toma conta do terminal de forma que o prompt fica indisponível. O nome do arquivo aparece na última linha.

less alfabeto
A
B
C
D
alfabeto

Ao pressionarmos qualquer tecla : aparece na última linha. Qualquer comando de less que digitarmos ou qualquer status será exibido nessa última linha.

As teclas e rolam uma linha acima ou abaixo. PgUp e PgDn/espaço uma página acima ou abaixo. Home e End para o ínicio ou fim do arquivo.

Abaixo, espaço foi pressionado uma vez.

E
F
G
H
:

Ao atingir o final do arquivo, less exibe (END) ao invés dos :.

W
X
Y
Z
(END)

Para buscar um termo, digite / mais a palavra a ser buscada e pressione Enter. O termo digitado aparecerá na última linha. A busca é case sensitive (sensível à capitalização).

W
X
Y
Z
/W

less então procura a palavra do ponto atual em diante. Ao encontrar a palavra less destaca a palavra. Caso não encontrada, less exibe na última linha Pattern not found (press RETURN).

W
X
Y
Z
(END)

Para buscar por outra correspondência da palavra pesquisada abaixo do ponto atual pressione a tecla n e Shift + n para pesquisar acima.

? pode substituir / caso queira pesquisar do ponto atual para cima. Ao contrário do comportamento com \, n busca a próxima ocorrência acima do ponto atual e Shift + n abaixo.

W
X
Y
Z
?B
B
C
D
E
:

Para sair de less digite q.

less permite que mais de um arquivo seja informado como argumento. A última linha de less então exibe o nome do arquivo atual seguido da quantidade de arquivos.

less alfabeto numeros

Para abrir o próximo arquivo digite :n e para o arquivo anterior :p.

A
B
C
D
alfabeto (file 1 of 2)

A opção -N exibe número de linha antes de cada uma das linhas e insere uma tabulação antes do número.

less -N alfabeto
      1 A
      2 B
      3 C
      4 D
alfabeto

Similarmente à tail -f, less provê a opção +F com a mesma função de exibir continuamente as inserções sendo feitas em um arquivo.

less +F -N /var/log/syslog
  16221 Nov 16 22:33:19 FX505DV systemd[1]: Started Run anacron jobs.
  16222 Nov 16 22:33:19 FX505DV anacron[50243]: Anacron 2.3 started on 2020-11-16
  16223 Nov 16 22:33:19 FX505DV anacron[50243]: Normal exit (0 jobs run)
  16224 Nov 16 22:33:19 FX505DV systemd[1]: anacron.service: Succeeded.
Waiting for data... (interrupt to abort)

Pressione Ctrl + C para interromper a leitura do arquivo e q para sair de less.

Ordenando linhas com sort

sort exibe na saída linhas de texto ordenadas.

Utilizaremos o seguinte arquivo desordenado nos próximos exemplos.

cat desordem
C
23
c
2
b
03
BA
`
2

A ordem padrão de sort é similar à do dicionário:

  • caracteres especiais (como acentos) aparecem antes dos números;
  • números aparecem antes de letras;
  • letras minúsculas aparecem antes das maiúsculas;
  • palavras que iniciam com o mesmo caractere terão o segundo caractere comparado, caso uma dessas palavras não contenha segundo caractere então ela aparecerá primeiro;
  • a ordem final variará de acordo com a linguagem definida no SO.

Note que 03 aparece antes de 2 já que 0 antecede 2. E 2 antecede 23 dado o 3 "a mais" de 23.

sort desordem
`
03
2
2
23
b
BA
c
C

A opção -n orderna os números por último levando em conta seu valor total e não os caracteres que os compõem. Abaixo é possível observar 03 antes de 23.

sort -n desordem
`
b
BA
c
C
2
2
03
23

A ordem reversa pode ser definida com a opção -r.

sort -r alfanumerico
C
c
BA
b
23
2
2
03
`

Utilize a opção -c para verificar se o arquivo está ordenado sem exibir seu conteúdo. Se o arquivo estiver ordenado não haverá saída, como abaixo.

sort -c alfabeto

Caso desordenado, sort exibe o nome do arquivo + : + o número da linha em que a primeira palavra fora de ordem aparece. Depois especifica essa palavra após disorder: .

sort -c letras

No caso abaixo C na linha 4 do arquivo letras é a primeira linha fora de ordem.

sort: letras:4: disorder: C

A opção -u exibe apenas as linhas únicas.

sort -u numeros
0
1
4

Com dois ou mais argumentos, sort concatena os arquivos e então ordena todas as linhas combinadas.

sort numeros letras

0
0
1
1
4
A
B
C
D

Sem argumentos ou com - como argumento, sort lê a entrada padrão. Para terminar a entrada de dados pressione Ctrl + D. Os caracteres então serão ordenados e exibidos na saída.

sort -

⚠️ O símbolo > foi adicionado para indicar que os números foram digitados. Não digite o símbolo.

> 9
> 7
> 6
> 8
6
7
8
9

Aleatorizando linhas com shuf

shuf troca a ordem das linhas de textos aleatoriamente. Dá suporte à apenas um arquivo como argumento.

shuf alfabeto
W
D
M
O
S
P
L
R
[...restante da saída omitido]

A opçao -n limita a quantidade de linhas na saída.

shuf -n 2 alfabeto
C
Q

A opção -e permite que cada argumento seja tratado como uma linha ao invés de ler um arquivo.

shuf -e 0 1 2 3 4
1
3
2
4
0

A opção -i gera uma sequência aleatória ao invés de ler um arquivo. A sequência é especificada no argumento com o formato <núm_mínimo>-<núm_máximo>.

shuf -i 7-13
12
8
7
9
11
13
10

Com - como argumento ou sem argumentos shuf lê a entrada padrão. Ctrl + D termina a entrada de dados.

shuf -

⚠️ O símbolo > foi adicionado para indicar que os números foram digitados. Não digite o símbolo.

> 0
> 1
> 2
> 3
3
2
0
1

Exercícios

Selecione as afirmações verdadeiras

Arquivo a.

A
B
D

Arquivo b.

G
C
F
Considere cada ponto e vírgula na saída nas respostas abaixo separando linhas
Considere cada ponto e vírgula na saída nas respostas abaixo separando linhas
Escrito por Caio Santesso.

Comentários

  • Conteúdo dos posts, exceto onde indicado contrário, licenciado sob a licença CC BY-SA 4.0 .