Thanh tiến trình Grep sử dụng pv (trình xem ống)


11

Tôi đã có một thư mục lớn trên máy tính của mình và tôi cần tìm kiếm trong mỗi tệp ruby ​​bên trong để tìm chuỗi.

Tôi có thể đã làm nó như thế này: grep -R "string" *.rbnhưng nó thực sự mất nhiều thời gian và tôi muốn sử dụng pv (trình xem ống) để hiển thị thanh tiến trình để có thể theo dõi greptiến trình.

Nhưng tôi thực sự không biết làm thế nào tôi có thể viết lệnh này bởi vì vẫn còn một số điều tôi không thể hiểu về lệnh này.

Có ai có ý kiến ​​gì không?

Câu trả lời:


15

pvhoạt động trên đường ống (không phải lệnh) - Đây là thước đo âm lượng cho biết lượng dữ liệu đã đi qua một điểm nhất định trong đường ống.
Lệnh grep của bạn không phải là một đường ống dẫn ( |- pipe operatorkhông tìm thấy ở đâu) - đó chỉ là một lệnh duy nhất thực hiện công việc của nó. pvKhông thể giúp bạn ở đây, bạn chỉ cần tin tưởng rằng grepthực sự đang làm điều đó trên tất cả các tệp đầu vào.

Bạn có thể kết hợp một cái gì đó cùng với find, pv, xargs & grep (có find . -name "*.rb" | pv | xargs grep [regex]vẻ như nó có thể hứa hẹn, nhưng bạn sẽ phải cho biết sản lượng pvlớn như thế nào findđể mang lại kết quả có ý nghĩa.

Thành thật mà nói nó có vẻ như nhiều công việc hơn giá trị của nó. Chỉ cần chạy grep của bạn, kiên nhẫn chờ đợi và xử lý đầu ra khi hoàn thành.


1
Điều đó hoàn toàn có thể xảy ra , nó chỉ phức tạp và có thể sẽ mất nhiều thời gian hơn để kết hợp và làm việc hơn là chỉ chờ grep kết thúc :-)
voretaq7

1
Có thể là một đoạn thực sự hay: p
Cydonia7

4

Hai phương pháp nữa:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

Hoặc, trong một shell khác trong khi lệnh ban đầu của bạn đang chạy, hãy tìm pid của lệnh grep và sau đó:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

Cả hai điều trên sẽ cho bạn thấy tập tin nào mà lệnh grep hiện đang làm việc. Bạn có thể tìm thấy tổng số tệp với:

ls -l *.rb | wc -l

Cuối cùng, sử dụng điều này để tìm ra số tập tin hiện tại trong danh sách:

ls -l *.rb | grep -n [the current filename]

PS Câu trả lời của tôi cho rằng tất cả các tệp của bạn nằm trong một thư mục. Nếu chúng không phải, bạn sẽ phải sử dụng findthay vì ls*.rbnhư đề xuất.


1
Đó là một lựa chọn tốt
Cydonia7

1

Tôi không chắc bạn đang sử dụng hệ điều hành nào, nhưng grep -R "string" *.extcó thể không hoạt động chính xác cho bạn.

Bạn có thể được phục vụ tốt hơn bằng cách sử dụng findkết hợp với grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"


Đúng vậy, lệnh tôi đã đưa ra thực sự hoạt động trên Fedora 16 nhưng lệnh của bạn rõ ràng hơn. Cảm ơn bạn !
Cydonia7

1

Trong các phiên bản gần đây của pvcó một "-d"-Option để xem tất cả các FD của một quá trình khác.

Vì vậy, trên lý thuyết pvsẽ không chỉ hoạt động như một đường ống mà còn là một chỉ báo tiến độ cho toàn bộ quá trình. (Ví dụ: hãy thử nó với PID của Firefox của bạn)

Đối với vấn đề trên, một ý tưởng đơn giản hơn là như sau: Trong khi grepđang chạy, hãy sử dụng lsofcùng với watch.

$ watch -n 1 "lsof | grep -n $PWD"

Bằng cách đó bạn có thể theo dõi tiến trình của grep của bạn.


0

Bạn đã thử chưa

grep -R "string" *.rb | pv

Tôi không biết nếu nó thực sự hoạt động bởi vì nó không biết có bao nhiêu bit của tổng dữ liệu để tìm kiếm vì nó là đệ quy?


4
Tôi không nghĩ rằng điều này sẽ làm những gì anh muốn - pvsẽ được hoạt động trên các đầu ra của grep (vì vậy ngay cả khi ông định kích thước đầu vào đầy đủ pvchỉ nhìn thấy đầu ra sắp ra cuối của ống - Nó sẽ là cách dưới
-counting

0

Tôi thường sử dụng hệ thống tập tin Proc trên các hệ thống Linux, tức là

ls -al /proc/<pid of grep>/fd

Điều này liệt kê tất cả các tệp mà lệnh grep-open hiện đang mở và do đó tạo ấn tượng về vị trí tìm kiếm hiện tại.

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.