Cách sử dụng grep khi tệp không chứa chuỗi


26

Trong tập lệnh bash của tôi, tôi đang cố in một dòng nếu một chuỗi nhất định không tồn tại trong một tệp.

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

Đây là cách tôi đã viết nó nếu tôi muốn chuỗi tồn tại trong tệp nhưng làm cách nào tôi có thể thay đổi chuỗi này để in "người dùng không tồn tại" nếu không tìm thấy người dùng trong tệp / etc / passwd?

Câu trả lời:


49

grepsẽ trả về thành công nếu nó tìm thấy ít nhất một trường hợp của mẫu và thất bại nếu không. Vì vậy, bạn có thể thêm một elsemệnh đề nếu bạn muốn cả hai bản in "không" và "không" hoặc bạn chỉ có thể phủ nhận ifđiều kiện để chỉ nhận thất bại. Một ví dụ về mỗi:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi

2

Một cách khác là tìm trạng thái thoát của grep. Ví dụ:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

Nếu grepkhông tìm thấy một trận đấu nó sẽ thoát 1, vì vậy $?sẽ 1. grepsẽ luôn trở lại 0nếu thành công. Vì vậy, nó là an toàn để sử dụng $? != 0hơn $? == 1.


đây thực sự chỉ là một cách nói dài hơn những gì Eric nói .
Jeff Schaller

Vâng, đối với tôi, if ! grep ...tuyên bố tiêu cực đã không làm việc. Vì vậy, đây là một thay thế.
ssanch

1

Tôi giải quyết nó với một lót đơn giản:

for f in *.txt; do grep "tasks:" $f || echo $f; done

Lệnh sẽ kiểm tra tất cả các tệp trong thư mục có phần mở rộng txt và ghi chuỗi tìm kiếm (nghĩa là "tác vụ:") nếu tìm thấy hoặc nếu không tên của tệp.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.