2013-08-02 30 views
8

Tôi có một vấn đề tôi hy vọng ai đó sẽ có thể giúp đỡ với ...grep -f trên các tập tin trong một thư mục nén

Tôi đang thực hiện một fgrep đệ quy/grep -f tìm kiếm trên một thư mục nén bằng cách sử dụng lệnh sau tại một trong những chương trình của tôi:

lệnh tôi đang sử dụng

grep -r -i -z -I -f /path/to/pattern/file /home/folder/TestZipFolder.zip 

Bên trong tập tin mô hình là chuỗi "Chó" mà tôi đang cố gắng để tìm kiếm.

Trong thư mục nén lên có một số tệp văn bản chứa chuỗi "Chó". Lệnh grep -f tìm thành công các tệp văn bản có chứa chuỗi "Dog" trong 3 tệp bên trong thư mục nén, nhưng nó in tất cả trên một dòng và một số ký tự lạ xuất hiện ở cuối tức là PK (dưới dạng được hiển thị bên dưới). Và khi tôi thử và in sản lượng vào một tập tin trong chương trình của tôi nhân vật khác xuất hiện ở cuối dòng như ^B^T^@

Output từ mệnh lệnh grep -f:

TestZipFolder/test.txtThis is a file containing the string DogPKtest1.txtDog, is found again in this file.PKTestZipFolder/another.txtDog is written in this file.PK 

Làm thế nào tôi sẽ nhận được mỗi người trong số các tập tin mà chuỗi "Chó" đã được tìm thấy để in trên một dòng mới để chúng không phải tất cả được nhóm lại với nhau trên một dòng như bây giờ? Ngoài ra đâu là "PK" và các ký tự lạ khác xuất hiện trong đầu ra và làm cách nào để ngăn chúng xuất hiện?

đầu ra mong muốn

TestZipFolder/test.txt:This is a file containing the string Dog 
TestZipFolder/test1.txt:Dog, is found again in this file 
TestZipFolder/another.txt:Dog is written in this file 

cái gì đó dọc những dòng này, nhờ đó người dùng có thể nhìn thấy nơi các chuỗi có thể được tìm thấy trong các tập tin (bạn thực sự nhận được đầu ra ở định dạng này nếu bạn chạy grep lệnh trên một tệp không phải là tệp zip).

giúp đỡ của bạn với điều này được nhiều đánh giá, nhờ

Trả lời

10

Nếu bạn cần một sản lượng multiline, tốt hơn sử dụng zipgrep:

zipgrep -s "pattern" TestZipFolder.zip 

các -s là để ngăn chặn các thông báo lỗi (không bắt buộc) . Lệnh này sẽ in mọi dòng phù hợp cùng với tên tệp. Nếu bạn muốn loại bỏ các tên trùng lặp, khi có nhiều hơn một đối sánh trong một tệp, một số xử lý khác phải được thực hiện bằng cách sử dụng vòng lặp/grep hoặc awk hoặc sed.

Trên thực tế, zipgrep là sự kết hợp egrepgiải nén. Và cách sử dụng của nó như sau:

zipgrep [egrep_options] pattern file[.zip] [file(s) ...] [-x xfile(s) ...] 

để bạn có thể chuyển bất kỳ tùy chọn egrep nào cho nó.

+0

có cách nào tôi cũng có thể hiển thị vị trí khớp trong tệp như trong lệnh grep trong câu hỏi của tôi không ?, trái ngược với việc chỉ liệt kê tệp được tìm thấy trong đó? - cảm ơn rất nhiều –

+0

bạn có thể cung cấp đầu ra mong muốn không? Nếu bạn làm thế, tôi có thể thử. – blackSmith

+0

Cập nhật câu hỏi của tôi để hiển thị kết quả mong muốn. Đó là định dạng tương tự mà đầu ra nằm trong nếu bạn chạy lệnh grep trên một thư mục không phải là tệp zip (nghĩa là nó cung cấp tên của tệp mà một kết quả trùng khớp được tìm thấy sau đó sau dấu hai chấm cho biết vị trí của nó) rất nhiều –

Các vấn đề liên quan