Làm cách nào tôi có thể đánh dấu các kết quả khớp bằng GNU grep?


18

Tôi đã thấy trên một số Linux, grepđược cấu hình để làm nổi bật sự trùng khớp và in tệp phù hợp.

Làm thế nào tôi có thể cấu hình grepđể làm nổi bật các trận đấu?

Câu trả lời:


10
alias cgrep='grep -nR --color'

Sử dụng:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

Cũng là một trong những mục yêu thích của tôi:

$ pgrep some-hanging-process

sẽ liệt kê tất cả các giá trị của các quy trình khớp với tên của quy trình treo mà bạn có thể sử dụng trong tình huống sau:

$ kill $(pgrep some-hanging-process)

12
có lệnh pkill cho người cuối cùng
diega

1
Với các phiên bản gần đây của GNU grep, grep -rthường nên được ưu tiên hơn grep -Rvì phiên bản trước không đi qua các liên kết tượng trưng.
Stéphane Chazelas

19

Tôi đã thấy rằng cách tốt nhất để gimp grep là sử dụng ack , về cơ bản là grep đệ quy với danh sách bỏ qua thông minh (ví dụ: không tìm kiếm thư mục .svn, bỏ qua các tệp sao lưu, v.v.), tô sáng màu của kết quả và reglps perl. Đó là những gì bạn muốn grep làm 98,6% thời gian.


5
+1 để đề cập đến ack. Đừng quên bao gồm tùy chọn --pager = "less -R" để duy trì tô sáng cho kết quả được phân trang. Cũng có thể đáng nói rằng trên Ubuntu, nó được gọi là "ack-grep" kể từ khi "ack" được sử dụng.
Shawn Chin

Tôi cũng sử dụng ack, nhưng đôi khi bạn không có sẵn ..
elmarco

2
Vì ack chỉ là một tập lệnh perl, bạn có thể làm cho nó có sẵn ở bất cứ nơi nào bạn đã cài đặt perl, đây không phải là một thanh cao.
Kai

Ack tốt cho các mặc định bên ngoài của nó, nhưng trong thời gian bạn cần cài đặt ack, bạn có thể đã định cấu hình một số mặc định cho grep - xem câu trả lời của tôi ở đâu đó trên trang này. Tôi đã làm điều này một lần vào những năm 1980, và kể từ đó grep đã làm mọi thứ mà ack làm. (chỉ grep thực sự nhanh hơn, mặc dù yêu cầu lớn của ack ngược lại)
Jonathan Hartley

7

Tôi đặt cái này trong .bashrc, thay vì xác định lại grep bằng bí danh:

    export GREP_OPTIONS="--color=auto"

Đối với tôi, điều này hoạt động trên Linux, MacOSX & FreeBSD.


GREP_OPTIONSnên được coi là có hại. Tôi khuyên bạn nên sử dụng aliasthay thế. Xem ở đây: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Tôi đồng ý rằng GREP_OPTIONS có thể là một vấn đề trong một số tập lệnh nhất định. Nhưng như tôi đã tranh luận trong lỗi 67141 , GREP_OPTIONS cho phép người dùng đặt một tùy chọn cho nhiều dạng grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep, v.v.), trong khi đó một bí danh sẽ cần được đặt cho mọi dạng của * grep và có nhiều loại grep.
Stefan Lasiewski

Tôi đã từng sử dụng GREP_OPTIONS trong nhiều năm (nay, nhiều thập kỷ) nhưng tác hại mà nó gây ra là rất thật. Bất kỳ công cụ nào gọi grep với bộ var env này sẽ kế thừa hành vi mặc định đã sửa đổi của bạn và điều này S break phá vỡ các công cụ đó. Thay vào đó, tránh hoàn toàn vấn đề này bằng cách xác định bí danh hoặc tập lệnh trình bao bọc thực thi.
Jonathan Hartley

Kịch bản phải vệ sinh môi trường của họ. Không có ifs, buts, hoặc tuy nhiên được phép. Giai đoạn. (Vâng, đó là một nỗi đau của hoàng gia ở lưng dưới ...).
vonbrand

3

Tôi khuyên bạn nên tránh biến môi trường GREP_OPTIONS, nó sẽ ảnh hưởng đến mọi lệnh gọi của grep, ngay cả những biến được nhúng trong các công cụ khác. Nếu những công cụ đó mong đợi grep hành xử theo một cách và bạn thay đổi hành vi đó, nó sẽ và phá vỡ những công cụ đó.

Thay vào đó, bạn có thể tạo một bí danh, hoạt động tốt. Điều này sẽ chỉ ảnh hưởng đến các cuộc gọi đến grep từ vỏ tương tác của bạn (tức là bạn tự nhập).

Tùy chọn cuối cùng, mà tôi thích nhất, là tạo một tập lệnh bao bọc gọi grep. Tôi thích điều này hơn một bí danh, bởi vì tôi có thể gọi trình bao bọc này từ các chương trình khác. Ví dụ: trong vim bằng cách đặt vimgrep, để các tìm kiếm của tôi từ bên trong vim hoạt động giống hệt với các tìm kiếm tại dòng lệnh.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Gọi điều này bằng cách sử dụng:

$ grp pattern dir

ví dụ

$ grp pattern .

sẽ tìm kiếm các phiên bản của 'mẫu' trong tất cả các tệp văn bản trong thư mục và thư mục con hiện tại.

Lưu ý rằng tôi gọi tập lệnh của mình là 'grp', thay vì đổ bóng 'grep', để tôi luôn nhận thức được liệu tôi có gọi grep với mặc định tùy chỉnh của mình hay không.

Theo mặc định, tôi bao gồm:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Tôi nghĩ rằng mọi người đều muốn bỏ qua các thư mục kiểm soát nguồn: .hg .git .bzr .svn

Bỏ qua 'build' và 'dist' là Python-isms và có lẽ không áp dụng cho hầu hết mọi người. Không còn nghi ngờ gì nữa, bạn sẽ phát triển những đặc điểm riêng khi bạn làm việc.

'tags' là đầu ra của ctags, mà tôi sử dụng cho 'đi đến định nghĩa hàm' và tương tự trong các công cụ như vim. Do đó, nó chứa ít nhất một bản sao của mỗi từ và ký hiệu từ mã nguồn của tôi, vì vậy nó đáng để bỏ qua kết quả tìm kiếm của bạn.

"$ *" ở cuối là cú pháp bash cho "và tất cả các thông số khác từ dòng lệnh", vì vậy bạn có thể chuyển vào mẫu và thư mục để tìm kiếm như bình thường và ghi đè bất kỳ cờ dòng lệnh nào khác mà bạn muốn .


2

Các --colortùy chọn đã được đã được đề cập nhiều lần, nhưng tôi muốn thêm rằng nó có thể cấu hình màu, trong đó các trận đấu sẽ được đánh dấu bằng một biến môi trường

export GREP_COLOR="1;33"

Màu sắc phải được mã hóa bằng mã màu ANSI, để tham khảo

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

1
GREP_COLORbị phản đối Sử dụng GREP_COLORSthay thế.
g33kz0r

2

Vì tôi không thấy bất kỳ ví dụ nào về việc thực sự thiết lập màu sắc, đây là một thiết lập đơn giản cho GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Hãy cẩn thận về GREP_OPTIONS; không sử dụng nó cho bất cứ điều gì khác ngoài những thứ như --color=autohoặc nó sẽ gây rối cho bất kỳ tập lệnh nào sử dụng grep trên hệ thống của bạn.

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.