Tìm mẫu chuỗi trong tệp / đầu vào, tìm kiếm phụ thuộc vào ngữ cảnh, (không giống như grep)


3

Có tiện ích nào để tìm văn bản không, như trong grep (linux) hoặc findstr (dos), nhưng để bắt đầu chỉ tìm kiếm sau khi tìm thấy văn bản / mẫu đã cho khác?

Giống như cố gắng tìm văn bản / mẫu đã cho trong một tệp, nhưng chỉ những mẫu nằm trong phần cụ thể của tệp đó. Chỉ 'tệp' trong trường hợp của tôi là đầu ra từ một chương trình khác và số lượng dòng được xuất ra là quá nhiều để ghi vào một tệp và phân tích nó ở đó.

thí dụ:

section ONE
  text_a
  text_b
  text_c
section TWO
  text_b
  text_c
section THREE
  . . .

tìm nếu có bất kỳ "text_c" nào trong phần TWO.

Tôi đã cố đọc grep Tùy chọn của nó nhưng dường như không có khả năng này. Điều này cũng được dự kiến ​​sẽ giảm thiểu số lượng so sánh chuỗi vì "text_c" dài hơn nhiều so với tên phần.

Câu trả lời:


2

Hãy xem xét tệp thử nghiệm này:

$ cat file
section ONE
  text_a
  text_b
  text_c  <-ignore this
section TWO
  text_b
  text_c  <-keep this
section THREE
  text_a
  text_b
  text_c  <-ignore this

Để chọn bất kỳ dòng có chứa text_c đó là trong section TWO:

$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
  text_c  <-keep this

Nếu đầu vào được tạo không phải từ một tệp mà từ command, sau đó sử dụng:

command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'

Làm thế nào nó hoạt động

  • /^section/{f=0}

    Bất cứ lúc nào chúng tôi tìm thấy một dòng bắt đầu với section, bộ f=0.

  • /^section TWO/{f=1}

    Nếu dòng bắt đầu bằng section TWO, sau đó ghi đè lệnh trước đó và đặt f=1.

  • f && /text_c/

    Nếu f là khác không và các dòng hiện tại phù hợp text_c, sau đó in dòng.


Tuyệt quá! Bây giờ tôi cần tìm Tương đương Windows / Dos , vì đôi khi đầu ra đến từ các tệp bó cụ thể của windows và Cygwin (babun trong trường hợp của tôi) không cho chính xác cùng một đầu ra ...
sny

Rất tốt. Đối với các vấn đề về DOS / Windows, mô tả của bạn thiếu tính cụ thể nhưng hầu hết chúng có thể được giải quyết bằng một dos2unix tiện ích giống như sẽ loại bỏ các ký tự trở lại vận chuyển.
John1024

Tôi đoán kết thúc dòng bằng cách thay đổi regex tôi đoán, nếu nó gây rắc rối. Nhưng điều tôi muốn nói là ... chỉ cố chạy một tệp bó cygwin (babun) và một số lệnh nhận tiền tố lạ trong đầu ra: %{)g[blue]%}{ %c }... mà đi với @echo off như dòng đầu tiên mặc dù (không rõ nếu có bất cứ điều gì khác có thể bị rối tung.
sny

Xin lỗi vì sự thiếu hiểu biết của tôi, nhưng có ai đã từng cố gắng biên dịch bất kỳ tiện ích Linux hữu ích nào cho Win / Dos chưa? Không phải họ viết bằng chữ C sao?
sny

1
Tôi không có kinh nghiệm với vấn đề tập tin hàng loạt đó. Đã có nhiều bộ sưu tập tiện ích unix được chuyển sang Win. GnuWin32 / GnuWin64 là một ví dụ.
John1024

2

Bạn cũng có thể làm điều này với sed như:

command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'

điều này hoạt động bởi:

  • -n kể sed không được in các dòng khớp theo mặc định
  • -e cho sed một kịch bản để làm việc trên
    • /section TWO/,/section THREE/ đặt phạm vi địa chỉ của chúng tôi, vì vậy chúng tôi sẽ áp dụng chức năng tiếp theo cho tất cả các dòng giữa các dòng khớp section TWOsection THREE
    • { /text_c/p;} định nghĩa hàm sẽ khớp với một dòng với text_c và nếu nó tìm thấy nó sẽ p in nó

Cảm ơn, tốt để biết. Không hữu ích cho trường hợp của tôi mặc dù. Tôi không có tất cả các tên "phần", chỉ những tên được quan tâm. Upvote! (chưa đủ điểm danh tiếng để thực sự làm điều đó)
sny

Nếu thứ tự phần được biết đến, đây sẽ là một cách tiếp cận tốt. Vì vậy, như sny muốn làm: +1.
John1024

1

Nếu số lượng dòng theo sau mỗi phần có phần không đổi, Bạn có thể sử dụng '-A x 'tùy chọn trong grep để in x các dòng sau một phần phù hợp. Điều này sau đó có thể được chuyển sang một grep thứ hai tìm mẫu của bạn trong 'phần TWO'.

$ cat file
section ONE
  1 text_a
  1 text_b
  1 text_c  
section TWO
  2_text_a
  2 text_b
  2 text_c  
section THREE
  3 text_a
  3 text_b
  3 text_c 

$ grep -A3 'section TWO' file | grep text_c
  2 text_c

Cảm ơn bạn. Đối với tôi, đó chỉ là một lần mà tôi biết số lượng dòng, tất cả những lần khác nó không được biết trước.
sny
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.