2012-07-02 45 views

Trả lời

299
if grep -q SomeString "$File"; then 
    Some Actions # SomeString was found 
fi 

Bạn không cần [[ ]] tại đây. Chỉ cần chạy lệnh trực tiếp. Thêm tùy chọn -q khi bạn không cần chuỗi hiển thị khi nó được tìm thấy.

Lệnh grep trả về 0 hoặc 1 trong mã thoát tùy thuộc vào kết quả tìm kiếm. 0 nếu một cái gì đó đã được tìm thấy; 1 nếu không.

$ echo hello | grep hi ; echo $? 
1 
$ echo hello | grep he ; echo $? 
hello 
0 
$ echo hello | grep -q he ; echo $? 
0 

Bạn có thể chỉ định các lệnh dưới dạng điều kiện if. Nếu lệnh trả về 0 trong exitcode của nó có nghĩa là điều kiện là đúng; ngược lại.

$ if /bin/true; then echo that is true; fi 
that is true 
$ if /bin/false; then echo that is true; fi 
$ 

Như bạn có thể thấy bạn chạy trực tiếp các chương trình ở đây. Không thêm [] hoặc [[]].

+1

Cảm ơn bạn Kính gửi Igor, Câu trả lời rất hay và hoàn thành ... Tôi đã học được rất nhiều từ bài đăng này. – Hakim

+0

Thông tin thêm về 'grep' và các tùy chọn có sẵn trong http://stackoverflow.com/a/4749368/1702557 – Pawel

+1

có thể muốn xem xét các tham số' -Fxq' như trong http://stackoverflow.com/a/4749368/544721 –

-1
grep -q "something" file 
[[ !? -eq 0 ]] && echo "yes" || echo "no" 
+1

Bạn có lỗi đánh máy -!? được cho là $? – lzap

+0

... không chỉ có ý định là '$?', Nhưng không cần gì cả - bạn chỉ có thể làm 'nếu grep -q ...' –

+0

Hơn nữa, 'foo && truthy_action || falsey_action' không phải là toán tử ternary thực - nếu 'truthy_action' không thành công, thì' falsey_action' được chạy _in addition_. –

0

Shortest (đúng) phiên bản:

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no" 

cũng có thể được viết như

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no" 

nhưng bạn không cần phải kiểm tra nó một cách rõ ràng trong trường hợp này, vì vậy cùng với:

grep -q "something" file && echo "yes" || echo "no" 
+0

'nếu grep -q tệp gì đó; sau đó echo yes; khác echo no; fi'. Không có lý do gì để lộn xộn với '$? '. –

0

Tôi đã làm điều này, có vẻ như hoạt động tốt

if grep $SearchTerm $FileToSearch; then 
    echo "$SearchTerm found OK" 
else 
    echo "$SearchTerm not found" 
fi 
21

Ngoài các câu trả lời khác, đã cho bạn biết cách làm những gì bạn muốn, tôi cố gắng giải thích những gì sai (đó là những gì bạn muốn.

Trong Bash, if sẽ được theo sau bằng lệnh. Nếu mã thoát của lệnh này bằng 0, thì phần then được thực thi, còn phần else nếu có bất kỳ lệnh nào được thực thi.

Bạn có thể làm điều đó với bất kỳ lệnh như được giải thích trong câu trả lời khác: if /bin/true; then ...; fi

[[ là một lệnh bash nội bộ dành riêng cho một số xét nghiệm, giống như sự tồn tại tập tin, so sánh biến. Tương tự như vậy [ là một lệnh bên ngoài (nó nằm trong /usr/bin/[) thực hiện gần như cùng một thử nghiệm nhưng cần ] làm đối số cuối cùng, đó là lý do tại sao ] phải được đệm với một không gian bên trái, không phải là trường hợp với ]].

Ở đây bạn không cần [[ cũng không [.

Một điều khác là cách bạn trích dẫn mọi thứ. Trong bash, chỉ có một trường hợp cặp dấu ngoặc kép làm tổ, nó là "$(command "argument")".Nhưng trong 'grep 'SomeString' $File' bạn chỉ có một từ, bởi vì 'grep ' là đơn vị được trích dẫn, được ghép nối với SomeString và sau đó được nối lại với ' $File'. Biến số $File thậm chí không được thay thế bằng giá trị của nó do việc sử dụng dấu nháy đơn. Cách thích hợp để làm điều đó là grep 'SomeString' "$File".

7
##To check for a particular string in a file 

cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory 
File=YOUR_FILENAME 
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for 
then 
echo "Hooray!!It's available" 
else 
echo "Oops!!Not available" 
fi 
+0

Thay đổi thư mục thường không phải là một ý tưởng hay (và hoàn toàn không cần thiết ở đây, chỉ cần hội đủ điều kiện tên tệp với thư mục đích). Và sau đó những gì bạn có chính xác giống như câu trả lời được chấp nhận, chỉ với ít chi tiết hơn. – Mat

+0

Cảm ơn lời khuyên Mat –

1
if grep -q [string] [filename] 
then 
    [whatever action] 
fi 

Ví dụ

if grep -q 'my cat is in a tree' /tmp/cat.txt 
then 
    mkdir cat 
fi 
3
grep -q [PATTERN] [FILE] && echo $? 

Các trạng thái thoát là 0 (đúng) nếu mô hình đã được tìm thấy;

0

Trong trường hợp bạn muốn checkif chuỗi phù hợp với toàn bộ dòng và nếu nó là một chuỗi cố định, Bạn có thể làm theo cách này

grep -Fxq [String] [filePath] 

dụ

searchString="Hello World" 
file="./test.log" 
if grep -Fxq "$searchString" $file 
    then 
      echo "String found in $file" 
    else 
      echo "String not found in $file" 
fi 

Từ các tập tin người đàn ông:

-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.) 
0

Hãy thử điều này:

if [[ $(grep "SomeString" $File) ]] ; then 
    echo "Found" 
else 
    echo "Not Found" 
fi 
Các vấn đề liên quan