Oh meu Deus!
Eu posso ver por que demora uma eternidade para executar, você está repetindo as operações, não armazenando informações em cache e praticamente vencendo o computador até a morte. Computador Pobre. : (
O awk não é leve e você o invoca muitas e muitas vezes nos mesmos dados. Consegui executá-lo uma vez e definir todas as cinco variáveis.
Sem saber o que isso deveria estar fazendo ou realizando, há tanta coisa que pode ser feita.
Considerando que TODO o processamento é grep, awk, sed e tr, você pode obter um impressionante aumento de velocidade escrevendo este script em PERL. PERL é / foi projetado para lidar com texto e relatórios. Ele pode fazer todos os grep / awk / sed / tr internamente sem gastar muito para outro programa repetidamente.
Mas aqui estão algumas melhorias:
if [ -s "$LOC/check.txt" ]; then
function setvars() {
CONN_TSMP="$1"
USER="$2"
HOST="$3"
DB="$4"
IP="$5"
return
}
while read line; do
echo " started processing ${line} at $(date) " >> "${SCRIPT_LOC}/running_status.txt"
ID=$(echo "$line" | tr -d '"')
# are you sure you don't want the FIRST match? This will give ALL the matches,
# which will prevent you from getting good values for the variables
# to only get first entry that matches:
# TST=$(grep --max-count=1 -w "$line" "$PERM_LOC/id_processing.txt")
# (or -m 1, but long options document what you're doing better)
TST=$(grep -w "$line" "$PERM_LOC/id_processing.txt")
VARS=$(echo "${TST}" | awk -F '"' '{print "\""$2"\" \""$10"\" \""$18"\" \""$20"\" \""$22'})
# CONN_TSMP USER HOST IP DB
# magic! setvars receives the 5 values awk pulled out (ran it once!)
# NO QUOTES on next line, already has them embedded from awk
setvars $VARS
if [ -z "$IP" ]; then
IP="$HOST"
fi
CMD_TARGET="/data1/commands/user_commands"
FILE="${ID}-${CONN_TSMP}-${USER}@${IP}.txt"
if [ "$USER" == "root" ] && [ -z "$DB" ]; then
TARGET="/data1/sessions/root_sec"
else
TARGET="/data1/sessions/user_sec"
fi
# does this need to be redirected to a file?
ls "$TARGET/$FILE"
if [ $? -ne 0 ]; then
# awk can likely do the print and the removal of </> characters in
# one pass (my awk-fu is weak this morning)
echo "$TST" | awk -F 'STATUS="0"' '{print $2}'| sed "s/[</>]//g" >> "$TARGET/$FILE"
echo -e "\n" >> "$TARGET/$FILE"
fi
# ALWAYS quote your values, embedded spaces will bite you!
grep "$line" "$LOC/out.txt" > "$LOC/temp.txt"
while read val; do
TSMP=$(echo "$val" | awk -F '"' '{print $2}')
QUERY=$(echo "$val" | awk -F 'SQLTEXT=' '{print $2}' | sed "s/[\"/]//g")
echo " TIMESTAMP=$TSMP " >> "$TARGET/$FILE"
echo " QUERY=$QUERY " >> "$TARGET/$FILE"
TEXT=$(grep "$QUERY" "$PERM_LOC/commands.txt")
if [ -n "$TEXT" ]; then
NUM=$(expr $NUM + 1)
# could also be: NUM=$(($NUM+1)) (bash v4.0+)
SUB_FILE="$ID-$command-$NUM-$TSMP-$USER@$IP.txt"
echo -e "===============\n" > "$CMD_TARGET/$SUB_FILE"
echo "FILE = \"$SUB_FILE\"" >> "$CMD_TARGET/$SUB_FILE"
### same way append 6 more lines to $SUB_FILE
SUB=$(echo "$WARN_ME" | grep "$command")
if [ "$command" == "$VC" ]; then
STATE=" very critical "
elif [ -z "$SUB" ]; then
STATE=" CRITICAL "
else
STATE=" WARNING "
fi
if [ "$USER" != "root" -a "$command" != "$VC" ]; then
# this should probably be $command instead of command?
# oh wait, probably a placeholder statement
mail command &
elif [ "$USER" == "root" -a -z "$HOST" ]; then
mail command &
elif [ "$USER" == "root" -a "$command" == "$VC" ]; then
mail command &
else
echo -e "some message \n" >> $LOC/operations.txt
fi
fi
done < "$LOC/temp.txt"
done < "$LOC/check.txt"
fi
Hmm, "apenas script de shell". Bem, com isso em mente, talvez você possa pre-grep "$ LOC / check.txt" e / ou "$ LOC / temp.txt" para que você possa usar a saída "já grepped" em vez de usar o loop.
Quanto mais eu olho para isso, mais eu estou convencido de que o awk provavelmente faria todo esse trabalho em uma única passagem pelos dados ... E processaria CADA entrada, não apenas a primeira (como eu indiquei no comentários, você realmente precisa de outro loop entre os loops "ler linha" e "ler var".)Seria um roteiro longo, mas definitivamente factível. E awk vale a pena conhecer, tire um momento e brinque com isso, não é tão difícil, apenas diferente. Grok Awk!