Jornada Shell Script: Comandos Linux
Tema Central: Comandos Essenciais do Linux para Programação em Shell Script
Versão 1
Emissão: 16 de julho de 2022
Validade: Indeterminada
Objetivo Geral da Jornada Shell Script
Muitas pessoas me perguntam como eu me tornei um especialista em Linux, então, à primeira vista, minha resposta é, em geral, muito simples, estudando e praticando.
O uso de shell script é de vital importância para um administrador de sistemas, em especial um especialista Linux, uma vez que abre uma gama de possibilidades que podemos considerar infinitas. Desse modo, saber os Comandos Essenciais no Linux é de vital importância para o SysAdmin.
Então, são muitos os benefícios que um profissional obtém ao aprender essa maravilhosa linguagem de programação. Do mesmo modo, são muitos os benefícios gerados para o negócio quando temos scripts bem estruturados e bem documentos. O tempo que você ganhará e a assertividade nas rotinas repetitivas serão resultados claros. Mas Shell Script não está restrito a isso, um profissional que domina uma linguagem de programação como esta, consegue promover soluções rápidas e acelerar troubleshooting, além de tantas outras facilidades geradas que tentarei pincelar ao longo dessa jornada.
O sentido da Jornada Shell Script é simples, estruturar uma forma completa, mas objetiva, de levar a qualquer um que tiver muita força de vontade e interesse em aprender essa linguagem de programação a criar desde rotinas simples como a de um backup no Linux até programas complexos com loopings e funções configuradas com base em análises e decisões pré-determinadas pelo administrador de sistemas.
Por fim, espero que este artigo seja útil e mude verdadeiramente sua vida. Nesse ínterim, não deixe de se acompanhar nossos artigos que trarão sempre novidades, atualizações e dicas relevantes para sua carreira. Deixe do mesmo modo seu comentário, seja ele qual for. Sua opinião, pois, será o termômetro para definir o rumo dos próximos projetos que irei priorizar. Bons estudos!
Objetivo deste capitulo de introdução ao Shell Script
Primordialmente, nosso objetivo será capacitar à quem for de interesse na compreensão e execução de comandos essenciais de um sistema operacional Linux.
Cobriremos os comandos Essenciais do Linux para administração e programação em Shell Script
Sobre o Shell Script
Considero o Shell script acima de tudo, uma sequência de comandos, ou instruções lógicas que ao serem devidamente programadas em um sistema operacional Linux auxiliam o administrador de infraestrutura de TI na automação de tarefas, execução de tarefas repetitivas e rotinas, validações de processos, fazendo com que o administrador possa executar com maior eficiência atividades complexas gerando ganhos diretos para o negócio ao qual está envolvido, aumentando a produtividade da equipe e gerando reconhecimento profissional àquele que domina essa linguagem.
Pré-Requisitos Pessoais
Para o bom entendimento e melhor aproveitamento desse artigo, sobretudo, busquei ser o mais direito e simplista possível, tornando o processo de aprendizado livre a qualquer um que queira aprender a programar em Shell, necessário apenas muita força de vontade e esforço para praticar, errar, aprender e melhorar a cada oportunidade de colocar as ideias aqui expostas em prática. Além disso, o conhecimento de alguns termos técnicos em tecnologia da informação é desejado.
Pré-Requisitos Técnicos
Uma maquina virtual (VM) com Uma distribuição de sua preferência com editor de texto vi, padrão na maioria das distribuições Unix. Recomendo o Ubuntu 20.04.
Introdução ao Shell
Definição
O shell é considerado um interpretador de instruções do linux ou uma interface de comandos e tem como alguns dos seus principais usos:
- sh → O mais básico dos interpretadores do Linux
- bash → Interface mais utilizada e nossa referência para este artigo
- ksh → Mais um tipo de shell com algumas particularidades
- csh → Shell baseado em linguagem C
Identificando sua interface de comandos no Linux
De maneira simples, desde já citarei alguns comandos que podem ser utilizados para verificar se o interpretador que desejamos está instalado e definido para seu usuário no Linux:
echo $0 #ou echo $SHELL #Existem na tela do shell qual interface de comandos está sendo utilizada no momento tail /etc/passwd #O arquivo passwd guarda as informações dos usuários criados no Linux, e nele também podemos ver qual interpretador está definido para o seu usuário.
Obs.: essa informação é muito importante. Apesar da maior parte das distribuições Linux hoje em dia trazerem o bash como padrão, é comum em ambiente de produção ver usuários criados com o interpretador sh. Uma simples alteração no arquivo passwd de sh para bash facilita, em muito, a vida do administrador.
dpkg -l | grep csh #Lista os pacotes instalados na sua máquina Linux e filtra pela expressão csh
Obs.: fique tranquilo porque vou falar de cada comandos na sequência deste artigo.
apt install csh #Caso deseje instalar um pacote podemos usar no Ubuntu ou Debian o comando apt, nesse exemplo estamos instalando o pacote csh apenas para ilustrar, o csh não será usado na sequência deste artigo.
Comandos básicos Linux
Agora que fizemos as apresentações, vamos ao que interessa, os comandos.
Abaixo deixarei a lista dos comandos mais básicos para que um administrador Linux possa executar a maioria de suas rotinas e atividades corriqueiras.
pwd #Exibe o diretório atual
cd #Entra nos diretórios do sistema cd ../ #Entra no diretório anterior ao diretório atual cd – #Ingressa no último diretório acessado, anteriormente ao diretório atual cd #ou cd ~ #Acessa o Home do usuário logado. Home é onde ficam os arquivos pessoais do usuário no Linux, podemos mal compará-lo aos meus documentos do windows…
ls #Lista os arquivos e diretórios do sistema
ls -ltr #Lista os arquivos e diretórios ordenando do mais velho para o mais novo
ls -lh #Lista os arquivos e diretórios mostrando o tamanho dos arquivos em formato mais amigável
ls -1 #Mostra de maneira simplificada um arquivo ou diretório por linha no shell
ps #Lista os processos do sistema em execução
ps -aux #Parâmetro mais completo e mais utilizado do ps, onde mostra detalhes dos processos em execução
touch #Cria um arquivo em branco ou altera a data de modificação de um arquivo já existente
echo #Escreve um texto na tela echo -n #Ignora quebra de linha ao escrever um texto no shell echo -e #Estende as funções do echo podendo adicionar o parâmetro \t para tabular uma saída de texto ou \n para quebrar a linha do texto
mkdir #Cria um diretório mkdir -p #Cria um diretório e subdiretórios recursivamente
rm #Comando de remoção de arquivos rm -r #Remove diretórios e arquivos recursivamente rm -f #Ignora erros no comando (por exemplo se um arquivo ou diretório não existir)
sleep #Aguarda um determinado período até que a próxima instrução seja executada
cat #Lê um arquivo de texto cat -b #Enumera as linhas que não estejam em branco cat -n #Enumera as linhas mesmo aquelas que estão em branco cat -A #Exibição de todos os caracteres especiais e ocultos do texto tac #Leitura de arquivo de texto de modo invertido
tail #Lê por padrão as últimas 10 linhas de um arquivo de texto tail -n20 #Lê as ultimas 20 linhas de um arquivo de texto, sendo que 20 pode ser substituído para qualquer valor desejado tail -c50 #Lê os últimos 50 caracteres de um texto, podendo o valor 50 também ser substituído para qualquer valor desejado.
head #Lê por padrão as primeiras 10 linhas de um arquivo de texto head -n20 #Lê as primeiras 20 linhas de um arquivo de texto, sendo que 20 pode ser substituído para qualquer valor desejado head -c50 #Lê os primeiros 50 caracteres de um texto, podendo o valor 50 também ser substituído para qualquer valor desejado.
wc #Faz a contagem de Linhas, palavras e caracteres de um arquivo wc -l #Faz a contagem de linhas de um arquivo wc -w #Faz a contagem de palavras de um arquivo wc -c #Faz a contagem de caracteres de um arquivo wc -b #Faz a contagem de bytes de um arquivo, normalmente coincide com a quantidade de caracteres
Os comandos que seguirão são muitos utilizados com "PIPE", utilizado para direcionar a saída de um comando para outro comando ex de uso do "|" Pipe: cat arquivo.txt | wc -l #Lê um arquivo e faz a contagem de linhas no arquivo
sort #Faz a ordenação de um arquivo ou saída de comando. Por padrão a ordenação dar-se-á em string (ordem alfabética) sort -t #Parâmetro que define um delimitador para os campos (colunas) do texto sort -k #Define qual campo será utilizado como parâmetro para a ordenação sort -g #Realiza a ordenação numericamente sort -r #Reverte a ordenação (maior para menor ou Z para A)
uniq #Comandos para análise de linhas repetidas em uma saída de comando. Muito utilizado com sort uma vez que depende que as repetições estejam na sequência
uniq -u #Exibe as linhas exclusivas de uma saída de comando
uniq -d #Exibe as linhas que se repetem pelo menos uma vez, em sequência, na uma saída de comando
uniq -c #Conta o número de ocorrências e repetições sequenciais de cada linha
tr #Utlizando para substituição de strings tr a-z A-Z #Transforma toda string de caixa baixa para caixa alta também pode ser usado como [:lower:] [:upper:] tr " " "\t" #Altera Espaços por tabs, outras substituições como /n são aceitas no tr tr -d #Deleta caracteres tr -s #Suprime caracteres repetidos, muito útil para tirar uma sequência de espaços em branco
cut #Comando utilizado para cortar partes de uma saída de comando ou texto cut -c1-5 #Exibe apenas os 5 primeiros caracteres. Esses valores de 1 à 5 podem ser trocados conforme necessidade cut -d #Define qual caractere será usado como delimitador de colunas na planilha cut -f #Seleciona qual coluna (field ou campo) será exibido no recorte da linha
diff #Compara dois arquivos de texto #A saída < mostra que a diferença está no arquivo da esquerda #A saída > mostra que a diferença está no arquivo da direita diff -w #Ignora espaços em branco na comparação dos arquivos diff -r #Compara diretórios e arquivos recursivamente
grep #Busca de string dentro de um arquivo #Ao usar o comando grep em vários arquivos ao mesmo tempo (ex: arquivo*), a saída mostrada também o nome do arquivo onde foi encontrada a expressão procurada. grep -i #Faz busca pela string testando com caixa alta e caixa baixa. Torna a busca mais pesada. grep -c #Conta o número de ocorrências encontradas (similar a função wc -l mas fazendo um filtro antes) grep -v #Retorna tudo que NÃO contiver a expressão procurada grep -r #Busca pela string nos arquivos recursivamente, em diretório e subdiretórios grep -I #Retorna em tela apenas o nome do arquivo e não a linha encontrada grep -A #Após a string ser encontrada, retornará tudo que vier após a ocorrência grep -B #Após a string ser encontrada, retornará tudo que vier antes da ocorrência #VARIAÇÕES DO GREP fgrep #Mais leve. Não aceita expressões regulares egrep #Mais pesado, estende as expressões regulares deixando as opções de busca com muito mais possibilidades
sed #Um comando que mistura um pouco das ideias do grep e do tr. Para substituições mais avançadas de strings normalmente o sed é o mais utilizado sed '1,3 d' #Deleta as linhas de 1 até 3, podendo esses valores de 1 até 3 serem alterados conforme necessidade sed '/STRING/d' #Deleta a linha toda vez que encontrar a palavra STRING (que poderia ser qualquer palavra) sed 's/DE/PARA/g' #Substitui as string de DE para PARA (por padrão apenas na primeira ocorrência. Utilizamos o /g para executar a substituição globalmente, ou seja, em todo arquivo ou texto procurado Podemos elaborar muitas variações com o sed, por exemplo: Imagine que você precisa exibir um texto "A PARTIR" de uma determinada expressão encontrada. Com um pouco de imaginação poderíamos para o, a partir do comando sed, que ele precisa apagar as linhas "1" até a expressão encontrada. Na prática, isso atenderia nosso objetivo. sed '1,/STRING A SER ENCONTRADA NO ARQUIVO/d' #Lembrando que 1, indica que estamos partindo da linha de número um e o "/d" indica que queremos deletar as linhas.
more #Comando para ler um arquivo paginado. Limitado, você só pode descer a paginação less #Outro comando para leitura de um arquivo paginado, porém com vários modos de navegação, pesquisa e comandos
find #Busca avançada de arquivos find / -name FILE* #Busca pelos arquivos que iniciem pelo nome FILE de maneira recursiva a partir do diretório raiz "/" find /home/ -type f -exec du -sh {} \; #O parâmetro type especifica o tipo de arquivo que o find vai procurar e o parâmetro exec informa ao script que um comando deverá ser executado para cada arquivo encontrado. A sintaxe padrão deve ser observada e respeitada "{} \" find /tmp/ -date #Especifica a data em que o arquivo foi modificado para que retorne na busca
seq #Comando que realiza uma sequência numérica. Muito utilizado em loopings seq 5 2 20 #Sequência de 5 a 20 com intervale a cada 2
expr #Expressões matemáticas, contas expr 5 + 3 #Lembrar de sempre expressar os valores separados por espaços #Por padrão o comando não trabalhará com casas decimais, apenas inteiros #Para multiplicar deve-se proteger o carácter asterisco: "\*" bc #Outro comando utilizado para fazer expressões matemáticas no shell #ex: echo "4*(2+3)" | bc #Resultado 20
tar #Empacota e pode compactar um grupo de arquivos e diretórios # -c #Cria um arquivo ".tar" # -v #Verbose, mostra os detalhes do processo # -f #Necessário para definir o nome do arquivo ".tar" ou ".tar.gz" gerado # -z #Habilita compressão em gzip # -t #Usado para listar o conteúdo de um arquivo tar # -x #Extrai um grupo de arquivos e diretórios (pode ser usado com tar ou tar.gz) ## Para extrair um arquivo específico basta colocar o nome do arquivo após o nome do pacote tar ou tar.gz ## --wildcards '*.jpg' #para extração apenas de arquivos jpg # -C #Caso deseje apontar um local diferente para extração
Redirecionamento de entrada e saída
Em Scripts Shell ou até mesmo no dia a dia é comum o administrador de sistemas executar vários comandos de maneira conjunta ou sequencial.
Abaixo estarei demonstrando como realizar o sequenciamento de comandos e como o shell interpreta as saídas e erros dos comandos.
Para entrada de comandos na interface chamamos de STDIN. Basicamente é tudo que o shell receberá de informação do administrador de sistemas.
Por outro lado, para saída de comandos padrões, sem falhas, damos o nome de STDOUT. Nesse cenário o Shell guardará na variável $0 o valor 0 (zero).
Agora, para saída de comandos com falhas, damos o nome de STDERR. Nesse cenário o Shell guardará na variável $0 o valor diferente de 0 (zero).
Redirecionamento de STDOUT ou STDERR para um arquivo de texto (log)
> #Cria um novo Arquivo >> #Adiciona linhas para um novo arquivo ou existente > log.out 2> log-erro.out #Logs de sucesso e erro em saídas distintas > log.out 2>&1 #Log único para sucesso e erro /dev/null #Buraco negro, muito usado quando queremos direcionar uma saída para "lugar nenhum" apenas tirar da tela ex: ls -lha >/tmp/log-success.log 2>/tmp/log-error.log ls -lha >/tmp/log-success.log 2>&1 ls -lha 2>/dev/null
Também podemos fazer o redirecionamento de entrada
Ex: tr < arquivo
Execução sequencial de Comandos no Linux
comando1; comando2; comando3 #O ponto e vírgula permite o sequenciamento de três comandos em uma única linha. Os comandos não são dependentes entre si e serão executados em sequência independente do resultado de cada um comando1 && comando2 #Desse modo o segundo comando apenas será executado se o primeiro comandos não retornar problemas (STDERR=0) comando1 || comando2 #Desse modo o segundo comando apenas será executado se o primeiro apresentar problemas (STDERR!=0) (comando em subshell) #Ao incluirmos um comando entre parênteses, estamos informando ao shell que um sub shell seja aberto. As variáveis de ambiente não exportadas não serão reconhecidas
Por fim, não deixe de acompanhar a sequência dessa Jornada. Pois, na parte 2 dessa jornada falaremos sobre REGEX, File Globbing e Variáveis de Ambiente no Linux.
Excelente material! Parabens!!!
Obrigado pelo feedback. Sua opinião é nossa energia para seguir melhorando