एक चर पर grep


58

मान लीजिए कि मेरे पास एक चर है

line="This is where we select from a table."

अब मैं यह बताना चाहता हूं कि वाक्य में कितनी बार चयन होता है।

grep -ci "select" $line

मैंने वो कोशिश की, लेकिन बात नहीं बनी। मैंने भी कोशिश की

grep -ci "select" "$line"

यह अभी भी काम नहीं करता है। मुझे निम्नलिखित त्रुटि मिलती है।

grep: This is where we select from a table.: No such file or directory

1
आपको हेस्टिंग्रिंग का उपयोग करने की आवश्यकता है ...<<<"$line" । कमांड grepइसके बजाय एक फ़ाइल की उम्मीद कर रही है
— वैलेंटाइन बजरमी

जवाबों:


85

है grepइसके मानक इनपुट पर पढ़ें। वहाँ तुम जाओ, एक पाइप का उपयोग कर ...

$ echo "$line" | grep select

... या यहाँ एक स्ट्रिंग ...

$ grep select <<< "$line"

इसके अलावा, आप टटोलने से पहले रिक्त स्थान को नए सिरे से बदलना चाहते हैं:

$ echo "$line" | tr ' ' '\n' | grep select

... या आप grepकेवल मैच प्रिंट करने के लिए कह सकते हैं :

$ echo "$line" | grep -o select

यह आपको एक मैच होने पर बाकी लाइन से छुटकारा पाने की अनुमति देगा।

संपादित करें: उफ़, थोड़ा बहुत तेजी से पढ़ें, धन्यवाद मार्को । घटनाओं को गिनने के लिए, इनमें से किसी को भी पाइप करें wc(1);)

एक और संपादन के बाद lzkata की टिप्पणी, $lineका उपयोग करते हुए उद्धृत echo।


3
चूंकि ओपी एक स्ट्रिंग की घटनाओं की संख्या को गिनना चाहता है जिसे आप wcकार्य पूरा करने के लिए जोड़ सकते हैं :grep -o <string> <<< "$variable" | wc -l
— मार्को

2
का प्रयोग करें echo "$line"बजाय साथ लोगों को बनाने की मौजूदा नई-पंक्तियों को बचाने के लियेtr
— Izkata

यहाँ एक स्ट्रिंग की उपलब्धता क्या है? क्या इसे बैश या किसी अन्य शेल की आवश्यकता है?

विकीपीडिया के अनुसार , यहाँ स्ट्रश, ksh और zsh में उपलब्ध हैं (लेकिन मैं यह मान रहा हूँ कि अन्य भी हो सकते हैं)।
— जॉन डब्ल्यूएच स्मिथ

7
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

आप grepइस तरह के एक साधारण बात के लिए फोन करने की जरूरत नहीं है।

या एक समारोह के रूप में:

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

इसमें 2 या 3 args लगते हैं। इससे अधिक प्रदान करना इसके परिणामों को कम करेगा। आप इसका उपयोग कर सकते हैं जैसे:

_occur=0; occur ... . 2 && echo "count: $_occur"

... जो की घटना गिनती प्रिंट .में ...अगर यह होता है तो कम से कम 2 बार। ऐशे ही:

count: 3

यदि $_occurया तो खाली है या unsetजब इसे लागू किया जाता है तो यह कम समय में कोई भी शेल चर और return1 को प्रभावित नहीं करेगा । या, यदि केवल दो आर्ग के साथ कहा जाता है, तो यह केवल 1 होगा यदि अंदर नहीं है । और यह रिटर्न 0।"$2""$1""$3"return"$2""$1"

और इसलिए, अपने सरलतम रूप में, आप यह कर सकते हैं:

occur '' . && echo yay || echo shite

... जो प्रिंट करता है ...

shite

...परंतु...

occur . . && echo yay || echo shite

... छपेगा ...

yay

आप इसे थोड़ा अलग तरीके से लिख सकते हैं और उद्धरण और कथन $2दोनों में उद्धरणों को छोड़ सकते हैं । यदि आप ऐसा करते हैं तो आप मैच टेस्ट के लिए मैचों के लिए शेल ग्लब्स का उपयोग कर सकते हैं ।(*"$2"*)"${1#*"$2"}"sh[io]te


1
+1: तेज़, वास्तव में। में काम करता है bashऔर dash/ sh(और शायद कुछ अन्य)।
— जॉन डब्ल्यूएच

@ जॉनहोमस्मिथ - संपादन बेहतर है, लेकिन फिर भी सिर्फ पोर्टेबल है।
— 24
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.