grep làm thế nào để chặn hiển thị tập tin không phù hợp?


11

Tôi đang cố gắng tìm các tập tin có chứa một từ cụ thể bằng cách sử dụng grep. Có nhiều tệp trong thư mục (> 500)

Lệnh tôi chạy

$ grep 'delete' *

Đầu ra

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

Đây là những tệp không chứa kết quả khớp. Tôi muốn ngăn chặn những dòng đó hiển thị đến thiết bị xuất chuẩn. Tôi biết về -qchuyển đổi, nhưng điều đó sẽ ngăn chặn đầu ra hoàn chỉnh, điều mà tôi không muốn.

Làm thế nào để làm điều đó?


2
Thông thường, grepkhông nên in tên tệp của các tệp không khớp. Trên thực tế, có vẻ như grepxem xét một dòng với nội dung 0được khớp. Bạn có thể đăng mẫu tìm kiếm chính xác mà bạn đang sử dụng không?
Adrian Heine

Grep cmd hoàn chỉnh tôi đã sử dụng là grep 'delete' * -R, nhưng tôi không nghĩ -Rlà gây ra bất kỳ vấn đề nào. Và vâng, thông thường nó không in những cái không khớp, nhưng không chắc trường hợp nào ở đây ...
mtk

@step @everyone .. Lạ thật ... Sau khi xem bài chỉnh sửa ở trên. Tôi đã thử grep -- 'delete' *(thêm --) và nó hoạt động như mong đợi. Loại bỏ --là dẫn đến màn hình trên.
mtk

1
@Stephane Quả thực bạn đúng. Tôi đã tìm kiếm thư mục ... và có một tập tin với tên -ci. Cảm ơn đã giải quyết vấn đề. Bạn có thể đăng kịch bản này như một câu trả lời.
mtk

Câu trả lời:


9

Đó là hành vi được thể hiện bởi grep -c.

Có thể bạn có một tệp có tên bắt đầu bằng -và chứa một cký tự và bạn đang sử dụng GNU grep mà không đặt POSIXLY_CORRECTbiến môi trường.

Sử dụng:

grep -- delete *

hoặc tốt hơn:

grep delete ./*

--đánh dấu sự kết thúc của các tùy chọn để tên tệp sẽ không được coi là một tùy chọn (với grep POSIX, vì deleteđối số không phải tùy chọn sẽ đánh dấu sự kết thúc của các tùy chọn), nhưng nó sẽ không giải quyết được vấn đề của một tập tin gọi là -. Các grep delete ./*là mạnh mẽ hơn nhưng có nhược điểm của outputting thêm ./cho các tập tin phù hợp (mặc dù có thể được coi là một tiền thưởng vì đó giúp xác định tên file có chứa ký tự xuống dòng).


12

Thêm vào

| grep -v ':0$'

Không thanh lịch lắm nhưng tôi nghĩ sẽ làm được việc.

Thêm -lvào lệnh của bạn sẽ chỉ cung cấp cho bạn các kết quả khớp nhưng nó cũng sẽ chặn số lượng in của các trận đấu cho mỗi tệp.


1
-lđã làm việc. công việc xung quanh cũng tốt Cảm ơn
mtk

4
dòng grep phải là grep -v ':0$'như vậy chỉ những người ở cuối dòng được khớp (tuy nhiên, grep -lcách tiếp cận sẽ tốt hơn miễn là bạn không cần đếm số dòng)
mreithub

9

Sử dụng grep -lbạn sẽ chỉ nhận được các tệp có ít nhất một trận đấu.

Bạn có cần thông tin về có bao nhiêu trận đấu trong một tập tin không? Bởi vì bạn có thể bỏ qua việc sử dụng -cđược sử dụng để đếm số lượng trận đấu trong một tệp.

chỉnh sửa: Và giống như warlock cho biết sử dụng -Iđể triệt tiêu các kết quả khớp trong tệp nhị phân cũng có thể là một ý tưởng hay.


0

Làm thế nào để grep nonzero đếm:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Tái phát các thư mục con.
  • -IBỏ qua các tệp nhị phân (cảm ơn @tongpu , warlock) .
  • -cHiển thị số lượng các trận đấu. Khó chịu, bao gồm các tập tin đếm 0.
  • -H Hiển thị tên tệp, ngay cả khi chỉ có một tệp.
  • 'string' chuỗi của bạn đi ở đây.
  • . Bắt đầu từ thư mục hiện tại.
  • | -v ':0$'Xóa các tập tin 0 số. (cảm ơn @LaurentiuRoescu )

(Tôi nhận ra OP đã vô tình đếm -c, nhưng google (grep nonzero Count) hạ cánh ở đây.)


0

Tương tự như câu trả lời của Laurentiu, bạn cũng có thể sử dụng danh sách -llàm đầu vào tệp cho grep:
grep -r "pattern" -c $(grep -rl "pattern")
Nó cho phép giữ màu của grep, nhưng thực hiện điều tương tự trong nền


lưu ý rằng tên tệp và thư mục chứa bất kỳ khoảng trắng hoặc ký tự đại diện nào sẽ bị chia nhầm và khớp với nhau.
Jeff Schaller
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.