grep: hiển thị tất cả đầu ra nhưng làm nổi bật các kết quả tìm kiếm


38

trong bash, nếu tôi muốn thực thi một lệnh và chỉ hiển thị các dòng đầu ra khớp với một mẫu nhất định, tôi có thể chuyển nó sang grep, như

tệp thử nghiệm

hello
there
my
friends

chỉ huy

$ cat testfile | grep 'hello'
hello #this will be highlightd

điều này sẽ làm nổi bật trận đấu tìm kiếm và hiển thị toàn bộ dòng nó rơi vào. Tôi có thể sử dụng -A-Bđể hiển thị các dòng trước và sau dòng đó. Câu hỏi của tôi là có thể thực thi lệnh và hiển thị tất cả đầu ra như bình thường, nhưng để làm nổi bật các kết quả tìm kiếm như grep sẽ không? vì vậy, thông số của tôi sẽ là

hello #highlighted
there
my
friends

Câu trả lời:


38

Để sử dụng GRE màu để chỉ làm nổi bật các mẫu phù hợp nhưng không thay đổi đầu ra:

grep --color=always -e "^" -e "hello" testfile

Mẫu đầu tiên sẽ khớp với tất cả các dòng (tất cả các dòng sẽ được in) mẫu thứ hai (và bất kỳ mẫu nào sau đây) làm cho văn bản phù hợp được tô sáng màu.

Vì mẫu đầu tiên khớp với tất cả các dòng nhưng không khớp với ký tự có thể in được, nên nó không thêm bất kỳ tô sáng màu nào để nó không cạnh tranh / cản trở khả năng đọc của văn bản được tô sáng.


Hoạt động với kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"trong zsh
Michael Cole

Để sử dụng trong Bash: highlight () {grep --color = always -e "^" -e $ *; }
Jon

Điều này cũng hoạt động trên FreeBSD, bạn chỉ cần trao đổi người thứ nhất và người thứ hai ( "^"cần phải là người thứ hai).
Marián Černý

25

Thêm tùy chọn -zcho lệnh GNU grep của bạn:

cat testfile | grep --color=always -z 'hello'

hoặc ngắn hơn

grep --color=always -z 'hello' testfile

3
Đây là một hack rất thô. Nó có tác dụng coi toàn bộ tập tin là một dòng duy nhất. Do đó, (1) nếu tệp rất lớn, có thể có khả năng hết bộ nhớ và (2) nếu tệp không chứa mẫu nào cả , thì sẽ không có gì xuất ra.
G-Man nói 'Phục hồi Monica'

Phiên bản grep này được hỗ trợ trên? Trên grep 2.5.4, -z dường như không có sẵn ...
Alex

@Alex: Tôi đã sử dụng GNU grep phiên bản 2.6.3.
Cyrus

2
@ G-Man: tiết kiệm tài nguyên hơn:grep --color "hello\|$" file
Cyrus

@Cyrus: Vâng, đó là một câu trả lời tốt hơn. Thật không may, về cơ bản nó tương đương với câu trả lời của bot779 cho câu hỏi này và gần giống với câu trả lời được chấp nhận ( 12 ) cho các câu hỏi tôi liên kết đến.
G-Man nói 'Phục hồi Monica'

3

Tương tự như câu trả lời trước, bạn có thể bắt tất cả $các dòng cuối:

cat testfile | grep --color -E "hello|$"

-E(hoặc --extended-regexp) có nghĩa là các ký tự đặc biệt phải được thoát với \. Khi sử dụng nó, |sẽ được coi là điều kiện "HOẶC" regex.

Grep |$cũng sẽ bắt và in tất cả các dòng có kết thúc, nhưng vì $ là một ký tự ẩn, nên nó không thể được tô sáng.

Cập nhật:

Nếu bạn muốn in tất cả đầu ra, nhưng cũng trả về mã thoát , cho dù có tìm thấy kết quả khớp hay không, bạn có thể sử dụng lệnh perl:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Nếu bạn thích sed - Dưới đây là một ví dụ về cách làm nổi bật tất cả các trận đấu + trả lại mã thoát nếu không tìm thấy kết quả trùng khớp: https://askubfox.com/a/1200851/670392


2

Cái này hoạt động với GNU grep cũng như với grep trên FreeBSD:

grep --color=always 'hello\|$'

Nó khớp với văn bản "xin chào" hoặc ( \|) chuỗi null không in được ở cuối mỗi dòng ( $). Đó là lý do tại sao mỗi dòng được in nhưng chỉ "xin chào" được tô sáng.

Có thể bạn đã --color=autocấu hình trong vỏ của mình. Sau đó, rất có thể bạn không cần chỉ định --color=always:

grep 'hello\|$'

Bạn cũng có thể đơn giản hóa phiên bản bằng cách sử dụng egrep(với các biểu thức chính quy mở rộng), trong đó |biểu thức "hoặc" không cần phải thoát:

egrep 'hello|$'

Điều này không trả lời làm thế nào để hiển thị tất cả các dòng đầu vào.
Chris Trang

@ChrisPage Tôi sẽ nói rằng: Đó là lý do tại sao mỗi dòng được in nhưng chỉ "xin chào" được tô sáng.
Marián Černý

0

Thêm vào câu trả lời hàng đầu ở trên. Hàm {} nổi bật được đề cập trong các nhận xét chỉ hoạt động khi dữ liệu được dẫn vào nó. Các bí danh sau, trong khi không hoàn hảo, sẽ hữu ích hơn:

alias greph="grep --color=always -e^ -e"

Điều này hoạt động với các lệnh như:

greph foo bar.txt

cat bar.txt | greph foo
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.