Acabei de escrever um bash
script e funciona como eu queria. Esse é o roteiro:
#!/usr/bin/env bash
DY=`date +%Y%m%d`
gunzip -c /var/log/cisco/cisco.log-$DY.gz > file.log
sleep 3
cat file.log | grep "Virtual device ath0 asks to queue packet" > file2.log
awk '{print $4}' file2.log > IP.log
sort IP.log | uniq > devices.log
wc -l devices.log
rm file.log file2.log IP.log devices.log
Porém, por ser novo, bash
gostaria de perguntar se existe uma maneira melhor de fazer esse tipo de script (ainda em bash
ambiente). Qualquer explicação será muito útil para melhorar meu aprendizado.
Responder1
- Use um cabeçalho comentado explicando o que o script faz e seu uso
- Use o shell POSIX (
/bin/sh
) para portabilidade, muitas vezesbash
não é necessário para scripts simples - Use variáveis em vez de strings codificadas
- Considere usar a
$(some_command)
sintaxe em vez de crases - Não
cat
entregrep
, em vez disso usegrep <pattern> <file>
- Por que o sono?
- Livre-se das variáveis temporárias se você não precisar dos arquivos, use pipes
sort | uniq
pode ser substituído porsort -u
- Se você tiver que usar arquivos temporários, considerelimpando corretamente.
Responder2
Aqui está uma variação do seu script, como uma "linha única":
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
grep "Virtual device ath0 asks to queue packet" | \
awk '{print $4}' | sort | uniq | wc -l
Evita a criação de arquivos temporários intermediários, quepoderiaseja mais rápido. Porém, se você tiver alguma necessidade ou uso desses arquivos intermediários, a linha única é uma direção pior.
Uma das coisas que aprendi lendo scripts de shell bem escritos foi que a sequência "grep | awk" pode frequentemente ser combinada. Para o seu script, observe que o comando grep foi substituído:
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
awk '/Virtual device ath0 asks to queue packet/ { print $4 }' | \
sort | uniq | wc -l
Responder3
Recentemente descobri que é útil usarModo estrito não oficial do bash:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
Este conjunto de parâmetros realmente ajuda a reduzir surpresas decorrentes de variáveis não definidas, entre outras coisas.