Skrip sumber memiliki masalah dengan subkulit. Contoh pertama, Anda mungkin tidak membutuhkan subkulit. Tapi Kami tidak tahu apa yang tersembunyi di bawah "Beberapa tindakan lagi". Jawaban paling populer memiliki bug tersembunyi, yang akan meningkatkan I / O, dan tidak akan berfungsi dengan subkulit, karena memulihkan couter di dalam loop.
Jangan menambahkan tanda '\', ini akan menginformasikan juru bahasa bash tentang kelanjutan baris. Saya harap ini akan membantu Anda atau siapa pun. Tapi menurut saya skrip ini harus sepenuhnya dikonversi ke skrip AWK, atau ditulis ulang ke python menggunakan regexp, atau perl, tetapi popularitas perl selama bertahun-tahun menurun. Lebih baik lakukan dengan python.
Versi yang Dikoreksi tanpa subkulit:
#!/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 dengan subkulit jika benar-benar dibutuhkan
#!/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