grep cho các ký tự đặc biệt trong Unix


94

Tôi có một tệp nhật ký (application.log) có thể chứa chuỗi ký tự bình thường và đặc biệt sau trên nhiều dòng:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

Tôi muốn tìm kiếm (các) số dòng chứa chuỗi ký tự đặc biệt này.

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Lệnh trên không trả về bất kỳ kết quả nào.

Cú pháp chính xác để lấy số dòng là gì?


^@: có nghĩa là ^theo sau @hoặc ký tự nul?
Nahuel Fouilleul

Câu trả lời:


157

Yêu cầu grepcoi đầu vào của bạn là chuỗi cố định bằng cách sử dụng -Ftùy chọn.

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Cần có tùy chọn -nđể lấy số dòng,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
Tùy theo phiên bản của grep bạn chỉ cần thoát (với một dấu chéo ngược) ^, $, ., *\ . hoặc bạn cũng có thể thử fgrep.
Nahuel Fouilleul

2
@NahuelFouilleul: +1. btw, fgrepgiống như grep -F.
Hoàng tử John Wesley

@PrinceJohnWesley: đó là giống nhau nhưng trên một số hệ thống có rất nhiều phiên bản của grep để sử dụng fgrep có thể tìm thấy phiên bản mà hỗ trợ -F
Nahuel Fouilleul

Nếu anh ta sử dụng egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.logthì sao?
inckka

Không hoạt động. grep -rinF '-static'bản in Invalid option «t». Câu trả lời của @ Mani đã hoạt động , tức là grep -rin "\-static".
Hi-Angel,

92

Một trong những hiệu quả cho tôi là:

grep -e '->'

-E có nghĩa là đối số tiếp theo là mẫu và sẽ không được hiểu là đối số.

Từ: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... kHÔNG lÀM vIỆC, những gì làm việc cho bạn không có đủ ký tự đặc biệt bên cạnh dấu hiệu tắc '-', nhưng chiến thắng -F thay vì -e là lÀM vIỆC!
THESorcerer

1
Điều duy nhất hoạt động với tôi, ngay cả '\' hoặc -F hoặc fgrep không hoạt động. Cảm ơn!
user180574

2
Đây phải là câu trả lời được chấp nhận - đơn giản và hiệu quả đối với grep
Ishay Peled 12/1218

1
Đã thử -F và fgrep không hoạt động đối với tôi khi tìm kiếm một chuỗi bao gồm ký tự '-'. Những công việc này.
世界 知名 伟人

Tôi tự hỏi tại sao câu trả lời này lại xuất hiện trong câu hỏi này ( stackoverflow.com/q/12387685 để tham khảo phần Hỏi & Đáp mà tôi hiện đang xem) - có thể là một trường hợp sai câu trả lời được hợp nhất từ ​​một câu hỏi khác? Để tìm kiếm các mẫu bắt đầu -, hãy xem thêm stackoverflow.com/questions/2427913/…
Sundeep

6

Một ghi chú liên quan

Để ghi xuống dòng, cụ thể là \rký tự hoặc 0x0d, chúng ta có thể thực hiện điều này:

grep -F $'\r' application.log

Ngoài ra, sử dụng printfhoặc echođể tương thích với POSIX

grep -F "$(printf '\r')" application.log

Và chúng ta có thể sử dụng hexdumphoặc lessđể xem kết quả:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

Về việc sử dụng $'\r'và các ký tự được hỗ trợ khác, hãy xem Hướng dẫn sử dụng Bash> Trích dẫn ANSI-C :

Các từ có dạng $ 'string' được xử lý đặc biệt. Từ mở rộng thành chuỗi, với các ký tự thoát ra sau dấu gạch chéo ngược được thay thế như được chỉ định bởi tiêu chuẩn ANSI C


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

Bạn có thể thử xóa bất kỳ ký tự chữ và số và khoảng trắng nào. Và sau đó sử dụng -nsẽ cung cấp cho bạn số dòng. Hãy thử sau:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


Cảm ơn .. Thật tốt cho tôi khi tìm thấy các ký tự đặc biệt từ một tệp.
Dipankar Nalui

-4

Hãy thử vi với tùy chọn -b, tùy chọn này sẽ hiển thị các ký tự đặc biệt ở cuối dòng (tôi thường sử dụng nó để xem kết thúc dòng của windows trong tệp txt trên hệ điều hành unix)

Nhưng nếu bạn muốn một giải pháp theo tập lệnh, rõ ràng là vi sẽ không hoạt động, vì vậy bạn có thể thử các tùy chọn -f hoặc -e với grep và chuyển kết quả thành sed hoặc awk. Từ trang grep man:

Lựa chọn đối sánh -E, --extended-regexp Diễn giải PATTERN dưới dạng biểu thức chính quy mở rộng (ERE, xem bên dưới). (-E được chỉ định bởi POSIX.)

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

2
Theo cách nào thì câu trả lời này tốt hơn một câu trả lời được chấp nhận nên bạn đã thêm nó vào câu hỏi gần 5 tuổi?
SergGr
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.