Acabo de escribir un bash
guión y funciona como quería. Ese es el guión:
#!/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
Sin embargo, como soy nuevo, bash
preguntaría si hay una mejor manera de hacer ese tipo de script (aún en bash
el entorno). Cualquier explicación me será de gran utilidad para mejorar mi aprendizaje.
Respuesta1
- Utilice un encabezado comentado que explique qué hace el script y su uso.
- Utilice el shell POSIX (
/bin/sh
) para portabilidad; a menudobash
no es necesario para scripts simples. - Utilice variables en lugar de cadenas codificadas
- Considere usar la
$(some_command)
sintaxis en lugar de comillas invertidas. - No
cat
te gustegrep
, en su lugar usagrep <pattern> <file>
- ¿Por qué dormir?
- Deshágase de las variables temporales si no necesita los archivos, utilice tuberías en su lugar
sort | uniq
puede ser reemplazado porsort -u
- Si tiene que utilizar archivos temporales, considerelimpiar adecuadamente.
Respuesta2
Aquí hay una variación de su guión, como una "de una sola línea":
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 la creación de archivos temporales intermedios, quepuedese más rápido. Sin embargo, si tuviera alguna necesidad o uso para esos archivos intermedios, la frase de una sola línea es una dirección peor.
Una de las cosas que aprendí al leer suficientes scripts de shell bien escritos fue que la secuencia "grep | awk" a menudo se puede combinar. Para su script, observe que el comando grep ha sido reemplazado:
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
Respuesta3
Recientemente encontré útil usarModo estricto de bash no oficial:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
Este conjunto de parámetros realmente ayuda a reducir las sorpresas de variables no configuradas, entre otras cosas.