एक चर पर 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.