Kể từ năm 1974, Linux grep
lệnh đã giúp mọi người tìm thấy các chuỗi trong tệp. Nhưng đôi khi grep
là quá kỹ lưỡng. Dưới đây là một số cách để nói grep
để bỏ qua những thứ khác nhau.
Lệnh grep
Các grep
lệnh tìm kiếm các tệp văn bản tìm kiếm các chuỗi phù hợp với các mẫu tìm kiếm bạn cung cấp trên dòng lệnh. Sức mạnh của grep
nằm trong việc sử dụng các biểu thức chính quy. Những điều này cho phép bạn mô tả những gì bạn đang tìm kiếm, thay vì phải xác định rõ ràng nó.
Ngày sinh của grep
trước Linux. nó được phát triển vào đầu những năm 1970 trên Unix. Nó lấy tên từ dãy phím g / re / p trong ed
trình soạn thảo dòng (tình cờ, phát âm là “ee-dee”). Điều này đại diện cho global, lạigular express tìm kiếm, Pcác dòng phù hợp rint.
grep
nổi tiếng — có lẽ, nổi tiếng — kỹ lưỡng và duy tâm. Đôi khi nó sẽ tìm kiếm các tệp hoặc thư mục mà bạn không muốn lãng phí thời gian vì kết quả có thể khiến bạn không thể nhìn thấy gỗ của cây.
Tất nhiên, có nhiều cách để thống trị grep. Bạn có thể yêu cầu nó bỏ qua các mẫu, tệp và thư mục để grep hoàn thành các tìm kiếm nhanh hơn và bạn không bị ngập trong các kết quả xác thực sai vô nghĩa.
Loại trừ các mẫu
Để tìm kiếm với grep
bạn có thể chuyển đầu vào cho nó từ một số quy trình khác, chẳng hạn như cat
hoặc bạn có thể cung cấp tên tệp làm tham số dòng lệnh cuối cùng.
Chúng tôi đang sử dụng một tệp ngắn có chứa văn bản của bài thơ Jabberwocky, của Lewis Carroll. Trong hai ví dụ này, chúng tôi đang tìm kiếm các dòng phù hợp với cụm từ tìm kiếm “Jabberwock”.
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
Các dòng có chứa các kết quả phù hợp với đầu mối tìm kiếm được liệt kê cho chúng tôi, với phần tử phù hợp trong mỗi dòng được đánh dấu màu đỏ. Đó là tìm kiếm đơn giản. Nhưng nếu chúng ta muốn loại trừ các dòng có chứa từ “Jabberwock” và in phần còn lại thì sao?
Chúng tôi có thể thực hiện điều đó với -v
(đảo ngược so khớp) tùy chọn. Điều này liệt kê các dòng không khớp với cụm từ tìm kiếm.
grep -v "Jabberwock" jabberwocky.text
Các dòng không chứa “Jabberwock” được liệt kê trong cửa sổ đầu cuối.
Chúng tôi có thể loại trừ bao nhiêu điều khoản mà chúng tôi muốn. Hãy lọc ra bất kỳ dòng nào chứa “Jabberwock” và bất kỳ dòng nào chứa “và”. Để đạt được điều này, chúng tôi sẽ sử dụng -e
(biểu thức) tùy chọn. Chúng tôi cần sử dụng nó cho từng mẫu tìm kiếm mà chúng tôi đang sử dụng.
grep -v -e "Jabberwock" -e "and" jabberwocky.txt
Có sự sụt giảm tương ứng về số dòng trong đầu ra.
Nếu chúng ta sử dụng -E
(regexes mở rộng), chúng tôi có thể kết hợp các mẫu tìm kiếm với “|
“, Trong ngữ cảnh này không chỉ ra một đường ống, đó là logic OR
nhà điều hành.
grep -Ev "Jabberwock|and" jabberwocky.txt
Chúng tôi nhận được kết quả chính xác giống như chúng tôi đã làm với lệnh trước đó, dài hơn.
Định dạng của lệnh giống nhau nếu bạn muốn sử dụng mẫu regex thay vì đầu mối tìm kiếm rõ ràng. Lệnh này sẽ loại trừ tất cả các dòng bắt đầu bằng bất kỳ chữ cái nào trong tập hợp “ACHT.”
grep -Ev "^ACHT" jabberwocky.txt
Để xem các dòng có chứa một mẫu nhưng cũng không chứa một mẫu khác, chúng ta có thể phân chia grep
vào trong grep
. Chúng tôi sẽ tìm kiếm tất cả các dòng có chứa từ “Jabberwock” và sau đó lọc ra bất kỳ dòng nào cũng chứa từ “bị giết.”
grep "Jabberwock" jabberwocky.txt | grep -v "slain"
Loại trừ Tệp
Chúng tôi có thể yêu cầu grep
để tìm kiếm một chuỗi hoặc mẫu trong một tập hợp các tệp. Bạn có thể liệt kê từng tệp trên dòng lệnh, nhưng với nhiều tệp, cách tiếp cận này không mở rộng quy mô.
grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
Lưu ý rằng tên của tệp chứa dòng phù hợp được hiển thị ở đầu mỗi dòng đầu ra.
Để giảm việc gõ, chúng ta có thể sử dụng các ký tự đại diện. Nhưng điều đó có thể phản trực giác. Điều này dường như hoạt động.
grep "vorpal" *.txt
Tuy nhiên, trong thư mục này có các tệp TXT khác, không liên quan gì đến bài thơ. Nếu chúng ta tìm kiếm từ “kiếm” với cùng một cấu trúc lệnh, chúng ta sẽ nhận được rất nhiều kết quả sai.
grep "sword" *.txt
Kết quả chúng tôi muốn bị che lấp bởi vô số kết quả sai từ các tệp khác có phần mở rộng TXT.
Từ “vorpal” không khớp với bất cứ điều gì, nhưng “kiếm” được bao gồm trong từ “mật khẩu” nên nó đã được tìm thấy nhiều lần trong một số tệp nhật ký giả.
Chúng tôi cần loại trừ các tệp này. Để làm điều đó, chúng tôi sẽ sử dụng --exclude
quyền mua. Để loại trừ một tệp duy nhất có tên “vol-log-1.txt”, chúng tôi sẽ sử dụng lệnh sau:
grep --exclude=vol-log-1.txt "sword" *.txt
Trong trường hợp này, chúng tôi muốn loại trừ nhiều tệp nhật ký có tên bắt đầu bằng “vol.” Cú pháp chúng ta cần là:
grep --exclude=vol*.txt "sword" *.txt
Khi chúng tôi sử dụng -R
tùy chọn (dereference-recursive) grep
sẽ tìm kiếm toàn bộ cây thư mục cho chúng tôi. Theo mặc định, nó sẽ tìm kiếm qua tất cả các tệp ở các vị trí đó. Có thể có nhiều loại tệp mà chúng tôi muốn loại trừ.
Bên dưới thư mục hiện tại trên máy thử nghiệm này, có các thư mục lồng nhau chứa tệp nhật ký, tệp CSV và tệp MD. Đây là tất cả các loại tệp văn bản mà chúng tôi muốn loại trừ. Chúng tôi có thể sử dụng một --exclude
tùy chọn cho từng loại tệp, nhưng chúng tôi có thể đạt được những gì chúng tôi muốn hiệu quả hơn bằng cách nhóm các loại tệp.
Lệnh này loại trừ tất cả các tệp có phần mở rộng CSV hoặc MD và tất cả các tệp TXT có tên bắt đầu bằng “vol” hoặc “log”.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /home/dave/data/
Loại trừ Thư mục
Nếu các tệp chúng tôi muốn bỏ qua được chứa trong các thư mục và không có tệp nào trong các thư mục đó mà chúng tôi muốn tìm kiếm, chúng tôi có thể loại trừ toàn bộ các thư mục đó.
Khái niệm này rất giống với khái niệm loại trừ tệp, ngoại trừ chúng tôi sử dụng --exclude-dir
tùy chọn và đặt tên cho các thư mục để bỏ qua.
grep -R --exclude-dir=backup "vorpal" /home/dave/data
Chúng tôi đã loại trừ thư mục “sao lưu”, nhưng chúng tôi vẫn đang tìm kiếm qua một thư mục khác có tên là “backup2”.
Sẽ không có gì ngạc nhiên khi chúng ta có thể sử dụng --exclude-dir
tùy chọn nhiều lần trong một lệnh duy nhất. Lưu ý rằng đường dẫn đến các thư mục bị loại trừ phải được cung cấp tương ứng với thư mục sẽ bắt đầu tìm kiếm. Không sử dụng đường dẫn tuyệt đối từ thư mục gốc của hệ thống tệp.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data
Chúng tôi cũng có thể sử dụng các nhóm. Chúng ta có thể đạt được điều tương tự một cách ngắn gọn hơn với:
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
Bạn có thể kết hợp loại trừ tệp và thư mục trong cùng một lệnh. Nếu bạn muốn loại trừ tất cả các tệp khỏi một thư mục và loại trừ một số loại tệp nhất định khỏi các thư mục là đã tìm kiếm, sử dụng cú pháp này:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data
Đôi khi chính là thứ bạn bỏ đi
Đôi khi với grep
nó có thể cảm thấy như bạn đang cố mò kim đáy bể. nó tạo ra sự khác biệt lớn để loại bỏ đống cỏ khô.