Eu tenho uma seqüência de comandos a serem usados junto com muitos canais, algo assim:
awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '$AWK_CMD | $SORT_CMD $SORT_KEY $SORT_REV
' | tr [:lower:] [:upper:] | sort -t' ' -s -k3
Isso basicamente filtra o log do Apache e imprime três cols de informação. Primeiro col é o endereço IP, segundo é hora, terceiro é uma string. A saída pode ser classificada com base em qualquer coluna, portanto, preciso usar '-m' com classificação para o campo de hora. Ordem de classificação também pode ser revertida.
Eu quero que uma string armazene os argumentos para classificar e deixe as sequências combinadas serem executadas. Algo parecido com isto:
SORT_CMD="sort -t' '"
SORT_KEY="-k$1" # $1 from cmd line arg
SORT_REV="$2" # Either -r or blank
onde
awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '$final_cmd
'$final_cmd'
' | tr [:lower:] [:upper:] | sort -t' ' -s -k3
Running ...
awk: '{
awk: ^ invalid char ''' in expression
Sou capaz de construir essas cadeias de caracteres; quando eu faço eco, parece bem. Problema é, como executá-lo? Eu recebo alguns erros como:
KEY=$1 # Values {1, 2, 3}
REVERSE=$2 # Values {0, 1}
SORT_CMD="sort -t' ' -s"
SORT_KEY="-k$KEY"
if [[ $KEY -eq 2 ]]
then
SORT_KEY="-m -k2"
fi
if [[ $REVERSE -eq 1 ]]
then
SORT_REV="-r"
else
SORT_REV=
fi
final_cmd="awk '{ if (\ ~ \"isad\") {print \, \, \"SE\"} else {print \, \, \"ANT\"} }' $LOG_FILE '|' grep -v '127.0.0.1' '|' tr '[' 'awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '$AWK_CMD | $SORT_CMD $SORT_KEY $SORT_REV
' | tr [:lower:] [:upper:] | sort -t' ' -s -k3
' '|' tr [:lower:] [:upper:] '|' $SORT_CMD $SORT_KEY $SORT_REV"
echo $final_cmd
echo "Running ..."
$final_cmd
Por favor, ignore se 'sort' não classificar corretamente, isso pode ser corrigido. Eu gostaria de saber como posso construir a string de comando final em etapas. As formas que tentei executar este comando no script são:
SORT_CMD="sort -t' '"
SORT_KEY="-k$1" # $1 from cmd line arg
SORT_REV="$2" # Either -r or blank
Editar: o script que estou tentando usar
awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '$final_cmd
'$final_cmd'
' | tr [:lower:] [:upper:] | sort -t' ' -s -k3
Running ...
awk: '{
awk: ^ invalid char ''' in expression