Não há "práticas recomendadas". Apenas coisas que fazem sentido e facilitam as coisas.
Extrair as partes comuns e parametrizar o resto é uma dessas coisas:
lines="'gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz'"
#gunzip would always output the same thing on the same day, so
#just run it once and store the results in a variable
grepAndLog(){
local regex="$1" file="$2" msg="$3" filter="${4:-cat}"
#^names for positional parameters
printf "%s\n" "$lines" | grep "$regex" | cut -d' ' -f4 | sort | uniq -c | eval "$filter" > "/tmp/$file"
local count='wc -l < "/tmp/$file"'
echo "There are $count "" $msg" >> "/tmp/$file"
}
grepAndLog ath_bstuck_tasklet netgear_bacon.txt \
'Stuck beacon; resetting'
grepAndLog netgear_buffer_queue netgear_buffer_queue.txt \
"routers with 'Virtual device ath0 asks to queue packet' errors"
grepAndLog CMS_MSG_DNSPROXY_RELOAD netgear_dns.txt \
" routers with 'DNS Proxy Issue' errors"
grepAndLog ath_bstuck_tasklet netgear_bacon.txt \
" routers with beacon frame errors"
grepAndLog ACK netgear_ACK.txt \
" routers with more than 50 ACK" 'awk -v x=50 "\ >= x"'
Ainda é uma solução de shell principal. Mas o IMO é mais legível e mais de 40% mais curto.
Sobre o código:
Estou usando grep "$regex" | cut -d' ' -f4
em vez da expressão awk.
Além disso, a função grepAndLog
é uma generalização do que você faz em cada linha do script:
Você tem alguma entrada (a saída do gunzip), você usa isso para uma expressão (o parâmetro $regex
) e imprime as linhas resultantes, classificadas e prefixadas com count em $file
. Então você acrescenta a contagem de linha
(Eu faço wc -l < "$file"
em vez de wc -l "$file" | awk ...
) envolto em uma mensagem cujo começo é constante e cujo final varia ( $msg
).
Na sua última linha, você não simplesmente usa grep, mas usa outro filtro além disso.
Em vez de criar uma ramificação if
para isso na função, simplesmente uso cat
como um filtro adicional padrão implícito nos casos normais em que não existe quarto parâmetro ( local filter="${4:-cat}"
significa criar um filtro variável de função local cujo conteúdo é o quarto parâmetro dado à função ou cat
se nenhum quarto parâmetro for fornecido). cat
será sobreposto se um quarto parâmetro for dado a grepAndLog
.