Câu trả lời:
grep -Fxq "$FILENAME" my_list.txt
Trạng thái thoát là 0 (đúng) nếu tên được tìm thấy, 1 (sai) nếu không, vì vậy:
if grep -Fxq "$FILENAME" my_list.txt
then
# code if found
else
# code if not found
fi
Dưới đây là các phần có liên quan của trang man chogrep
:
grep [options] PATTERN [FILE...]
-F
,--fixed-strings
Giải thích MẪU như một danh sách các chuỗi cố định, được phân tách bằng các dòng mới, bất kỳ chuỗi nào sẽ được khớp.
-x
,--line-regexp
Chỉ chọn những trận đấu khớp chính xác với toàn bộ dòng.
-q
,--quiet
,--silent
Yên tĩnh; không ghi bất cứ điều gì vào đầu ra tiêu chuẩn. Thoát ngay lập tức với trạng thái 0 nếu tìm thấy bất kỳ kết quả khớp nào, ngay cả khi phát hiện ra lỗi. Cũng xem tùy chọn
-s
hoặc--no-messages
.
Như đã chỉ ra một cách đúng đắn trong các ý kiến, cách tiếp cận trên âm thầm xử lý các trường hợp lỗi như thể tìm thấy chuỗi. Nếu bạn muốn xử lý lỗi theo một cách khác, bạn sẽ phải bỏ qua -q
tùy chọn và phát hiện lỗi dựa trên trạng thái thoát:
Thông thường, trạng thái thoát là 0 nếu các dòng được chọn được tìm thấy và 1 nếu không. Nhưng trạng thái thoát là 2 nếu xảy ra lỗi, trừ khi
-q
hoặc--quiet
hoặc--silent
tùy chọn được sử dụng và tìm thấy một dòng được chọn. Lưu ý, tuy nhiên, POSIX chỉ nhiệm vụ, đối với các chương trình nhưgrep
,cmp
vàdiff
, rằng trạng thái thoát trong trường hợp lỗi lớn hơn 1; do đó, vì lợi ích của tính di động, nên sử dụng logic kiểm tra điều kiện chung này thay vì bình đẳng nghiêm ngặt với 2.
Để chặn đầu ra bình thường từ grep
, bạn có thể chuyển hướng nó đến /dev/null
. Lưu ý rằng lỗi tiêu chuẩn vẫn không bị ảnh hưởng, do đó, bất kỳ thông báo lỗi nào grep
có thể in sẽ kết thúc trên bảng điều khiển như bạn có thể muốn.
Để xử lý ba trường hợp, chúng ta có thể sử dụng một case
tuyên bố:
case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
0)
# code if found
;;
1)
# code if not found
;;
*)
# code if an error occurred
;;
esac
$?
. bạn cũng có thể sử dụng lệnh grep bên cạnh if
câu lệnh (như thể hiện trong câu trả lời được cập nhật).
grep -Fqx "$FILENAME"
và bạn không phải lo lắng về các ký tự regex trong nội dung biến và bạn sẽ không phải sử dụng chúng trong chuỗi tìm kiếm.
-q / --silent
được nó là cần thiết? Nó nói sai "tất cả tốt" cho bash ngay cả khi có lỗi xảy ra. Nếu tôi hiểu điều đó một cách chính xác. Có vẻ là một khái niệm thiếu sót cho trường hợp này.
Về giải pháp sau:
grep -Fxq "$FILENAME" my_list.txt
Trong trường hợp bạn đang tự hỏi (như tôi đã làm) -Fxq
có nghĩa là gì trong tiếng Anh đơn giản:
F
: Ảnh hưởng đến cách THỰC HIỆN được diễn giải (chuỗi cố định thay vì biểu thức chính quy)x
: Khớp toàn bộ dòngq
: Shhhhh ... in tối thiểuTừ 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.)
Ba phương pháp trong tâm trí tôi:
1) Kiểm tra ngắn cho một tên trong một đường dẫn (Tôi không chắc đây có thể là trường hợp của bạn)
ls -a "path" | grep "name"
2) Kiểm tra ngắn cho một chuỗi trong một tệp
grep -R "string" "filepath"
3) Tập lệnh bash dài hơn bằng 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
Điều này sẽ nhanh hơn nếu bạn phải kiểm tra nhiều chuỗi trên một nội dung tệp bằng cách sử dụng một vòng lặp, ví dụ như thay đổi regex tại bất kỳ cicle nào.
Cách đơn giản hơn:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
Mẹo: gửi đến /dev/null
nếu bạn muốn trạng thái thoát lệnh, nhưng không xuất ra.
-q
giống như --quiet
:)
-q
câu trả lời tốt nhất ở đây, và là vị trí thứ tư. không có công lý trong thế giới này.
Cách dễ nhất và đơn giản nhất sẽ là:
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 sẽ trả về số lần chuỗi xảy ra trong tệp.
Nếu tôi hiểu chính xác câu hỏi của bạn, điều này sẽ làm những gì bạn cần.
Trong một dòng :check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
grep -q
và gọi grep trực tiếp từ if
câu trả lời của Thomas. Ngoài ra, câu hỏi không bao gồm kiểm tra xem thư mục có tồn tại hay không trước khi thêm nó vào danh sách (rốt cuộc đó có thể là danh sách các thư mục bị xóa).
grep -E "(string)" /path/to/file || echo "no match found"
Tùy chọn -E làm cho grep sử dụng các biểu thức thông thường
Giải pháp của @ Thomas không hoạt động với tôi vì một số lý do nhưng tôi có chuỗi dài hơn với các ký tự và khoảng trắng đặc biệt nên tôi chỉ thay đổi các tham số như thế này:
if grep -Fxq 'string you want to find' "/path/to/file"; then
echo "Found"
else
echo "Not found"
fi
Hy vọng nó sẽ giúp được ai đó
Một giải pháp ít grep, hoạt động với tôi:
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
grep -q
mô tả trong câu trả lời được chấp nhận là cách tiếp cận hiệu quả nhất.
grep -Fxq "String to be found" | ls -a
ls
chấp nhận đầu vào tiêu chuẩn?