2015-08-13 14 views
5

Tôi đang cố gắng tìm số trận đấu cho một chuỗi nhất định trong một dự án lớn. Hiện tại, để thực hiện việc này với ag Tôi đang sử dụng lệnh sau:Đếm tổng số trận đấu trong thư mục với ag

$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc 

rõ ràng là hơi dài và không trực quan. Có cách nào tốt hơn để nhận tổng số trận đấu trong một thư mục từ ag không? Tôi đã đào tạo tài liệu và không thể tìm thấy bất cứ điều gì hữu ích ở đó.

Edit: Nhờ một recent commit-ag, các tên tập tin có thể bị tước bằng ag thay vì sed, vì vậy đây cũng làm việc:

$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc 

Lưu ý: Tôi nhận ra tôi có thể làm điều này với ack -hcl searchterm (Vâng, gần như Trong trường hợp cụ thể của tôi, tôi cũng cần một số --ignore-dir building), nhưng vì đây là một dự án lớn (và sẽ tăng lên đáng kể), tốc độ tăng thêm được cung cấp bởi ag làm cho nó trở nên thích hợp hơn (ack mất khoảng 3 giây) tìm kiếm so với kết quả gần như tức thời của ag), vì vậy tôi muốn sử dụng k với nó.

+0

Bạn đã bao giờ tìm thấy câu trả lời cho câu hỏi này? – jjaderberg

+0

@jjaderberg Không chính xác. Tùy chọn tốt nhất có vẻ là tùy chọn '--stats', sau đó phân tích cú pháp đúng dòng. (ví dụ: 'ag --stats searchterm | tail -n 5 | head -n 1'). Tôi cũng đã gửi một yêu cầu kéo cho một tùy chọn '--stats-only' để ngăn chặn bất cứ điều gì khác được in, trong trường hợp đó' ag --stats searchterm | đầu -n 1' sẽ nhận được số trận đấu. Trong cả hai trường hợp đó, bạn vẫn cần phải lọc ra "kết quả phù hợp" để có được chỉ số mặc dù. – SnoringFrog

Trả lời

7

Tôi sử dụng chính ag để khớp với thống kê. Ví dụ.:

>$ ag --stats --java -c 'searchstring' | ag '.*matches' 
>$ 22 matches 
>$ 6 files contained matches 

Lọc với lookahead in chỉ số của trận đấu:

>$ ag --stats --java -c 'searchstring' | ag -o '^[0-9]+(?=\smatches)' 
>$ 22 
2

Vẫn không có giải pháp tuyệt vời, nhưng đây là những gì tôi đã quản lý để đưa ra thusfar cho bất kỳ ai khác tìm thấy này:

Nếu bạn không tìm kiếm một lượng lớn các tập tin, chỉ cần sử dụng ack -hcl searchterm, nếu không .. .

tôi đã có thể để cải thiện lệnh trong câu hỏi của tôi bằng cách tận dụng tùy chọn --stats, mà gắn thêm một cái gì đó như sau để các kết quả tìm kiếm:

714 matches 
130 files contained matches 
300 files searched 
123968435 bytes searched 
0.126203 seconds 

Đối với việc tự sử dụng, đó là đủ tốt (mặc dù nó vẫn tràn ngập màn hình với tất cả các trận đấu), nhưng đối với kịch bản tôi vẫn chỉ cần số lượng. Vì vậy, để Cuối cùng, tôi đã đi từ lệnh trong câu hỏi của tôi xuống này:

$ ag --stats searchterm | tail -n5 | head -n1 | cut -d" " -f1 

hoặc ngắn gọn hơn nhưng ít đáng nhớ

$ ag --stats searchterm | tac | awk 'NR==5 {print $1}' 

(thay thế tac với tail -r nếu bạn don' t có tac)

Để tiết kiệm thêm một chút gõ, tôi đã bí danh nửa sau của lệnh để tôi có thể chỉ đường ống ag --stats cho bí danh của tôi và nhận được những gì tôi muốn. Vì vậy, với alias agmatches='tac | awk "NR==5 {print \$1}' tôi có thể nhận được chỉ các trận đấu bằng cách chạy ag --stats searchterm | agmatches.

Vẫn sẽ tốt hơn nếu đây là thứ được xây dựng thành ag để giúp tạo điều kiện thuận lợi cho việc này. Tôi đã gửi yêu cầu kéo cho tùy chọn đầu ra --stats-only có thể giúp ích, nhưng không có gì đến từ số này chưa khả dụng nếu bạn xây dựng trực tiếp từ repo, nhưng chưa có bản phát hành ổn định, để tăng tốc xử lý một miếng ngon cho số lượng lớn các kết quả.

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