मेरे पास एक फ़ाइल है जिसमें निर्देशिका नाम हैं:
my_list.txt
:
/tmp
/var/tmp
यदि मैं उस नाम को पहले से फ़ाइल में मौजूद है, तो मैं निर्देशिका नाम जोड़ने से पहले बैश में जाँच करना चाहूँगा।
मेरे पास एक फ़ाइल है जिसमें निर्देशिका नाम हैं:
my_list.txt
:
/tmp
/var/tmp
यदि मैं उस नाम को पहले से फ़ाइल में मौजूद है, तो मैं निर्देशिका नाम जोड़ने से पहले बैश में जाँच करना चाहूँगा।
जवाबों:
grep -Fxq "$FILENAME" my_list.txt
बाहर निकलने की स्थिति 0 (सत्य) है यदि नाम मिला, 1 (झूठा) यदि नहीं, तो:
if grep -Fxq "$FILENAME" my_list.txt
then
# code if found
else
# code if not found
fi
इसके लिए मैन पेजgrep
के संबंधित अनुभाग इस प्रकार हैं :
grep [options] PATTERN [FILE...]
-F
,--fixed-strings
PATTERN को निश्चित स्ट्रिंग्स की एक सूची के रूप में व्याख्या करें, जिसे नई सूचियों द्वारा अलग किया गया है, जिनमें से किसी का मिलान किया जाना है।
-x
,--line-regexp
केवल उन मैचों का चयन करें जो पूरी लाइन से मेल खाते हों।
-q
,--quiet
,--silent
चुप; मानक आउटपुट के लिए कुछ भी न लिखें। यदि कोई त्रुटि मिली है, तो भी शून्य स्थिति के साथ तुरंत बाहर निकलें।
-s
या--no-messages
विकल्प भी देखें ।
जैसा कि टिप्पणियों में सही ढंग से कहा गया है, उपरोक्त दृष्टिकोण चुपचाप त्रुटि मामलों का इलाज करता है जैसे कि स्ट्रिंग पाया गया था। यदि आप त्रुटियों को अलग तरीके से संभालना चाहते हैं, तो आपको -q
विकल्प को छोड़ना होगा , और बाहर निकलने की स्थिति के आधार पर त्रुटियों का पता लगाना होगा:
आम तौर पर, बाहर निकलने की स्थिति 0 है यदि चयनित लाइनें पाई जाती हैं और 1 अन्यथा। लेकिन बाहर निकलने स्थिति 2 है अगर, कोई त्रुटि हुई है, जब तक
-q
या--quiet
या--silent
विकल्प प्रयोग किया जाता है और एक चयनित लाइन पाया जाता है। हालांकि, ध्यान दें कि POSIX केवल जनादेश, जैसे कार्यक्रमों के लिएgrep
,cmp
है, औरdiff
, कि गलती की स्थिति में बाहर निकलने का दर्जा 1 से अधिक होना; इसलिए यह उचित है, पोर्टेबिलिटी के लिए, तर्क का उपयोग करने के लिए जो कि 2 के साथ सख्त समानता के बजाय इस सामान्य स्थिति के लिए परीक्षण करता है।
सामान्य आउटपुट को दबाने के लिए grep
, आप इसे रीडायरेक्ट कर सकते हैं /dev/null
। ध्यान दें कि मानक त्रुटि अप्रत्यक्ष रूप से बनी हुई है, इसलिए जो भी त्रुटि संदेश grep
प्रिंट हो सकते हैं वे कंसोल पर समाप्त हो जाएंगे जैसा कि आप चाहते हैं।
तीन मामलों को संभालने के लिए, हम एक case
बयान का उपयोग कर सकते हैं :
case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
0)
# code if found
;;
1)
# code if not found
;;
*)
# code if an error occurred
;;
esac
$?
। आप if
स्टेटमेंट के साथ grep कमांड का उपयोग भी कर सकते हैं (जैसा कि अद्यतन उत्तर में दिखाया गया है)।
grep -Fqx "$FILENAME"
और आपको चर सामग्री में regex वर्णों के बारे में चिंता करने की आवश्यकता नहीं है और आपको उन्हें खोज स्ट्रिंग में उपयोग करने की आवश्यकता नहीं होगी।
-q / --silent
क्या इसकी जरूरत है? इसके गलत तरीके से "ऑल गुड" को एक त्रुटि होने पर भी कोसने के लिए कहता है। अगर मुझे वह सही ढंग से मिल गया। इस मामले के लिए एक दोषपूर्ण अवधारणा लगता है।
निम्नलिखित समाधान के बारे में:
grep -Fxq "$FILENAME" my_list.txt
यदि आप सोच रहे हैं (जैसा मैंने किया) -Fxq
सादे अंग्रेजी में क्या मतलब है:
F
: प्रभावित करता है कि कैसे PATTERN की व्याख्या की जाती है (एक रेगेक्स के बजाय निश्चित स्ट्रिंग)x
: पूरी लाइन का मिलान करेंq
: Shhhhh ... न्यूनतम मुद्रणमैन फाइल से:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
(-F is specified by POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line. (-x is specified by POSIX.)
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immediately with zero status if any match is
found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by
POSIX.)
मेरे दिमाग में तीन तरीके:
1) एक मार्ग में एक नाम के लिए लघु परीक्षण (मुझे यकीन नहीं है कि यह आपका मामला हो सकता है)
ls -a "path" | grep "name"
2) एक फ़ाइल में एक स्ट्रिंग के लिए लघु परीक्षण
grep -R "string" "filepath"
3) regex का उपयोग कर लंबे बैश स्क्रिप्ट:
#!/bin/bash
declare file="content.txt"
declare regex="\s+string\s+"
declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
then
echo "found"
else
echo "not found"
fi
exit
यदि आप किसी भी पुटी पर रेगेक्स को बदलते हुए उदाहरण के लिए लूप का उपयोग करते हुए फाइल कंटेंट पर कई स्ट्रिंग का परीक्षण करना है तो यह जल्दी हो जाना चाहिए ।
सरल तरीका:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
युक्ति: /dev/null
यदि आप कमांड के बाहर निकलने की स्थिति चाहते हैं, तो भेजें , लेकिन आउटपुट नहीं।
-q
जो उपयोग के रूप में ही है --quiet
:)
-q
यहां भी सबसे अच्छे उत्तर पर सहमति दें , और चौथे स्थान पर है। इस दुनिया में कोई न्याय नहीं।
सबसे सरल और सरल तरीका होगा:
isInFile=$(cat file.txt | grep -c "string")
if [ $isInFile -eq 0 ]; then
#string not contained in file
else
#string is in file at least once
fi
grep -c फ़ाइल में स्ट्रिंग कितनी बार होती है, की गिनती लौटाएगा।
अगर मैंने आपके सवाल को सही ढंग से समझा, तो आपको वही करना चाहिए जो आपको चाहिए।
एक पंक्ति में :check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
grep -q
सीधे grep का उपयोग और कॉल कर सकते हैं जैसा if
कि थॉमस उसके जवाब में करता है। इसके अलावा, इस सवाल में यह जाँच शामिल नहीं थी कि सूची में जोड़ने से पहले निर्देशिका मौजूद है (यह हटाए गए निर्देशिकाओं की सूची हो सकती है, आखिरकार)।
grep -E "(string)" /path/to/file || echo "no match found"
-ई विकल्प बनाता है grep नियमित अभिव्यक्ति का उपयोग करें
@ थॉमस के समाधान ने किसी कारण से मेरे लिए काम नहीं किया, लेकिन मेरे पास विशेष पात्रों और व्हाट्सएप के साथ लंबे समय तक स्ट्रिंग थी, इसलिए मैंने बस इसके लिए मापदंडों को बदल दिया:
if grep -Fxq 'string you want to find' "/path/to/file"; then
echo "Found"
else
echo "Not found"
fi
आशा है कि यह किसी की मदद करता है
एक grep- कम समाधान, मेरे लिए काम करता है:
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It's there!"
else
echo "its not there"
fi
के आधार पर: https://stackoverflow.com/a/229606/3306354
grep -q
में वर्णित सबसे कुशल दृष्टिकोण है।
grep -Fxq "String to be found" | ls -a