Tìm kiếm các tệp có nhiều hơn một thuật ngữ (grep, awk?)


5

Tôi đang sử dụng một lệnh như thế này để tìm các tệp có từ 'hạn' trong đó:

grep -l term *

Nhưng bây giờ tôi muốn có thể tìm thấy các tệp có hai từ khác nhau (hãy gọi chúng là termA và termB) - không nhất thiết phải trên cùng một dòng. Tôi muốn tìm các tệp có cả hai thuật ngữ, không chỉ các tệp có thời hạn.

Bây giờ tôi có thể viết một tập lệnh bash rườm rà cho việc này, nhưng grep, egrep, awk, sed hay bất cứ thứ gì khác có một công cụ có thể giúp tôi không?

Cảm ơn trước.

Câu trả lời:


4

Nếu tệp của bạn không chứa byte rỗng

Trong trường hợp này, bạn có thể sử dụng grepmột mình:

grep -Plz "termA.*termB|termB.*termA" *

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

  • Các Perl Regular Expressions Tương thích termA.*termBtermB.*termAtìm kiếm cho các chuỗi đó có cả các điều khoản trong đó.

  • PCRE kết hợp termA.*termB|termB.*termAkhớp với tất cả các chuỗi chứa cả hai thuật ngữ.

  • Cuối cùng, -zkhóa chuyển làm cho các dòng dữ liệu kết thúc bằng byte rỗng thay vì dòng mới.

Nhân tiện, không cần sử dụng -P. Nếu bạn muốn tiếp tục sử dụng Biểu thức chính quy cơ bản POSIX , cú pháp tương tự:

grep -lz "termA.*termB\|termB.*termA" *

Nếu tệp của bạn chứa byte rỗng

Trong trường hợp này, bạn sẽ cần các công cụ phụ trợ:

(grep -l termA * ; grep -l termB *) | sort | uniq -d

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

  • grep -l termA * ; grep -l termB *hiển thị tất cả các tập tin có chứa một trong các điều khoản. Các tập tin có chứa cả hai điều khoản sẽ được hiển thị hai lần.

  • sort sắp xếp đầu ra.

  • uniq -d chỉ hiển thị các dòng trùng lặp (các dòng bắt buộc phải được sắp xếp).


Cảm ơn - điều này đang tìm kiếm các điều khoản trên cùng một dòng mặc dù.
Peter Howe

Xin lỗi, tôi bỏ qua yêu cầu đó. Tôi đã cập nhật câu trả lời của mình.
Dennis

Tnanks Dennis. Các uniq -d là những gì tôi cần.
Peter Howe

3

Bạn có thể sử dụng -ehoặc -ftùy chọn để tìm kiếm nhiều biểu thức (từ man grep):

    -e PATTERN, --regexp=PATTERN
          Use  PATTERN  as  the  pattern.   This  can  be  used to specify
          multiple search patterns, or to protect a pattern beginning with
          a hyphen (-).  (-e is specified by POSIX.)

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

Vì vậy, bạn sẽ sử dụng điều này như:

$ grep -e termA -e termB *

Cảm ơn. Không hoàn toàn những gì tôi đang theo đuổi. Ví dụ của bạn (với -l để hiển thị các tệp) sẽ cung cấp cho tôi các tệp tat có termA hoặc termB trong đó. Tôi muốn một danh sách các tập tin có cả hai điều khoản.
Peter Howe

1

grep hỗ trợ các biểu thức chính quy theo như tôi biết. Tôi sử dụng cú pháp sau để tìm kiếm nhiều thuật ngữ:

    grep 'termA\|termB' /i/am/a/path

bạn cần sử dụng ký tự thoát '\' trước mỗi '|' nhưng với điều đó tôi tin rằng bạn có thể sử dụng nhiều chuỗi tìm kiếm như bạn muốn


Xin lỗi, tôi đã làm rõ nó trong câu hỏi ngay bây giờ, nhưng tôi đang theo dõi một danh sách các tệp có cả hai điều khoản. Điều này sẽ cho tôi một danh sách các tệp có trong đó.
Peter Howe
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.