El script de origen tiene algún problema con subshell. Primer ejemplo, probablemente no necesite subshell. Pero no sabemos qué se esconde bajo "Algo más de acción". La respuesta más popular tiene un error oculto, que aumentará la E / S y no funcionará con subshell, porque restaura el interior del bucle.
No agregue el signo '\', informará al intérprete bash sobre la continuación de la línea. Espero que te ayude a ti o a cualquiera. Pero en mi opinión, esta secuencia de comandos debe convertirse completamente a la secuencia de comandos AWK, o reescribirse a Python usando regexp, o perl, pero la popularidad de perl a lo largo de los años se degrada. Mejor hacerlo con python.
Versión corregida sin subshell:
#!/bin/bash
WFY_PATH=/var/log/nginx
WFY_FILE=error.log
COUNTER=0
grep 'GET /log_' $WFY_PATH/$WFY_FILE | grep 'upstream timed out' |\
awk -F ', ' '{print $2,$4,$0}' |\
awk '{print "http://example.com"$5"&ip="$2"&date="$7"&time="$8"&end=1"}' |\
awk -F '&end=1' '{print $1"&end=1"}' |\
#( #unneeded bracket
while read WFY_URL
do
echo $WFY_URL #Some more action
COUNTER=$((COUNTER+1))
done
# ) unneeded bracket
echo $COUNTER # output = 0
Versión con subshell si es realmente necesario
#!/bin/bash
TEMPFILE=/tmp/$$.tmp #I've got it from the most popular answer
WFY_PATH=/var/log/nginx
WFY_FILE=error.log
COUNTER=0
grep 'GET /log_' $WFY_PATH/$WFY_FILE | grep 'upstream timed out' |\
awk -F ', ' '{print $2,$4,$0}' |\
awk '{print "http://example.com"$5"&ip="$2"&date="$7"&time="$8"&end=1"}' |\
awk -F '&end=1' '{print $1"&end=1"}' |\
(
while read WFY_URL
do
echo $WFY_URL #Some more action
COUNTER=$((COUNTER+1))
done
echo $COUNTER > $TEMPFILE #store counter only once, do it after loop, you will save I/O
)
COUNTER=$(cat $TEMPFILE) #restore counter
unlink $TEMPFILE
echo $COUNTER # output = 0