स्रोत स्क्रिप्ट में कुछ समस्याएँ हैं। पहला उदाहरण, आपको शायद सब्सक्रिप्शन की जरूरत नहीं है। लेकिन हमें नहीं पता कि "कुछ और कार्रवाई" के तहत क्या छिपा हुआ है। सबसे लोकप्रिय उत्तर में छिपा हुआ बग है, जो I / O को बढ़ाएगा, और उप-संस्करण के साथ काम नहीं करेगा, क्योंकि यह लूप के अंदर कूप्टर को पुनर्स्थापित करता है।
'' '' चिन्ह को न जोड़ें, यह रेखा की निरंतरता के बारे में दुभाषिया को सूचित करेगा। मुझे उम्मीद है कि यह आपकी या किसी की मदद करेगा। लेकिन मेरी राय में इस स्क्रिप्ट को पूरी तरह से AWK स्क्रिप्ट में बदल दिया जाना चाहिए, या फिर regexp, या perl का उपयोग करके अजगर को फिर से लिखा जाए, लेकिन वर्षों में पर्ल लोकप्रियता कम हो जाती है। बेहतर यह अजगर के साथ करते हैं।
बिना सबस्क्रिप्शन के सही किया गया संस्करण:
#!/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
यदि यह वास्तव में आवश्यक है, तो उप-संस्करण के साथ संस्करण
#!/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