Leitura e Manipulação

Copiando Arquivos

Ao copiar arquivos, podemos utilizar a flag -a para manter todos os dados originais do arquivo.

cp -a <original_file> <new_file>

Salvando Saída de um Comando em Diversos Arquivos

Todos os arquivos terão a mesma saída.

<command> | tee <file1> <file2> ... <file10>

printf

Escrevendo no terminal cmo quebras de linha. Útil para colocar trechos de código em arquivos bash script.

printf 'Mensagem de teste

Conteúdo qualquer

Att,
'

Cat

Esse é sem dúvidas um dos comandos mais utilizados (se não o mais) para ler arquivos.

Caso a saída do comando cat não tenha cores, pode utilizar os comandos abaixo para adicionar e depois utilize o comando ccat no lugar cat.

sudo apt install python-pygment
echo "alias ccat='pygmentize -g'" >> ~/.bashrc
source ~/.bashrc

Lê o arquivo e corta em pedaços onde tenha : (dois pontos) e pega a segunda (-f2) ocorrência

cat <arquivo.txt> | cut -d":" -f2

Mostra somente da linha 1 a 10

cat <file.txt> | cut -b 1-10

Exibe a primeira e a terceira ocorrência

cut -d <delimiter> -f1,3 <file>

Remove todas as letras a

cat <arquivo.txt> | tr -d "a"

Remove todas as letras a e s

cat <arquivo.txt> | tr -d "as"

Substitui tudo o que for a por x

cat <arquivo.txt> | tr "a" "x"

Mostra somente as linhas (e o número dessas linhas) que não estão em branco

cat -b <file>

Organiza a saída de um determinado arquivo com colunas utilizando : (dois pontos) como um delimitador

cat /etc/passwd | column -t -s:

Exibe o arquivo em uma linha única

cat <arquivo.txt> | tr -s '\n' ' '

# O mesmo que:
tr -s '\n' ' ' < <arquivo.txt>

Apesar do cat ser uma ferramenta para leitura de arquivos, nós também podemos escrever arquivos.

cat > <file.txt>

Após executar o comando acima, dê um ENTER, escreva o conteúdo que deseja salvar no arquivo, depois dê outro ENTER e então, CTRL + C para salvar.

Tac

Semelhante ao cat, porém este lê o conteúdo de um arquivo começando do final

tac <file>

Grep

Pesquisando strings em arquivos de forma recursiva

grep -irn <search_string>

EXPLICAÇÃO: i = Case Insensitive r = Recursivo n = Número da linha

Procurando por determinada string em um arquivo e mostra 3 linhas antes e 3 linhas depois da ocorrência encontrada

grep -A3 -B3 <find_string> <file>

Quebra um arquivo por espaço e organiza cada palavra em uma linha

grep -o -E '\w+' <file.txt>

Verifica todos os usuários que estão no grupo sudo

grep sudo /etc/group

Buscando todas as linhas que começam com a letra m

grep ^m <file>

Buscando todas as linhas que terminal com a letra s

grep s$ <file>

Lendo arquivo binário como se fosse um arquivo de text

grep -a <string> <file.bin>

Procurando por strings com 32 caracteres que possuem apenas letras e números

grep '[a-z0-9]\{32\}' <file.txt>

Tee

Copiando Arquivos

tee <new_file> < <original_file>

Criando Arquivos com Conteúdo

echo <content> | tee -a <filename>

Sponge

Modifica a saída de um determinado arquivo e salva o resultado nele mesmo. Caso precise, pode utilizar a saída de vários arquivos simultaneamente e enviar para um único arquivo ou até mesmo jogar saída de comandos, semelhante ao uso do >.

grep '<search>' <file> | sponge <file>

Sort

Ordenando em ordem alfabética

sort <arquivo.txt>

Ordenando em ordem alfabética e removendo as linhas duplicadas

sort -u <arquivo.txt>
sort <arquivo.txt> | uniq

Mostra somente as linhas repetidas de um arquivo

sort <arquivo.txt> | uniq -cd

Conta a quantidade de linhas repetidas

# Do menor para o maior
sort <arquivo.txt> | uniq -c | sort -u

# Do maior para o menor
sort <arquivo.txt> | uniq -c | sort -ur

Substring

Pega determinado caractere de uma string ou arquivo (em cada linha)

echo abcdef | cut -c 1   # a
echo abcdef | cut -c 3   # c
echo abcdef | cut -c 1,3 # ac
echo abcdef | cut -c 1-3 # abc
cat <file>  | cut -c 1

Listando Palavras por Quantidade de Caracteres

No exemplo abaixo estamos lendo um arquivo e exibindo somente as palavras que contém 6 caracteres.

grep -o -w '\w\{6,6\}' <file.txt>

Substituição de Caracteres

Substitui tudo o que for "espaço" por "XXX"

sed 's/<find>/<replace>/g' <file> > <output_file>
cat <arquivo.txt> | sed 's/ /XXX/g'

Substitui determinado caracter e já salva no arquivo

sed -i 's/<find>/<replace>/g' <file>

Adiciona um prefixo em todas as linhas e já salva no arquivo

sed -i 's/^/ABCD-/g' <file.txt>

Deixa todo o conteúdo de um arquivo em letras maiúsculas

tr [a-z] [A-Z] < <file.txt>

Substitui quebra de linha por espaço

sed ':a;N;$!ba;s/\n/ /g' file

Range de Linhas

Leitura

sed -n <start_line>,<end_line>p <file>

Exclusão

sed <start_line>,<end_line>d <file>

wc

Exibe a quantidade de linhas que o arquivo possui

wc -l <file>

Exibe a quantidade de caracteres que o arquivo possui. Esse comando conta a quebra de linha como caracter, atente-se a isso

wc -c <file>

AWK

Mostra o conteúdo do arquivo, semelhante ao cat

awk '{print}' <arquivo.txt>

Quebra a linha por : (dois pontos) e retorna a segunda ocorrência. Por padrão (caso não passe o parâmetro -F, por default será um "espaço")

awk -F ':' '{print $2}' <arquivo.txt>

Retornando a primeira e a terceira ocorrência

awk -F':' '{print "O primeiro parâmetro é \"" $1 "\" e o terceiro parâmetro é \"" $3 "\""}' <file>

Quebra linha por : (dois pontos) , mas ao invés de mostrar os resultados linha a linha, este separa os resultados por vírgula

awk -F: '{print $1}' ORS=, </path/to/file>

Exibe qualquer linha que contenha a letra f (maiúscula ou minúscula) seguido da letra e (minúscula)

awk '/[f-F]e/' <arquivo.txt>

Quebra a linha por tudo que contenha li e pega a primeira e a segunda ocorrência. Remova /li/ para que o awk pesquise automaticamente por espaços

awk '/li/ {print $1,$2;}' <arquivo.txt>

Pegando a última parte do print do awk

awk '{print $NF}'

Exibe somente palavras com mais de uma determinada quantidade de caracteres

awk 'length($0) > <qtde_caracteres>' <file.txt>

Quantidade de Caracteres por Linha

awk 'length($0) >= <qtdade>' <file.txt>

Removendo Linhas

Remove todas as linhas que tem determinada string

vi <file>
(esc) :g/<string>/d

Recuperando as primeiras linhas do arquivo (por padrão são 10)

head -n <qtde_de_linhas> <file>
head -<qtde_de_linhas> <file>

Tail

Vendo modificações que estão sendo feitas em um arquivo em tempo real

tail -f <file>

Recuperando as últimas linhas do arquivo (por padrão são 10)

tail -n <qtde_de_linhas> <file>
tail -<qtde_de_linhas> <file>

Watch

Semelhante ao tail com a opção -f.

watch -n 1 cat <file>

Executando um Comando em Cada Linha do Arquivo

No exemplo abaixo, iremos ler um determinado arquivo e cada linha do arquivo será encodado em base64, que será salvo em um arquivo de saída

for i in $(cat <file.txt>); do echo $i | base64 ; done > <output.txt>
while IFS= read -r line; do echo -n "$line" | base64 ; done < <file.txt> > <output.txt>
cat <file.txt> | while read line ; do echo -n $line | base64 ; done

Ou podemos também criar um arquivo para realizar uma determinada operação. Para ver o resultado, execute da seguinte forma: ./file.sh <file.txt>

#!/bin/bash
while read x ; do
    echo -n '$x' | base64
done < $1

Random

Inserindo determinada quantidade de MB's em um arquivo

head -c 10M < /dev/urandom > <file>

Printando números aleatórios

# 1 número entre 1 e 10
shuf -i 0-10 -n 1

# 3 números entra 1 e 1000 
shuf -i 0-1000 -n 3

Trabalhando com Loop

for x in $(cat <file.txt>) ; do echo "Line: $x" ; done
while true ; do echo "Hacked"; done

Convertendo PDF

Ao executar o(s) comando(s) abaixo, será criado um arquivo com o mesmo nome, porém com a sua devida extensão já com os dados convertidos.

# Convertendo pdf em txt
pdftotext <file.pdf>

# Convertendo pdf em HTML
pdftohtml <file.pdf>

Lendo Arquivos JSON

cat <file> | jq
cat <file> | python -mjson.tool

Lendo Arquivos XML

curl -s http://site.com/sitemap.xml | xmllint --format -

Last updated