Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी का उपयोग करके कमांड लाइन में महारत हासिल करें: एक व्यावहारिक गाइड

कमांड लाइन में वास्तव में महारत हासिल करने के लिए आपको दर्जनों - यदि सैकड़ों नहीं - छोटे उपयोगिता प्रोग्राम में महारत हासिल करनी होगी। इनमें से प्रत्येक चीजों को थोड़ा अलग तरीके से करता है। यह बहुत भारी पड़ सकता है।

सौभाग्य से, इन एकल-उद्देश्य वाले टूल्स में से कई को रूबी जैसी सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा से बदलना संभव है। इस तरह आप अपने कमांड-लाइन-फू को लेवल अप करने के लिए अपने मौजूदा रूबी ज्ञान का उपयोग कर सकते हैं।

यह पोस्ट आपको रूबी को कमांड-लाइन स्विस आर्मी नाइफ के रूप में उपयोग करने के मूल सिद्धांतों के माध्यम से ले जाएगी। मैं आपको चतुर वन-लाइनर्स से नहीं भरूंगा। इसके बजाय हम देखेंगे कि चीजें वास्तव में कैसे काम करती हैं, ताकि उम्मीद है कि आप इन तकनीकों को अपनी समस्याओं को हल करने के लिए लागू कर सकेंगे।

कमांड लाइन से रूबी का उपयोग

मुझे यकीन है कि आप जानते हैं कि आप रूबी प्रोग्राम को कमांड लाइन से इस तरह चला सकते हैं:

$ ruby myprogram.rb 

लेकिन क्या आप जानते हैं कि आप रूबी द्वारा निष्पादित करने के लिए कोड पाइप कर सकते हैं?

$ echo "puts 2+2" | ruby 4 

यहां तक कि अधिक उपयोगी है कमांड-लाइन आर्गुमेंट के रूप में कोड पास करने की क्षमता। आज हम इसी पर अपना समय व्यतीत करने जा रहे हैं।

$ ruby -e 'puts 2+2' 4 

हे नौसिखिए

क्या उपरोक्त उदाहरण थोड़े भ्रमित करने वाले हैं? ऐसा इसलिए हो सकता है क्योंकि आप पाइप और रीडायरेक्शन से परिचित नहीं हैं। अच्छे परिचय के लिए इस पोस्ट को देखें। हम नीचे बहुत सारे पाइप का उपयोग करने जा रहे हैं।

इनपुट के साथ काम करना

अधिकांश कमांड-लाइन टूल कुछ डेटा लेते हैं, उसे प्रोसेस करते हैं, और फिर उसे वापस थूक देते हैं।

इनपुट प्राप्त करने के लिए हमारे पास दो अच्छे विकल्प हैं: कमांड-लाइन आर्गुमेंट और STDIN। आइए उनमें से प्रत्येक को देखें।

कमांड-लाइन आर्गुमेंट

आप अपने स्क्रिप्ट को जितने चाहें उतने कमांड-लाइन आर्गुमेंट भेज सकते हैं। बस उन्हें बाकी सब चीजों के बाद रखें:

$ ruby -e '<your code here>' arg1 arg2 arg3 etc 

ये आर्गुमेंट ARGV सरणी के अंदर संग्रहीत होते हैं। नीचे दिए गए उदाहरण में मैं पूरी सरणी को डंप कर रहा हूँ ताकि आप देख सकें कि इसमें क्या है।

$ ruby -e 'puts ARGV.inspect' apples bananas pears oranges ["apples", "bananas", "pears", "oranges"] 

यह ध्यान देने योग्य है कि रूबी हमेशा इसी तरह व्यवहार करता है। सिर्फ इसलिए कि हम कमांड लाइन का उपयोग कर रहे हैं, कोई जादू नहीं हो रहा है। अधिक विवरण के लिए ARGV के बारे में इस पोस्ट को देखें।

बेवकूफ उदाहरण

एक पल के लिए कल्पना करें कि मैं सुपर अहंकारी हूँ। मेरे लिए सबसे महत्वपूर्ण बात यह जानना है कि वेब पर मेरा नाम कितनी बार उल्लेख किया गया है। हमारे द्वारा देखी गई तकनीकों का उपयोग करके मैं किसी भी वेबपेज के लिए इसकी गणना करने के लिए आसानी से एक वन-लाइनर लिख सकता हूँ।

$ ruby -e "require 'open-uri'; puts open(ARGV.first).read.scan(/starr/i).count" <url here> 

STDIN

कमांड-लाइन आर्गुमेंट बहुत अच्छे हैं, लेकिन वे केवल छोटे मानों के लिए अच्छे हैं। आप उनका उपयोग करना नहीं चाहेंगे - मान लीजिए - मोबी डिक का संक्षिप्त न किए गए टेक्स्ट को इनपुट करने के लिए। उसके लिए हम STDIN का उपयोग करना चाहते हैं।

यदि आप STDIN से परिचित नहीं हैं, तो डरें नहीं। हमारे उद्देश्यों के लिए यह पढ़ने के लिए खुली किसी भी अन्य फाइल की तरह व्यवहार करता है।

मेरा मतलब यह है। नीचे दिए गए उदाहरण में हम कुछ टेक्स्ट को रूबी में पाइप कर रहे हैं। हमारा रूबी स्क्रिप्ट इसे STDIN से पढ़ रहा है और इसे स्क्रीन पर प्रिंट कर रहा है।

echo "bananas!" | ruby -e "puts STDIN.read" bananas! 

हम cat का उपयोग करके आसानी से बड़ी मात्रा में डेटा इनपुट कर सकते हैं। नीचे दिए गए उदाहरण में first मेथड का उपयोग किया गया है जो किसी भी फाइल पर उपलब्ध है ताकि टेक्स्ट की पहली कुछ पंक्तियों को पकड़ा जा सके:

cat moby.txt | ruby -e "puts STDIN.first(3)" Call me Ishmael. Some years ago--never mind how long precisely--having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of 

बेवकूफ उदाहरण

अब जब हम जानते हैं कि STDIN का उपभोग कैसे करना है, आइए ऊपर से बेवकूफ उदाहरण को फिर से लिखें। रूबी का उपयोग करके वेबपेज लाने के बजाय, हम curl का उपयोग कर सकते हैं और केवल पैटर्न मिलान के लिए रूबी का उपयोग कर सकते हैं।

curl <MY URL> | ruby -e "puts STDIN.read.scan(/starr/i).size" 

सिंटैक्टिक शुगर के साथ STDIN!

जब आप STDIN के साथ काम कर रहे होते हैं, तो इनपुट की प्रत्येक पंक्ति पर लूप करना बहुत आम है। कल्पना करें कि मैं एक निर्देशिका में प्रत्येक फाइल के लिए फाइल एक्सटेंशन प्राप्त करना चाहता हूँ। यहाँ बताया गया है कि मैं सामान्य STDIN लूप का उपयोग करके ऐसा कैसे कर सकता हूँ:

ls | ruby -e 'STDIN.each_line { |l| puts l.split(".").last }' rb rb csv 

चूंकि STDIN लूप इतना आम है, रूबी एक शॉर्टहैंड प्रदान करता है। यदि हम अपने स्क्रिप्ट को -n फ्लैग के साथ चलाते हैं, तो रूबी स्वचालित रूप से STDIN में प्रत्येक पंक्ति पर लूप करेगा। वर्तमान पंक्ति ग्लोबल वेरिएबल $_ में है।

तो हम उपरोक्त उदाहरण को इस तरह लिख सकते हैं:

ls | ruby -n -e 'puts $_.split(".").last' 

यह आप पर निर्भर करता है कि आप शॉर्टहैंड का उपयोग करना चाहते हैं या नहीं। हालांकि इसका मतलब निश्चित रूप से है कि आपको कम कोड लिखना होगा, इसका मतलब यह भी है कि आपको -n और $_ जैसे अधिक मनमाने तथ्यों को याद रखना होगा।

आउटपुट के साथ काम करना

इस तरह की स्थितियों में आप आमतौर पर अपना आउटपुट STDOUT पर लिखना चाहेंगे। यह आपको सबसे अधिक लचीलापन देगा क्योंकि यह आपको आउटपुट को अन्य प्रोग्राम में पाइप करने या आवश्यकतानुसार डिस्क पर रीडायरेक्ट करने देगा।

अच्छी खबर यह है कि आप उन्हीं प्रिंट कमांड का उपयोग कर सकते हैं जिनसे आप शायद बहुत परिचित हैं। एक बात का ध्यान रखें कि puts एक नई लाइन जोड़ता है, जो हो सकता है कि आप जो चाहते हैं वह न हो।

puts "hello world" # sends "hello world\n" to STDOUT print "hello world" # doesn't add a newline" 

सब कुछ एक साथ लाना

हनीबैजर अमेरिका में वाशिंगटन राज्य में स्थित है। इसका मतलब है कि हमें हर भुगतान करने वाले ग्राहक के लिए बिक्री कर का भुगतान करने का सौभाग्य मिलता है जो वाशिंगटन में भी रहता है।

मैंने इसे काफी सरल बना दिया है, लेकिन हमारे पास मूल रूप से साल के हर लेनदेन के साथ एक CSV फाइल है। यह कुछ इस तरह दिखता है:

1/1/2015,100.00,WA 1/1/2015,50.00,NY 

तो वाशिंगटन में सभी लेनदेन के लिए एक त्वरित योग प्राप्त करने के लिए मैं इस तरह एक वन-लाइनर का उपयोग कर सकता हूँ:

$ cat cc.csv | ruby -e 'puts STDIN.inject(0) { |sum, x| date, amount, state = x.split(","); state.strip == "WA" ? sum + amount.to_f : sum }' 

ध्यान रखें कि यह CSV फाइलों को पार्स करने का एक बेहद घटिया तरीका है। मैं इस कोड को कभी भी जंगल में नहीं भेजूंगा। लेकिन छोटे-छोटे प्रोग्राम लिखने की खुशियों में से एक यह है कि आप सभी एज केस को नजरअंदाज कर सकते हैं। वही मैं यहाँ करने जा रहा हूँ।


  1. गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी मेमोरी को चंक्स में प्राप्त करता है, जिन्हें पेज कहा जाता है, नए ऑब्जेक्ट्स यहां सहेजे जाते हैं। फिर… जब ये पेज भर जाते हैं, तो अधिक मेमोरी की आवश्यकता होती है। रूबी malloc फंक्शन के साथ ऑपरेटिंग सिस्टम से अधिक मेमोरी का अनुरोध करता है। यह malloc फंक्शन ऑ

  1. रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं

    पार्सिंग स्ट्रिंग्स के एक समूह को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकें। आप रेगुलर एक्सप्रेशन्स का उपयोग कर सकते हैं, लेकिन वे हमेशा इस काम के लिए उपयुक्त नहीं होते। उदाहरण के लिए, यह सामान्य ज्ञान है कि HTML को रेगुलर एक्सप्रेशन्स से पार्स करना शायद एक अच्छा विचार नहीं

  1. ID Watchdog के साथ अपनी पहचान सुरक्षित करें: 13 वर्षों से विश्वसनीय सुरक्षा ID Watchdog के साथ अपनी पहचान सुरक्षित करें: 13 वर्षों से विश्वसनीय सुरक्षा

    वे कौन हैं ID Watchdog ने पिछले 13 वर्षों से बाजार में अपनी उपस्थिति साबित की है जिससे पहचान की चोरी को अपरिहार्य रूप से असंभव बना दिया है। मिस्टर क्रेग रामसे ने जून 2005 में डेनवर, कोलोराडो में क्रेडिट पेशेवरों के एक समूह के साथ इस कंपनी की स्थापना की और पहचान की चोरी सुरक्षा सेवाओं में देश की अग्र