2012-02-24 12 views
10

मेरे पास एक स्क्रिप्ट है जो हर बार लगभग 10 लाइनों को आउटपुट करती है। इन लाइनों की सामग्री बदलती है।एक if-statement में पाइप करना संभव है?

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

छद्म में यह मैं

cat /etc/password | \\ 
if [ grep "root" $STDOUT ]; then 
    echo "root is found" 

elif [ grep "nobody" $STDOUT ]; then 
    echo "nobody is found" 

fi 

करना चाहते हैं क्या यहाँ मैं एक उदाहरण के रूप में इस्तेमाल किया cat /etc/password है, लेकिन यह मेरी स्क्रिप्ट जैसा कि ऊपर उल्लेख के साथ प्रतिस्थापित किया जाना चाहिए है।

समस्या यह है कि if/elif स्थितियों में cat /etc/password से आउटपुट को मैं कैसे पकड़ूं?

+1

शायद awk या पर्ल बेहतर अपने कार्य के लिए उपयुक्त हैं .. – bew

+2

इरादा प्रदर्शित या संगत नहीं होने पर 'बिल्ली' का उपयोग न करें। यहां आप केवल grep कमांड लाइन में फ़ाइल दे सकते हैं, क्योंकि यह स्वीकार किया जाता है, अन्यथा आप फ़ाइल ('<') को रीडायरेक्ट कर सकते हैं। – Benoit

+2

आप के बाद लाइन निरंतरता की जरूरत नहीं है '|' '' && और '' || –

उत्तर

5

जैसा कि @ बेनोइट अनुशंसा करता है, बस grep का उपयोग करें।

@larsmans नोट्स के रूप में, आप एक बार एक चर में इसे पढ़कर फ़ाइल के दोहरे पढ़ने से बच सकते हैं।

bash की उपलब्धता को देखते हुए मैं इसे इस तरह करना चाहते हैं: फ़ाइल का

password=$(< /etc/passwd) 

if grep -q root <<< "$password" ; then 
    echo root found 
elif grep -q nobody <<< "$password" ; then 
    echo nobody found 
fi 

एक पढ़ा, grep के एक या दो आमंत्रण, शुरू की किन्हीं अन्य प्रक्रियाओं या subshells।

+0

बहुत ही रोचक समाधान। पहली पंक्ति पर आपके पास 'IFS =' क्यों है? –

+2

बैश में, आप बस कह सकते हैं 'पासवर्ड = $ (

+0

एक अच्छा बिंदु ग्लेन, मैं इस भूल गया था। – Sorpigal

3

तुम बस कार्य करें:

if grep -q "root" /etc/passwd ; then 
    ... 
fi 

... आदेशों चलाए जाएंगे, जो अगर ग्रेप बाहर निकलें कोड 0.

याद रखें कि \[ is a external command, शायद (/usr/bin/[ में स्थित सामान्य रूप से यह test और जब करने के लिए एक हार्ड लिंक है [ के रूप में बुलाया गया यह ] तर्क मिलान करने की आवश्यकता है)। यहां pitfalls पृष्ठ भी देखें, उनमें से कई सौदे उस आदेश से संबंधित हैं।

+1

+1, लेकिन आप '' grep' के उत्पादन को दबाने के लिए जोड़ने के लिए -q' चाहते हो सकता है। – Sorpigal

1

उप-कथन के साथ एक if-statement में पिपिंग संभव है, लेकिन यह समाधान तब टूट जाएगा जब आप पाइप पर दो grep आदेश चला रहे हैं, जिनमें से पहला इसे समाप्त कर देगा।

passwd=$(cat /etc/passwd) 
if (echo $passwd | grep -q root); then 
    echo "root found" 
fi 
if (echo $passwd | grep -q nobody); then 
    echo "nobody found" 
fi 
+0

यह 'आईएफएस = पासवर्ड पढ़ -r -d '' Sorpigal

+0

ठीक है, लेकिन मुझे नहीं लगता कि यह कैसे -1 वारंट करता है। –

+2

यह नहीं करता है। मुझे नहीं पता कि यह किसने किया, लेकिन मैंने अपमान में उलटी गिनती की है। – Sorpigal

3

मैं awk उपयोग करने का सुझाव चाहते हैं::

cat /etc/passwd | awk '/root/{ do something }/nobody/{ do something else }' 

आप में एक ही प्राप्त कर सकते हैं

आपके मामले में सबसे अच्छा समाधान शायद /etc/passwd एक चर में तो grep इसे पढ़ने के लिए, है एक अभिव्यक्ति का उपयोग करके बैश:

cat /etc/passwd | 
while read; do 
    if echo "$REPLY" | fgrep root; then 
    something 
    fi 
    if echo "$REPLY" | fgrep nobody; then 
    something_else 
    fi 
done 

हालांकि शुद्ध बीए sh समाधान बड़े इनपुट के लिए कम कुशल है क्योंकि यह प्रत्येक पंक्ति के लिए grep के अलग-अलग उदाहरण चलाता है।

+0

के लिए धन्यवाद का उपयोग न करें 'इस तरह cat', आप' पारित कर सकते हैं 'awk' के लिए सीधे passwd',' while', आदि .. – Sorpigal

+1

यह सच है, लेकिन अक्सर यह इस तरह से अधिक पठनीय वजह से डेटा स्रोत सामने है, और कुछ दर्जन लाइनों के प्रदर्शन को पार्स करने के लिए वास्तव में कोई मुद्दा नहीं है। इस पैमाने पर यह केवल व्यक्तिगत वरीयता का मामला है और वोट करने का कोई कारण नहीं है। –

0

सामान्य स्थिति में, आप एक अस्थायी फ़ाइल का उपयोग कर सकते हैं।

t=$(mktemp -t passwd.XXXXXXXX) 
trap 'rm $t' 0 
trap 'exit 127' 1 2 3 5 15 
cat >$t 
for u in root nobody; do 
    fgrep $u $t 
done 

trap रों बाद में अस्थायी फ़ाइल को हटाने के लिए कर रहे हैं।

एक अलग रूप में रूप में, आप एक if करने के लिए पाइप, लेकिन पहले grep अपने सशर्त अंदर पहले से ही अपने मानक इनपुट के सभी उपभोग होता कर सकते हैं। यह इस तरह की परिस्थितियों में और अधिक उपयोगी है:

if $option_count ; then 
    wc -l 
else 
    tac 
fi <file 
1

बस & & का उपयोग करें:

grep -q root /etc/password && echo "root is found" 

grep -q nobody /etc/password && echo "nobody is found" 
0

कैसे के बारे में निम्नलिखित:

#!/bin/bash 

if [ -z $1 ]; then 
    echo Usage: $0 [UID to search for] 
    exit 1; 
fi 

SEARCHID="$1" 

function notFound() { 
    echo NOT FOUND 
} 

function found() { 
    echo Found it 
} 

function main() { 

    grep -i $SEARCHID /etc/passwd 
    # Move $? to a variable 
    SEARCHRESULT=$? 

    if [ "$SEARCHRESULT" != "0" ]; then 
     notFound; 
    else 
     found; 
    fi 
} 

# call main function 
main 
संबंधित मुद्दे