यह लेख आपको Linux पर Bash/शेल में printf कमांड का उपयोग करने के लिए कुछ व्यावहारिक उदाहरण दिखाएगा।
printf कमांड echo कमांड की तरह टेक्स्ट आउटपुट करता है – लेकिन यह आउटपुट फॉर्मेटिंग पर अधिक नियंत्रण की अनुमति देता है।
यह आपके अपने फॉर्मेटेड टेक्स्ट आउटपुट उत्पन्न करने के लिए एक उपयोगी उपकरण है – विशेष रूप से यदि आपको टेक्स्ट में वेरिएबल एम्बेड करने, नई लाइनें शामिल करने, टेक्स्ट को संरेखित और फॉर्मेट करने, और यहां तक कि परिवर्तित मान प्रदर्शित करने की आवश्यकता है।
printf सिंटैक्स
printf कमांड का निम्नलिखित सिंटैक्स है:
printf [-v var] format [arguments]...
ध्यान दें कि:
- -v विकल्प printf को परिणाम को प्रिंट करने के बजाय वेरिएबल var में स्टोर करने के लिए कहता है
- format एक स्ट्रिंग है जिसमें तीन अलग-अलग मानों का संयोजन होता है:
- सामान्य वर्ण जो शब्दशः प्रिंट किए जाएंगे
- बैकस्लैश-एस्केप्ड वर्ण जो प्रिंट होने से पहले व्याख्या किए जाते हैं
- रूपांतरण जो निर्दिष्ट हैं और उनके संबंधित आर्गुमेंट्स से प्रतिस्थापित हैं (उन्हें थोड़ा वेरिएबल की तरह समझें)
- arguments को format में पास किया जाएगा और किसी भी परिभाषित रूपांतरण में उपयोग किया जाएगा
- यदि format में रूपांतरण स्पेसिफायर्स से अधिक आर्गुमेंट्स मौजूद हैं, तो format स्ट्रिंग तब तक दोहराई जाती है जब तक सभी arguments उपयोग नहीं हो जाते
- यदि कम आर्गुमेंट्स मौजूद हैं, तो न्यूमेरिक स्पेसिफायर्स को शून्य पर सेट किया जाता है, और स्ट्रिंग स्पेसिफायर्स को नल पर सेट किया जाता है
printf एस्केप्ड वर्ण, रूपांतरण, और फ्लैग्स
printf के पास विकल्पों का एक विशाल संग्रह है जिसे इसे पास किया जा सकता है ताकि यह टेक्स्ट को असंख्य तरीकों से फॉर्मेट कर सके। नीचे दिए गए उदाहरण आपको कुछ व्यावहारिक अनुप्रयोग दिखाएंगे।
यहां कमांड को पास किए जा सकने वाले हर विकल्प को सूचीबद्ध करने के बजाय, आप अपने सिस्टम पर printf कमांड के लिए पूर्ण उपयोगकर्ता मैनुअल देख सकते हैं:
man printf
printf Bash/शेल उदाहरण
ठीक है, तो वह सब वास्तव में किस लिए अच्छा है?
संख्याओं के गोल मान प्रदर्शित करना
पहला, एक सरल परिदृश्य – आप प्रदर्शित करने के लिए एक संख्या को दो दशमलव स्थानों तक फॉर्मेट करना चाहते हैं:
printf "%.2f" 4.21423557
यह आउटपुट देगा:
4.21
निर्दिष्ट फॉर्मेट %.2f printf को संख्या को दो दशमलव स्थानों तक फॉर्मेट करने के लिए कहता है। यह precision डायरेक्टिव का उपयोग करके किया जाता है, जो फॉर्मेट में . (पीरियड) है।
यह संख्या को दिए गए दशमलव स्थानों की संख्या तक काटने के बजाय गोल करेगा। फ्लोटिंग-पॉइंट संख्याओं का गोल करना अजीब है – इसलिए अपने आउटपुट की जांच करें!
गोल करने की विचित्रता
इस विचित्रता को समझाने के लिए, निम्न पर विचार करें:
printf "%.2f" 4.215
यह 4.22 होना चाहिए, है ना? गलत। zsh में printf के कार्यान्वयन में, इसे इस पर गोल किया जाएगा:
4.21
यह पुष्टि करने के लिए कि संख्या वास्तव में गोल की जा रही है, हम एक अलग मान जांच सकते हैं:
printf "%.2f" 4.216
जो लौटाएगा:
4.22
… तो printf को पास की जा रही संख्या है गोल की जा रही है।
तो 4.215 का गोल मान गलत क्यों दिखाई देता है? सरल शब्दों में, चूंकि यह एक फ्लोटिंग-पॉइंट नंबर है, इसलिए प्रदर्शित मान और कंप्यूटर द्वारा गणना में उपयोग किए जाने वाले मान के बीच असमानता के कारण अस्पष्टता होती है।
इसके आसपास के तरीके हैं, लेकिन यह इस लेख के दायरे से बाहर है – मैं इसे दूसरे में कवर करूंगा।
मान परिवर्तित करना (दशमलव, हेक्साडेसिमल, ऑक्टल)
एक सामान्य परिदृश्य – आप कुछ संख्याओं को उस फॉर्मेट के अलावा किसी अन्य फॉर्मेट में प्रदर्शित करना चाहते हैं जिसमें वे किसी अन्य प्रोग्राम या स्क्रिप्ट द्वारा आपूर्ति की गई थीं। printf अपने रूपांतरण स्पेसिफिकेशन सिंटैक्स का उपयोग करके ऐसा कर सकता है:
printf "Decimal: %d\nHexadecimal: %x\nOctal: %o\n" 64 64 64
यह आउटपुट देगा:
Decimal: 64 Hexadecimal: 40 Octal: 100
संख्या 64 को फॉर्मेटर को 3 बार पास किया जाता है और तीन अलग-अलग फॉर्मेट में प्रदर्शित किया जाता है।
सुंदर आउटपुट बनाना
नीचे दिया गया उदाहरण printf का उपयोग करके एक फॉर्मेटेड टेबल आउटपुट करता है – मैं टिप्पणियों में बताऊंगा कि क्या हो रहा है, इसलिए यह स्पष्ट है:
#/bin/bash # Define the format for the header text # This is a new line (\n) followed by a left-aligned string of 15 characters (%-15s), followed by a string of 15 characters (%15s), finally followed by a string of 10 characters (%10s) and another newline header_format="\n %-15s %15s %10s\n" # Define the format for the data in each row # The first two entries mirror those in the header, but the final one is a bit different - a floating number with 2 decimal places(%11.2f) row_format=" %-15s %15s %11.2f\n" # Use the printf command to print the header # The format is specified, and the arguments containing the column names for the table are supplied # printf will take the header_format, and insert the values from the attributes into it, formatted to the given specification, then print it printf "$header_format" "CAR BRAND" "COLOUR" "TOP SPEED" # Print the horizontal line under the table header # Here, printf is used to print an equals symbol. Brace expansion (the curly braces) is a shell scripting shortcut which will run the printf command for every number between 1 and 50, repeating the symbol 50 times to create a line printf '=%.0s' {1..50} # Print each row of data using the row_format. Each line (indicated by a backslash and a line return) contains three values - the car brand, colour, and top speed # Any value with a space needs to be quoted as values are separated by spaces and printf won't be able to tell where one value ends and another begins printf "$row_format" \ Toyota Blue 100 \ Ford "Light Green" 78.3875 \ "General Motors" Purple 15.96
इस स्क्रिप्ट को चलाने से आउटपुट होगा:
CAR BRAND COLOUR TOP SPEED ================================================== Toyota Blue 100.00 Ford Light Green 78.39 General Motors Purple 15.96
यहां printf द्वारा डेटा को कैसे फॉर्मेट किया गया है, इस पर ध्यान से देखें। जहां हेडर और पंक्तियों के लिए एक निश्चित वर्ण लंबाई के स्ट्रिंग्स निर्दिष्ट किए गए थे, टेक्स्ट संरेखित होता है। टॉप स्पीड को दो दशमलव स्थानों तक फॉर्मेट किया गया है और सही स्थिति में रखा गया है। टेक्स्ट दाएं-संरेखित है सिवाय जहां पहले कॉलम के लिए निर्दिष्ट किया गया है।
अपेक्षाकृत कम मात्रा में सिंटैक्स के साथ, पढ़ने में कठिन डेटा को उपयोगी जानकारी में बदल दिया गया है।
आकाश ही सीमा है
आप printf का उपयोग करने के लिए अपने कारण लेकर आएंगे – स्क्रिप्ट के लिए सुंदर मेनू के साथ कमांड-लाइन इंटरफेस बनाना, डेटाबेस क्वेरी के परिणामों को सारणीबद्ध करना – यह आपके बैग में एक शक्तिशाली उपकरण है, खासकर यदि आप केवल अनफॉर्मेटेड टेक्स्ट को स्क्रीन पर डंप करने के बजाय एक चिकना दिखने वाला शेल स्क्रिप्ट से किसी को प्रभावित करना चाहते हैं।
आप printf को Linux में अन्य टेक्स्ट हैंडलिंग कमांड के साथ जोड़ सकते हैं।