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
- Arquivos a serem utilizados nas seções abaixo
- Exibindo textos completos com cat
- Exibindo texto completo invertido com tac
- Exibindo texto completo e linhas numeradas com nl
- Exibindo o início do texto com head e o fim com tail
- Visualizando textos com less
- Ordenando linhas com sort
- Aleatorizando linhas com shuf
- 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