यह लेख bash स्क्रिप्ट में while लूप का उपयोग करके फ़ाइलें पढ़ने के बारे में है। फ़ाइल पढ़ना प्रोग्रामिंग में एक सामान्य ऑपरेशन है। आपको विभिन्न तरीकों से परिचित होना चाहिए और कौन सी विधि उपयोग करने के लिए अधिक कुशल है। Bash में, एक ही कार्य को कई तरीकों से प्राप्त किया जा सकता है लेकिन कार्य पूरा करने का हमेशा एक इष्टतम तरीका होता है और हमें उसका पालन करना चाहिए।
while लूप का उपयोग करके फ़ाइल सामग्री पढ़ने का तरीका देखने से पहले, while लूप कैसे काम करता है इस पर एक त्वरित प्राइमर। While लूप एक शर्त का मूल्यांकन करता है और जब शर्त सत्य होती है तो कोड के दिए गए सेट पर पुनरावृति करता है।
while [ CONDITION ] do code block done
आइए while लूप सिंटैक्स को तोड़ें।
- while लूप को एक while कीवर्ड के बाद एक शर्त के साथ शुरू करना चाहिए।
- एक शर्त को [ ] या [[ ]] के भीतर संलग्न किया जाना चाहिए। लूप निष्पादित होने के लिए शर्त हमेशा सत्य होनी चाहिए।
- वास्तविक कोड ब्लॉक do और done के बीच रखा जाएगा।
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
यह एक बहुत ही सरल उदाहरण है, जहां लूप तब तक चलता है जब तक NUMBER 10 से अधिक नहीं होता और echo स्टेटमेंट प्रिंट करता है।
while के साथ हम फ़ाइल की सामग्री को लाइन दर लाइन पढ़ने के लिए read कमांड का उपयोग करेंगे। नीचे सिंटैक्स है कि कैसे while और read कमांड संयुक्त हैं। अब फ़ाइल को इनपुट के रूप में पास करने के अलग-अलग तरीके हैं और हम उन सभी को देखेंगे।
# सिंटैक्स while read VARIABLE do code done
लिनक्स में पाइपिंग
आम तौर पर हम टर्मिनल से फ़ाइल की सामग्री देखने के लिए cat कमांड का उपयोग करेंगे। साथ ही, हम cat कमांड के आउटपुट को grep, sort आदि जैसे अन्य कमांड्स पर पाइप करेंगे।
इसी तरह, हम यहां फ़ाइल की सामग्री पढ़ने के लिए cat कमांड का उपयोग करेंगे और इसे while लूप पर पाइप करेंगे। प्रदर्शन के लिए, मैं /etc/passwd फ़ाइल का उपयोग कर रहा हूँ लेकिन इस फ़ाइल के साथ छेड़छाड़ करना उचित नहीं है इसलिए यदि आप चाहें तो इस फ़ाइल की बैकअप कॉपी लें और इसके साथ खेलें।
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
आइए देखें कि जब उपरोक्त कोड सबमिट किया जाता है तो क्या होगा।
- cat /etc/passwd फ़ाइल की सामग्री पढ़ेगा और इसे पाइप के माध्यम से इनपुट के रूप में पास करेगा।
- read कमांड cat कमांड से पास किए गए इनपुट की प्रत्येक लाइन को पढ़ता है और इसे LREAD वेरिएबल में स्टोर करता है।
- read कमांड फ़ाइल सामग्री को तब तक पढ़ेगा जब तक EOL की व्याख्या नहीं की जाती।
आप head, tail जैसे अन्य कमांड्स का भी उपयोग कर सकते हैं और इसे while लूप पर पाइप कर सकते हैं।
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
लिनक्स में इनपुट रीडायरेक्शन
हम इनपुट रीडायरेक्शन ऑपरेटर (<) का उपयोग करके फ़ाइल की सामग्री को while लूप पर रीडायरेक्ट कर सकते हैं।
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
आप फ़ाइल नाम को एक वेरिएबल में भी स्टोर कर सकते हैं और इसे रीडायरेक्शन ऑपरेटर के माध्यम से पास कर सकते हैं।
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
आप अपने स्क्रिप्ट के लिए फ़ाइल नाम को तर्क के रूप में भी पास कर सकते हैं।
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
इंटरनल फील्ड सेपरेटर
आप विभिन्न प्रकार के फ़ाइल फॉर्मेट (CSV, TXT, JSON) के साथ काम कर सकते हैं और आप फ़ाइल की सामग्री को कस्टम डिलीमीटर के आधार पर विभाजित करना चाह सकते हैं। इस मामले में, आप फ़ाइल की सामग्री को विभाजित करने और इसे वेरिएबल्स में स्टोर करने के लिए "इंटरनल फील्ड सेपरेटर (IFS)" का उपयोग कर सकते हैं।
मैं प्रदर्शित करूंगा कि यह कैसे काम करता है। /etc/passwd फ़ाइल पर एक नज़र डालें जिसमें डिलीमीटर के रूप में कोलन (:) है। अब आप एक लाइन से प्रत्येक शब्द को विभाजित कर सकते हैं और इसे एक अलग वेरिएबल में स्टोर कर सकते हैं।
नीचे दिए गए उदाहरण में, मैं /etc/passwd फ़ाइल को कोलन के रूप में अपने सेपरेटर के साथ विभाजित कर रहा हूँ और प्रत्येक विभाजन को अलग-अलग वेरिएबल्स में स्टोर कर रहा हूँ।
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
मैंने स्क्रीनशॉट आकार को ध्यान में रखते हुए उपरोक्त स्क्रीनशॉट में केवल एक लाइन विभाजन प्रदर्शित किया है।
लिनक्स में खाली लाइनें
जब आप फ़ाइल सामग्री के माध्यम से लूप करते हैं तो खाली लाइनें अनदेखी नहीं की जातीं। इसे प्रदर्शित करने के लिए मैंने नीचे दी गई सामग्री के साथ एक नमूना फ़ाइल बनाई है। 4 लाइनें हैं और कुछ खाली लाइनें, लीडिंग व्हाइटस्पेस, ट्रेलिंग व्हाइट स्पेस, लाइन 2 में टैब कैरेक्टर, और कुछ एस्केप कैरेक्टर (\n और \t)।
while read LREAD
do
echo ${LREAD}
done < testfile
परिणाम देखें, खाली लाइन अनदेखी नहीं की गई है। साथ ही, एक दिलचस्प बात यह है कि read कमांड द्वारा व्हाइट स्पेस कैसे ट्रिम किए जाते हैं। फ़ाइल सामग्री पढ़ते समय खाली लाइनों को अनदेखा करने का एक सरल तरीका टेस्ट ऑपरेटर का उपयोग करना है -z फ्लैग के साथ जो जांचता है कि स्ट्रिंग लंबाई शून्य है या नहीं। अब आइए वही उदाहरण दोहराएं लेकिन इस बार टेस्ट ऑपरेटर के साथ।
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
अब आउटपुट से, आप देख सकते हैं कि खाली लाइनें अनदेखी की गई हैं।
एस्केप कैरेक्टर्स
\n, \t, \c जैसे एस्केप कैरेक्टर्स फ़ाइल पढ़ते समय प्रिंट नहीं होंगे। इसे प्रदर्शित करने के लिए मैं उसी नमूना फ़ाइल का उपयोग कर रहा हूँ जिसमें कुछ एस्केप कैरेक्टर हैं।
while read LREAD
do
echo ${LREAD}
done < testfile
आउटपुट से आप देख सकते हैं कि एस्केप कैरेक्टर्स ने अपना अर्थ खो दिया है और \n और \t के बजाय केवल n और t प्रिंट हुए हैं। आप बैकस्लैश व्याख्या को रोकने के लिए -r का उपयोग कर सकते हैं।
while read -r LREAD
do
echo ${LREAD}
done < testfile
इस लेख के लिए बस इतना ही। अगर कोई प्रतिक्रिया या सुझाव हो तो हम आपसे सुनना पसंद करेंगे। आपकी प्रतिक्रिया ही हमें बेहतर कंटेंट बनाने में मदद करती है। पढ़ते रहें और समर्थन करते रहें।