2010-07-23 9 views
16

मैं इस तरह एक फ़ाइल, someFile है,:मैं पर्ल एक-लाइनर के लिए तर्क कैसे सर्वोत्तम तरीके से पास करूं?

$cat a.sh 
#!/usr/bin/ksh 
for d in 1 2 
do 
    grep -q "hdisk$d" someFile && echo "$d : ok" 
done 

मैं इसे पर्ल में बदलने की कोशिश कर रहा हूँ:

$cat b.sh 
#!/usr/bin/ksh 
export d 
for d in 1 2 
do 
    cat someFile | perl -lane 'BEGIN{$d=$ENV{'d'};} print "$d: OK" if /hdisk$d\s+/' 
done 

$cat someFile 
hdisk1 active 
hdisk2 active 

मैं जाँच करने के लिए इस खोल स्क्रिप्ट का उपयोग मैं शैल स्क्रिप्ट में परिवर्तनीय d निर्यात करता हूं और पर्ल में %ENV का उपयोग करके मान प्राप्त करता हूं। क्या इस मूल्य को पर्ल वन-लाइनर में पास करने का एक बेहतर तरीका है?

+4

क्यों प्रदर्शन नहीं पर्ल में सीधे पाशन? तब आपकी खोल स्क्रिप्ट बस गायब हो जाती है। – FMc

+0

'बिल्ली फ़ाइल का उपयोग करने के बजाय | perl ... '' perl ... file' का उपयोग करना अधिक आसान है। – TrueY

उत्तर

24

आप "एस" स्विच के साथ अल्पविकसित कमांड लाइन तर्क सक्षम कर सकते हैं। एक चर को एक डैश से शुरू होने वाले प्रत्येक तर्क के लिए परिभाषित किया जाता है। -- बताता है कि आपकी कमांड लाइन तर्क कहां से शुरू होते हैं।

for d in 1 2 ; do 
    cat someFile | perl -slane ' print "$someParameter: OK" if /hdisk$someParameter\s+/' -- -someParameter=$d; 
done 

देखें: perlrun

+0

कुछ बहुत धन्यवाद। वास्तव में इसे कभी नहीं समझ लिया। कमांड लाइन तर्कों की आवश्यकता होने पर हमेशा एक स्क्रिप्ट लिखी जाती है। – saudic

1

कमांड लाइन पर यह दर्रा, और यह @ARGV में उपलब्ध हो जाएगा:

for d in 1 2 
do 
    perl -lne 'BEGIN {$d=shift} print "$d: OK" if /hdisk$d\s+/' $d someFile 
done 

ध्यान दें कि इस संदर्भ में shift ऑपरेटर @ARGV के पहले तत्व, जो इस मामले में $d है निकालता है।

+0

यह इंगित करने योग्य है कि @gbacon ने 'cat a | perl -n' से 'perl -n a'। यदि आप perl के पैरामीटर के रूप में फ़ाइल नाम देते हैं तो यह -n लूप के लिए उपलब्ध है। – justintime

0

कि अच्छा लग रहा है, लेकिन मैं का उपयोग करेंगे:

for d in $(seq 1 2); do perl -nle 'print "hdisk$ENV{d} OK" if $_ =~ /hdisk$ENV{d}/' someFile; done 
2

आप मुसीबत एक एक लाइनर लेखन कर रहे हैं, शायद यह एक पंक्ति (सिर्फ मेरी राय) के लिए थोड़ा मुश्किल है। मैं @ एफएम के सुझाव से सहमत हूं और पर्ल में पूरी चीज करता हूं। पूरी फ़ाइल को पढ़ें और उसके बाद परीक्षण करें:

use strict; 
    local $/ = '' ; # Read in the whole file 
    my $file = <> ; 

    for my $d (1 .. 2) 
    { 
     print "$d: OK\n" if $file =~ /hdisk$d\s+/ 
    } 

आप इसे लूपिंग कर सकते हैं, लेकिन यह लंबा होगा। बेशक यह कुछ हद तक फ़ाइल के आकार पर निर्भर करता है।

ध्यान दें कि अब तक सभी पर्ल उदाहरण प्रत्येक मैच के लिए एक संदेश प्रिंट करेंगे - क्या आप सुनिश्चित कर सकते हैं कि कोई डुप्लिकेट नहीं है?

perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d='[value]' [file] 

[value] (यानी 2), एक सीमा के एक नंबर हो सकता है (यानी 2:

0

पहले सुझावों में से कुछ का मेल है और यह करने के लिए अपने ही चीनी जोड़ने, मैं इसे इस तरह से करना चाहते हैं

d='2-3' 
perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d=$d someFile 

और [फ़ाइल: | 3 | 4) (या लगभग कुछ और होगा, तो इस एक वैध पैटर्न) या यहां तक ​​कि एक पार्टी उन में से एक युक्त चर, उदाहरण -4), अलग नंबरों (यानी 2 की एक सूची ] आपका फ़ाइल नाम है (यानी, someFile)।

0

मेरा समाधान थोड़ा अलग है। मैं Google प्रश्न के साथ आपके प्रश्न का शीर्षक आपके प्रश्न पर आया, लेकिन मैं कुछ अलग करने की कोशिश कर रहा हूं। यहां यह किसी मामले में मदद करता है:

एफवाईआई, मैं सोलारिस पर tcsh का उपयोग कर रहा था।

मैं निम्नलिखित एक लाइनर था:

perl -e 'use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*2));' 

जो मूल्य आउटपुट:

2013-05-06 

मैं एक खोल स्क्रिप्ट में इस जगह के लिए तो मैं एक तारीख के साथ एक फ़ाइल बना सकते हैं कोशिश कर रहा था फ़ाइल नाम में, अतीत में एक्स दिनों की संख्या। मैंने कोशिश की:

set dateVariable=`perl -e 'use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*$numberOfDaysPrior));'` 

लेकिन यह परिवर्तनीय प्रतिस्थापन के कारण काम नहीं करता है। मुझे इसे सही तरीके से समझने के लिए उद्धरण के साथ गड़बड़ करनी पड़ी। मैंने डबल कोट्स में पूरे लॉट को घेरने की कोशिश की, लेकिन इसने पर्ल कमांड को वाक्य रचनात्मक रूप से सही नहीं किया, क्योंकि यह डेट प्रारूप के चारों ओर डबल कोट्स के साथ गड़बड़ कर रहा था। मैं के साथ समाप्त हो गया:

set dateVariable=`perl -e "use POSIX qw(strftime); print strftime('%Y-%m-%d', localtime(time()-3600*24*$numberOfDaysPrior));"` 

कौन सा मेरे लिए महान काम किया, किसी भी फैंसी चर निर्यात का सहारा के बिना।

मुझे एहसास है कि यह आपके विशिष्ट प्रश्न का बिल्कुल सही जवाब नहीं देता है, लेकिन यह शीर्षक का उत्तर देता है और किसी और की मदद कर सकता है!

3

कभी कभी ये एक-लाइनर्स के लिए एक अच्छा चाल तोड़ने पर्ल बाड़े जाता है:

for d in 1 2 ; do cat kk2 | perl -lne ' print "'"${d}"': OK" if /hdisk'"${d}"'\s+/';done 
संबंधित मुद्दे