find . -type f -print -exec cat {} \; | grep some string
Lệnh trên không in đường dẫn tệp.
Tôi đang sử dụng : Ubuntu, bash 4
.
ack
để grep qua tất cả các tệp trong thư mục hiện tại, có thể chỉ lọc trên một số loại tệp nhất định.
find . -type f -print -exec cat {} \; | grep some string
Lệnh trên không in đường dẫn tệp.
Tôi đang sử dụng : Ubuntu, bash 4
.
ack
để grep qua tất cả các tệp trong thư mục hiện tại, có thể chỉ lọc trên một số loại tệp nhất định.
Câu trả lời:
Đó là bởi vì bạn đang cung cấp grep
một luồng văn bản có chứa tên tệp. Vì bạn không cung cấp tên tệp làm đối số cho grep, nên không thể suy ra tập tin mà một dòng trùng khớp đến từ đâu. Sử dụng xargs
:
find . -type f -print | xargs grep "some string"
Vì bạn có GNU find / xargs, đây là cách an toàn hơn để xargs đọc tên tệp:
find . -type f -print0 | xargs -0 grep "some string"
Nếu bạn chỉ muốn tên tệp có dòng trùng khớp mà không hiển thị dòng phù hợp:
find . -type f -print0 | xargs -0 grep -l "some string"
sed '...' $(find ... | xargs grep -l ...)
tôi sử dụng
grep "some string" . -R
và nó hoạt động nhanh hơn
ps
Trường hợp sử dụng phức tạp hơn
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
Để đọc param tôi giải thích
grep --help | grep -- -i
-n
nếu bạn muốn số dòng. +1 cho câu trả lời đơn giản.
Tôi thường tìm kiếm mã nguồn trong các cấu trúc thư mục phức tạp và tôi thấy hữu ích khi sử dụng:
cd /your/folder/
grep -rHino "your string"
Với các tham số đó, không sử dụng find , tôi có được đường dẫn đầy đủ của tệp và số dòng chứa chuỗi đã chỉ định .
Nó cũng dễ nhớ vì nó BASH es thông qua tìm kiếm của bạn như một rHino :)
Tôi sẽ chỉ ra cách thức này hoạt động với một ví dụ nhanh.
Hãy hiển thị nội dung của tệp bằng cat:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
Và hãy tìm kiếm đệ quy cho tất cả các tệp có chứa chuỗi "iptables -P":
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
Như bạn có thể thấy trong đầu ra, chúng ta có tên tệp: hit row: chuỗi tìm kiếm
Dưới đây là mô tả chi tiết hơn về các tham số được sử dụng:
-r Đối với mỗi toán hạng thư mục, hãy đọc và xử lý tất cả các tệp trong thư mục đó, theo cách đệ quy. Thực hiện theo các liên kết tượng trưng trên dòng lệnh, nhưng bỏ qua các liên kết tượng trưng được gặp đệ quy. Lưu ý rằng nếu không có toán hạng tệp nào được đưa ra, grep sẽ tìm kiếm thư mục làm việc. Điều này giống như tùy chọn '--directories = recurse'.
-i In tên tệp cho mỗi trận đấu. Đây là mặc định khi có nhiều hơn một tệp để tìm kiếm.
-n Tiền tố mỗi dòng đầu ra với số dòng dựa trên 1 trong tệp đầu vào của nó. (-n được chỉ định bởi POSIX.)
-H In tên tệp cho mỗi trận đấu. Đây là mặc định khi có nhiều hơn một tệp để tìm kiếm.
-o Chỉ in các phần trùng khớp (không trống) của các dòng khớp, với mỗi phần như vậy trên một dòng đầu ra riêng biệt. Các dòng đầu ra sử dụng cùng một dấu phân cách làm đầu vào và các dấu phân cách là byte rỗng nếu -z (--null-data) cũng được sử dụng (xem Tùy chọn khác).
Tôi thích
| tìm tập tin | làm cho grep ont tìm tập tin | hiển thị đường dẫn đầy đủ của tập tin
tìm / -type f -exec grep 'một số chuỗi' {} \; -exec echo {} \;
Silver Searcher là một ứng dụng rất nhanh và tiện dụng để tìm kiếm các tập tin và nội dung.
Để giải quyết vấn đề của bạn, lệnh tìm kiếm bạc sẽ như thế này ...
ag 'some string' -l
-l
Chỉ in tên tệp có chứa kết quả khớp (không in các dòng trùng khớp)
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string