2008-10-27 45 views
19

Khi sử dụng grep --color=always Tôi có thể nhận được màu sắc nổi bật cho phù hợp với regex.Màu phù hợp với regex - mà không bỏ lỡ số

Tuy nhiên, grep chỉ trả lại các dòng có ít nhất một kết quả phù hợp. Thay vào đó, tôi đang tìm kiếm một cách đơn giản để làm nổi bật các trận đấu regex, trong khi để lại tất cả các đầu vào khác một mình, mà không làm rơi các dòng mà không có bất kỳ kết quả phù hợp nào.

Tôi đã cố gắng để có được màu sắc làm việc với sed, và đọc tài liệu grep, nhưng tôi dường như không thể có được những gì tôi muốn.

Trong trường hợp mô tả isnt của tôi rõ ràng, tôi muốn:

INPUT:

  • fred
  • ted
  • đỏ
  • dẫn

Regex:

OUTPUT "* đỏ.":

  • fred (màu đỏ)
  • ted
  • đỏ (màu đỏ)
  • dẫn

Để tôi có thể làm:

list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest" 

EDIT:

Tôi đã tìm thấy một giải pháp, mà không phải là đẹp, nhưng nó hoạt động:

Nhờ: http://www.pixelbeat.org/docs/terminal_colours/

Riêng kịch bản (mà tôi điều chỉnh/được đơn giản hóa): http://www.pixelbeat.org/talks/iitui/sedgrep

function sedgrep() 
{ 
    C_PATT=`echo -e '\033[33;01m'` 
    C_NORM=`echo -e '\033[m'` 

    sed -s "s/$1/${C_PATT}&${C_NORM}/gi" 
} 

Vẫn đang tìm kiếm một cách dễ dàng hơn để làm điều này!

Trả lời

3

chức năng nhỏ này hoạt động tốt trong ZShell tôi:

function color_grep { 
    sed s/$1/$fg[yellow]$1$terminfo[sgr0]/g 
} 

(Nhu cầu

autoload colors zsh/terminfo 

)

lẽ bạn có thể làm điều gì đó tương tự?

Chỉnh sửa: Rất tiếc, thao tác này sẽ không hoạt động với các regex. Bạn sẽ phải tinh chỉnh nó một chút ...

+0

Tôi đang sử dụng bash, nhưng dường như gần như cùng một loại giải pháp như giải pháp tôi đã đăng. Cảm ơn! – mmocny

1

Cách bạn đang thực hiện việc này hiện có thể là sạch sẽ như bạn có thể mong đợi để thực hiện việc này, trừ khi tất nhiên bạn viết công cụ grep của riêng bạn. Nếu bạn không nhất thiết phải quan tâm đến việc bảo tồn thứ tự của các đầu ra, đây là cách khác tôi có thể nghĩ ra để làm điều này:

function colormatch() 
{ 
    tee - | grep --color=always $1 | sort | uniq 
} 

Không hiệu quả như sử dụng sed (quá trình hơn tạo ra, và tee-ing đầu ra), vì vậy tôi có thể khuyên bạn nên gắn bó với giải pháp sed của bạn.

+0

Điểm tốt. Giải pháp của bạn có cú pháp dễ nhớ hơn, trong những lần mà tôi không có tệp .bashrc của tôi tiện dụng :) – mmocny

2

Bạn có thể sử dụng tùy chọn -C<num> để grep hiển thị cho bạn <num> ngữ cảnh xung quanh kết hợp của bạn. Chỉ cần đảm bảo <num> ít nhất bằng số lượng dòng trong tệp của bạn.

+0

oooh, lạm dụng thông minh tùy chọn ngữ cảnh, tôi thích nó :-) – Jay

+1

Thực ra, tôi đã thử cách này, và nó không hoạt động vì ba lý do: Một, nếu chúng không phải là một trận đấu duy nhất, nó sẽ không trả lại bất cứ điều gì. Hai, nó đã chậm khi thực sự lớn. Ba (vấn đề lớn nhất), kết quả được in với mỗi "trận đấu", vì vậy nếu tôi đang chạy lệnh này trên một đường ống tôi nhận được kết quả trong blobs – mmocny

+0

Tuy nhiên, nó là một cách rất thông minh để làm điều đó như một hack nhanh, đặc biệt là cho kết quả nhỏ nếu bạn biết họ là một hit :) Tôi làm điều này tất cả các thời gian khi không phải trên máy tính của riêng tôi – mmocny

0

Gần đây tôi đã tạo một thứ tương tự như một bộ lọc. Tôi sử dụng nó để tô màu các "tiêu đề" ở đuôi với nhiều tệp, như sau:

tail -f access.log error.log foo.log | logcol.sh

Các tiêu đề giống như thế này:

==> access.log < ==

tôi đã nhầm lẫn bởi những thay đổi nhanh chóng giữa các log khác nhau, do logcol.sh này giúp. Các ==> được mã hóa cứng cho việc sử dụng cụ thể nhưng có thể là một tham số là tốt.

#!/bin/sh 
while read line 
do 
    if test `expr "$line" : "==>.*"` -eq 0 ; 
    then 
    printf '\033[0m%s\n' "$line" 
    else 
    printf '\033[0;31m%s\n' "$line" 
    fi 
done 

Có lẽ không phải là thanh lịch nhất nhưng tôi nghĩ nó khá dễ đọc. Tôi hy vọng tôi không có bất kỳ lỗi chính tả nào ;-) HTH, rob

20

Giải pháp đơn giản nhất là nên sử dụng egrep --color=always 'text|^' mà sẽ phù hợp với tất cả sự khởi đầu dòng nhưng chỉ tô màu cho chữ mong muốn.

+3

Điều này đã không làm việc cho tôi, nhưng điều này không: egrep --color = always 'text | $' Tôi sử dụng zsh bằng cách này. – Tony

7

Đây là tập lệnh tôi sử dụng để tô màu đầu ra.

Tôi nghĩ rằng tôi đã tìm thấy ý tưởng/đoạn trích trên một số loại blog hoặc bash/sed hướng dẫn - không thể tìm thấy nó nữa, đã rất lâu rồi.

#!/bin/bash 

red=$(tput bold;tput setaf 1)    
green=$(tput setaf 2)      
yellow=$(tput bold;tput setaf 3)   
fawn=$(tput setaf 3) 
blue=$(tput bold;tput setaf 4)   
purple=$(tput setaf 5) 
pink=$(tput bold;tput setaf 5)   
cyan=$(tput bold;tput setaf 6)   
gray=$(tput setaf 7)      
white=$(tput bold;tput setaf 7)   
normal=$(tput sgr0)      

sep=`echo -e '\001'` # use \001 as a separator instead of '/' 

while [ -n "$1" ] ; do 
    color=${!1} 
    pattern="$2" 
    shift 2 

    rules="$rules;s$sep\($pattern\)$sep$color\1$normal${sep}g" 
done 

#stdbuf -o0 -i0 sed -u -e "$rules" 
sed -u -e "$rules" 

Cách sử dụng:

./colorize.sh color1 pattern1 color2 pattern2 ... 

ví dụ

dmesg | colorize.sh red '.*Hardware Error.*' red 'CPU[0-9]*: Core temperature above threshold' \ 
green 'wlan.: authenticated.*' yellow 'wlan.: deauthenticated.*' 

Không hoạt động tốt với các mẫu chồng chéo, nhưng tôi thấy nó rất hữu ích.

HTH

Các vấn đề liên quan