grep nhân vật xung quanh của một trận đấu


8

Tôi đang tìm kiếm và thay thế trong một bãi chứa cơ sở dữ liệu khổng lồ và nó không làm những gì tôi nghĩ sẽ xảy ra. Tôi muốn grep cho chuỗi mục tiêu của mình trong tệp và sau đó xem 8 ký tự xung quanh hoặc hơn (tôi có thể cần điều chỉnh số đó, tùy thuộc). Làm thế nào tôi có thể làm điều đó?

Lý do tôi không thể cầu mắt này là vì có hàng trăm, nếu không phải là hàng ngàn trận đấu. Tôi muốn nhận được một số lượng ký tự xung quanh chuỗi, và sau đó chuyển nó vào uniqhoặc một cái gì đó để xem tại sao việc tìm và thay thế của tôi lại có những hành vi bất ngờ.

Ngoài ra, có thể có nhiều trận đấu trên cùng một dòng!


Nó không phải là một tập tin văn bản?
enzotib

Đó là, nhưng ngay cả các trận đấu là một tập tin quá lớn đối với nhãn cầu.
dùng394

Câu trả lời:


12

Cách sử dụng thô thiển grepsẽ giống như

grep -o "....yourtext...." /path/to/the/dump.sql

Số lượng dấu chấm tương ứng với số lượng ký tự trước / sau văn bản được tô điểm. Các -otùy chọn làm cho grepsản lượng chỉ các trận đấu, không phải toàn bộ dòng.

Để sử dụng uniqtrên đầu ra, hãy nhớ bạn phải sắp xếp đầu ra trước. Vì vậy, thông thường, bạn sẽ làm

grep . . . | sort | uniq

Nếu bạn quan tâm đến số lần truy cập cho mỗi trận đấu, bạn có thể nhận được kết quả tốt bằng cách sử dụng

grep . . . | sort | uniq -c | sort -n

Thô? Hoàn toàn tinh vi!
dùng394

1
Bạn có thể mở rộng điều này một chút bằng cách sử dụng toán tử lặp lại : grep -o '.\{8\}yourtext.\{8\}'. Đây là một chút chóng mặt hơn so với đếm 8 chấm.
Caleb

:) Nói một cách thô thiển, ý tôi là bạn không chơi với những thứ như đếm các ký tự trùng khớp (sử dụng phạm vi) hoặc thu hẹp các bộ ký tự.
rozcietrzewiacz

@Caleb và user394: Đây chính xác là những gì tôi dự định không đề xuất (và do đó được gọi là phương pháp của tôi "thô"). Người ta không cần phải nhớ cấu trúc toán tử lặp lại, ngoài ra - việc nhập "....." còn nhanh hơn cả ". \ {6 \}".
rozcietrzewiacz

7

Bắt đầu từ câu trả lời của @rozcietrzewiacz, tôi có thể mở rộng sang

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
Chuỗi chấm "thô" trông đẹp hơn và tốt hơn mọi lúc :)
Caleb

1
@Caleb: nói chung câu trả lời "thô thiển" là một khởi đầu tốt, nhưng đôi khi người ta muốn giải thích một chút về nó.
enzotib

1
Phương pháp chuỗi chấm sẽ không tìm thấy các mẫu mục tiêu hợp lý trái hoặc phải; phương pháp này sẽ. (+1)
Peter.O

2
PS .. Tôi chỉ nhận thấy rằng nó sẽ không bắt được nhiều trường hợp mẫu trên cùng một dòng (như OP đã đề cập) khi phạm vi của văn bản 'exta' của mẫu đầu tiên chồng lên phạm vi của văn bản 'phụ' hàng đầu của mẫu tiếp theo
Peter.O

@fred: yeah, -ochỉ cung cấp trận đấu đầu tiên khi hai trận đấu trùng nhau:echo 'aaabbbccc' | grep -o 'bb
enzotib
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.