2011-11-12 30 views
83

Sử dụng này:Ký tự Grep trước và sau trận đấu?

grep -A1 -B1 "test_pattern" file 

sẽ sản xuất một dòng trước và sau khi mô hình phù hợp trong file. Có cách nào để hiển thị không phải là dòng nhưng số ký tự được chỉ định không?

Các dòng trong tệp của tôi khá lớn nên tôi không quan tâm đến việc in toàn bộ dòng mà chỉ quan sát đối sánh trong ngữ cảnh. Có bất cứ đề nghị nào cho việc làm như thế này hả?

Trả lời

103

3 ký tự trước và 4 ký tự sau

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' 
23_string_and 
+4

Câu trả lời hay cho một lượng nhỏ dữ liệu, nhưng nó bắt đầu chậm khi bạn so khớp> 100 ký tự - ví dụ: trong tệp xml khổng lồ của tôi, tôi muốn {1,200} trước và sau, và nó quá chậm để sử dụng. – Benubird

+3

Phiên bản awk của @amit_g nhanh hơn nhiều. – ssobczak

+1

Không có trên Mac OSX, vì vậy đây thực sự không phải là giải pháp có sẵn rộng rãi. Phiên bản -E (được liệt kê dưới đây) là một giải pháp tốt hơn. -P là gì? Đọc trên ... -P, --perl-regexp Giải thích MẪU như một biểu thức chính quy Perl (PCRE, xem bên dưới). Điều này là rất thử nghiệm và grep-P có thể cảnh báo về các tính năng chưa được thực hiện. – Xofo

23

Bạn có thể sử dụng

awk '/test_pattern/ { 
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20); 
}' file 
+2

Hoạt động tốt ngay cả với các tệp có kích thước lớn hơn cũng là – Touko

+3

cách bạn có thể sử dụng để tìm nhiều kết quả phù hợp trên mỗi dòng? – koox00

+0

Ai đó có thể cập nhật điều này cho nhiều trận đấu không? – Pranab

11

Bạn có nghĩa là, như thế này:

grep -o '.\{0,20\}test_pattern.\{0,20\}' file 

?

Điều đó sẽ in tối đa 20 ký tự ở hai bên test_pattern. Ký hiệu \{0,20\} giống như *, nhưng chỉ định không đến hai mươi lần lặp lại thay vì bằng không hoặc nhiều hơn. Số -o cho biết chỉ hiển thị kết hợp chính nó, thay vì toàn bộ dòng.

+0

Lệnh này không hoạt động đối với tôi: 'grep: Nội dung không hợp lệ của \ {\}' –

+0

Cái này hoạt động trong thiết bị đầu cuối OSX. – hapi

70
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

Điều này sẽ khớp với tối đa 5 ký tự trước và sau mẫu của bạn. Nút chuyển đổi -o cho grep chỉ hiển thị kết quả phù hợp và -E để sử dụng biểu thức chính quy mở rộng. Hãy chắc chắn để đặt các dấu ngoặc kép xung quanh biểu thức của bạn, nếu không nó có thể được diễn giải bởi trình bao.

0

Với gawk, bạn có thể sử dụng chức năng phù hợp:

x="hey there how are you" 
    echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}' 
    ere are 

Nếu bạn là ok với perl, giải pháp linh hoạt hơn: Sau sẽ in ba nhân vật trước khi mô hình tiếp theo mô hình thực tế và sau đó 5 nhân vật sau khi mẫu .

echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/' 
ey there how 

này cũng có thể được áp dụng cho những lời thay vì chỉ characters.Following sẽ in một từ trước chuỗi phù hợp thực tế.

echo hey there how are you |perl -lne 'print $1 if /(\w+) there/' 
hey 

Tiếp theo sẽ in một từ sau khi mẫu:

echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/' 
how 

Tiếp theo sẽ in một từ trước khi mô hình, sau đó từ thực tế và sau đó một từ sau khi mẫu:

echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)(there)(\w+)/' 
hey there how 
Các vấn đề liên quan