Câu trả lời:
Chỉ cần chỉ định các neo regexp.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Từ trang grep man:
-F, --fixed-string
Diễn giải PATTERN dưới dạng (danh sách) các chuỗi cố định
-x, --line-regexp
Chỉ chọn những kết quả khớp chính xác với toàn bộ dòng.
-F
? bạn có ở trên Solaris không? Nếu sử dụng quá/usr/xpg4/bin/grep
grep
bên trong một tập lệnh bash và tùy chọn này tốt hơn là sử dụng một biểu thức chính quy như được đề xuất trong câu trả lời được chấp nhận. Bởi vì tôi có một số ký tự đặc biệt bên trong biến mà tôi đang tìm kiếm (như .
) và tôi không phải thoát chúng khi sử dụng lệnh.
Đây là những gì tôi làm, mặc dù sử dụng neo là cách tốt nhất:
grep -w "ABB.log " a.tmp
ABB.log
đó, không phải là trường hợp chung, tức là nó sẽ thất bại trong hầu hết thời gian.
Hầu hết các đề xuất sẽ không thành công nếu có quá nhiều khoảng trắng ở đầu hoặc cuối, điều này sẽ quan trọng nếu tệp được chỉnh sửa bằng tay. Điều này sẽ làm cho nó ít nhạy cảm hơn trong trường hợp đó:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Một vòng lặp while-read đơn giản trong shell sẽ thực hiện điều này một cách ngầm định:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
tương tự với awk
awk '/^ABB\.log$/' file
Tôi định bổ sung thêm một số giải thích liên quan đến nỗ lực của OP và các câu trả lời khác.
Bạn cũng có thể sử dụng giải pháp của John Kugelmans như thế này:
grep -x "ABB\.log" a.tmp
trích dẫn chuỗi và thoát dấu chấm ( .
) làm cho nó không cần -F
cờ nữa.
Bạn cần phải thoát khỏi .
(dấu chấm) (vì nó khớp với bất kỳ ký tự nào (không chỉ .
) nếu không thoát) hoặc sử dụng -F
cờ với grep. -F
cờ biến nó thành một chuỗi cố định (không phải là regex).
Nếu bạn không trích dẫn chuỗi, bạn có thể cần dấu gạch chéo ngược kép để thoát khỏi dấu chấm ( .
):
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
lực để phù hợp với toàn bộ dòng..
không có -F
cờ là sai.-x
chuyển đổi bằng cách quấn chuỗi mẫu của mình bằng ^
và $
. Trong trường hợp này, hãy đảm bảo rằng bạn không sử dụng -F
, thay vào đó hãy thoát khỏi .
, bởi vì -F
sẽ ngăn việc giải thích regex của ^
và $
.Nếu bạn muốn so khớp một chuỗi bắt đầu bằng -
, thì bạn nên sử dụng --
với grep. Bất cứ điều gì sau đây --
sẽ được lấy làm đầu vào (không phải tùy chọn).
Thí dụ:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-F
sẽ không cần thiết nếu .
thoát đúng cách.
-F
sẵn khi bạn viết điều này không? Nếu không, bạn đang sử dụng hệ thống nào? Tôi không thể tìm thấy thông tin đó trong câu trả lời của bạn cho đến nay, thậm chí bây giờ là trường hợp khi tôi đọc lại nó. Vì vậy, thực sự chắc chắn, tôi đã đọc hoàn toàn câu trả lời của bạn ít nhất hai lần. ;)
-F
là đã có. (Tôi đã nói: "hoặc sử dụng -F
cờ với grep
")
-F
là câu trả lời, tại sao phải bận tâm về việc trốn thoát? Ý kiến của bạn về điều đó là gì?
Điều này hiệu quả với tôi khi cố gắng làm điều gì đó tương tự:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
Làm việc cho tôi :
grep "\bsearch_word\b" text_file > output.txt
\b
chỉ ra / thiết lập ranh giới.
Có vẻ hoạt động khá nhanh
search_word
phân tách bằng ranh giới từ. Ví dụ: nó sẽ khớp với dòng "foo search_word bar".
Đây là với HPUX, nếu nội dung của tệp có khoảng cách giữa các từ, hãy sử dụng tùy chọn này:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
Tôi muốn:
str="ABB.log"; grep -E "^${str}$" a.tmp
hoan hô
ABBxlog
Tôi cần tính năng này, nhưng cũng muốn đảm bảo rằng tôi không trả về các dòng có tiền tố trước ABB.log:
grep "\WABB.log$" -w a.tmp
\W
được thỏa mãn, là bất kỳ ký tự nào không có khoảng trắng, vì vậy xABBxlog
.