Cách sử dụng lệnh grep trên Linux
Linux grep
lệnh là một tiện ích đối sánh chuỗi và mẫu hiển thị các dòng phù hợp từ nhiều tệp. Nó cũng hoạt động với đầu ra đường ống từ các lệnh khác. Chúng tôi chỉ cho bạn cách làm.
Câu chuyện đằng sau grep
Các grep
lệnh nổi tiếng trong giới Linux và Unix vì ba lý do. Thứ nhất, nó cực kỳ hữu ích. Thứ hai, sự phong phú của các lựa chọn có thể bị áp đảo. Thứ ba, nó được viết qua đêm để đáp ứng một nhu cầu cụ thể. Hai đầu tiên là nổ trên; thứ ba là hơi tắt.
Ken Thompson đã trích xuất các khả năng tìm kiếm biểu thức chính quy từ ed
biên tập viên (phát âm là ee-dee) và tạo một chương trình nhỏ — để sử dụng cho riêng mình — để tìm kiếm qua các tệp văn bản. Trưởng bộ phận của ông tại Bell Labs, Doug Mcilroy, đã tiếp cận Thompson và mô tả vấn đề mà một đồng nghiệp của ông, Lee McMahon, đang gặp phải.
McMahon đang cố gắng xác định tác giả của các bài báo theo chủ nghĩa Liên bang thông qua phân tích văn bản. Anh ta cần một công cụ có thể tìm kiếm các cụm từ và chuỗi trong các tệp văn bản. Thompson đã dành khoảng một giờ vào buổi tối hôm đó để biến công cụ của mình thành một tiện ích chung có thể được người khác sử dụng và đổi tên nó thành grep
. Anh ấy lấy tên từ ed
chuỗi lệnh g / re / p
, được dịch là “tìm kiếm cụm từ thông dụng toàn cầu”.
Bạn có thể xem Thompson nói chuyện với Brian Kernighan về sự ra đời của grep
.
Tìm kiếm đơn giản với grep
Để tìm kiếm một chuỗi trong một tệp, hãy chuyển cụm từ tìm kiếm và tên tệp vào dòng lệnh:
Các dòng phù hợp được hiển thị. Trong trường hợp này, nó là một dòng duy nhất. Văn bản phù hợp được đánh dấu. Điều này là do trên hầu hết các bản phân phối grep
được bí danh là:
bí danh grep = "grep --colour = auto"
Hãy xem các kết quả có nhiều dòng trùng khớp. Chúng tôi sẽ tìm từ "Trung bình" trong tệp nhật ký ứng dụng. Bởi vì chúng tôi không thể nhớ liệu từ có ở dạng chữ thường trong tệp nhật ký hay không, chúng tôi sẽ sử dụng -Tôi
(bỏ qua trường hợp) tùy chọn:
grep -i Trung bình geek-1.log
Mọi dòng phù hợp được hiển thị, với văn bản phù hợp được đánh dấu trong mỗi dòng.
Chúng ta có thể hiển thị các dòng không khớp bằng cách sử dụng tùy chọn -v (invert match).
grep -v Mem geek-1.log
Không có điểm nổi bật vì đây là những đường không khớp.
Chúng tôi có thể gây ra grep
hoàn toàn im lặng. Kết quả được chuyển tới shell dưới dạng giá trị trả về từ grep
. Kết quả bằng 0 có nghĩa là chuỗi đã được tìm thấy và kết quả của một có nghĩa là nó không phải tìm. Chúng tôi có thể kiểm tra mã trả lại bằng cách sử dụng $?
các thông số đặc biệt:
grep -q trung bình geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?
Tìm kiếm đệ quy với grep
Để tìm kiếm qua các thư mục và thư mục con lồng nhau, hãy sử dụng tùy chọn -r (đệ quy). Lưu ý rằng bạn không cung cấp tên tệp trên dòng lệnh, bạn phải cung cấp đường dẫn. Ở đây chúng tôi đang tìm kiếm trong thư mục hiện tại “.” và bất kỳ thư mục con nào:
Ghi nhớ grep -r -i.
Đầu ra bao gồm thư mục và tên tệp của mỗi dòng phù hợp.
Chúng tôi có thể làmgrep
theo các liên kết tượng trưng bằng cách sử dụng -R
(đệ quy dereference) tùy chọn. Chúng tôi có một liên kết tượng trưng trong thư mục này, được gọi là thư mục nhật ký
. Nó chỉ đến / home / dave / log
.
ls -l nhật ký-thư mục
Hãy lặp lại tìm kiếm cuối cùng của chúng ta với-R
(đệ quy dereference) tùy chọn:
Ghi nhớ grep -R -i.
Liên kết tượng trưng được theo sau và thư mục mà nó trỏ đến được tìm kiếm bởi grep
quá.
Tìm kiếm toàn bộ từ
Theo mặc định, grep
sẽ khớp với một dòng nếu mục tiêu tìm kiếm xuất hiện ở bất kỳ đâu trong dòng đó, kể cả bên trong một chuỗi khác. Nhìn vào ví dụ này. Chúng tôi sẽ tìm kiếm từ “miễn phí”.
grep -i miễn phí geek-1.log
Kết quả là các dòng có chuỗi "tự do", nhưng chúng không phải là các từ riêng biệt. Chúng là một phần của chuỗi “MemFree.”
Ép buộc grep
để chỉ đối sánh các "từ" riêng biệt, hãy sử dụng -w
(từ regexp) tùy chọn.
grep -w -i miễn phí geek-1.log
echo $?
Lần này không có kết quả vì cụm từ tìm kiếm “miễn phí” không xuất hiện trong tệp dưới dạng một từ riêng biệt.
Sử dụng Nhiều Cụm từ Tìm kiếm
Các -E
(regexp mở rộng) tùy chọn cho phép bạn tìm kiếm nhiều từ. (Các -E
tùy chọn thay thế tùy chọn không được dùng nữa egrep
phiên bản của grep
.)
Lệnh này tìm kiếm hai cụm từ tìm kiếm, “trung bình” và “memfree”.
grep -E -w -i "average | memfree" geek-1.log
Tất cả các dòng phù hợp được hiển thị cho từng cụm từ tìm kiếm.
Bạn cũng có thể tìm kiếm nhiều cụm từ không nhất thiết phải là toàn bộ từ, nhưng chúng cũng có thể là toàn bộ từ.
Các -e
(các mẫu) tùy chọn cho phép bạn sử dụng nhiều cụm từ tìm kiếm trên dòng lệnh. Chúng tôi đang sử dụng tính năng dấu ngoặc biểu thức chính quy để tạo một mẫu tìm kiếm. Nó nói grep
để khớp với bất kỳ ký tự nào trong dấu ngoặc vuông “[].” Điều này có nghĩa là grep
sẽ khớp với “kB” hoặc “KB” khi nó tìm kiếm.
Cả hai chuỗi đều được so khớp và trên thực tế, một số dòng chứa cả hai chuỗi.
Đối sánh chính xác các dòng
Các-x
(dòng regexp) sẽ chỉ khớp với các dòng mà toàn bộ dòng khớp với cụm từ tìm kiếm. Hãy tìm kiếm dấu ngày và giờ mà chúng tôi biết chỉ xuất hiện một lần trong tệp nhật ký:
grep -x "20-Jan - 06 15:24:35" geek-1.log
Dòng duy nhất phù hợp được tìm thấy và hiển thị.
Ngược lại với điều đó là chỉ hiển thị các dòng đừng trận đấu. Điều này có thể hữu ích khi bạn đang xem các tệp cấu hình. Nhận xét rất hay, nhưng đôi khi khó phát hiện cài đặt thực tế trong số đó. Đây là / etc / sudoers
tập tin:
Chúng tôi có thể lọc ra các dòng bình luận như thế này một cách hiệu quả:
sudo grep -v "#" / etc / sudoers
Điều đó dễ dàng hơn để phân tích cú pháp.
Chỉ hiển thị văn bản phù hợp
Có thể có một số trường hợp bạn không muốn xem toàn bộ dòng đối sánh mà chỉ xem văn bản phù hợp. Các -o
(chỉ kết hợp) tùy chọn thực hiện điều đó.
grep -o MemFree geek-1.log
Màn hình giảm xuống chỉ hiển thị văn bản phù hợp với cụm từ tìm kiếm, thay vì toàn bộ dòng phù hợp.
Đếm với grep
grep
không chỉ là văn bản, nó còn có thể cung cấp thông tin số. Chúng tôi có thể làm grep
tính cho chúng tôi theo những cách khác nhau. Nếu chúng ta muốn biết bao nhiêu lần một cụm từ tìm kiếm xuất hiện trong một tệp, chúng ta có thể sử dụng -c
(đếm) tùy chọn.
grep -c trung bình geek-1.log
grep
báo cáo rằng cụm từ tìm kiếm xuất hiện 240 lần trong tệp này.
Bạn có thể làm grep
hiển thị số dòng cho mỗi dòng phù hợp bằng cách sử dụng -n
(số dòng) tùy chọn.
grep -n Jan geek-1.log
Số dòng cho mỗi dòng phù hợp được hiển thị ở đầu dòng.
Để giảm số lượng kết quả được hiển thị, hãy sử dụng -m
(số lượng tối đa). Chúng tôi sẽ giới hạn đầu ra ở năm dòng phù hợp:
grep -m5 -n Jan geek-1.log
Thêm ngữ cảnh
Có thể thấy một số dòng bổ sung — có thể là các dòng không khớp — cho mỗi dòng phù hợp thường rất hữu ích. nó có thể giúp phân biệt đường nào phù hợp là đường bạn quan tâm.
Để hiển thị một số dòng sau dòng phù hợp, hãy sử dụng tùy chọn -A (sau ngữ cảnh). Chúng tôi yêu cầu ba dòng trong ví dụ này:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log
Để xem một số dòng từ trước dòng phù hợp, hãy sử dụng -B
(ngữ cảnh trước) tùy chọn.
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log
Và để bao gồm các dòng từ trước và sau dòng phù hợp, hãy sử dụng -C
(ngữ cảnh) tùy chọn.
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log
Hiển thị các tệp phù hợp
Để xem tên của các tệp có chứa cụm từ tìm kiếm, hãy sử dụng -l
(tệp có khớp) tùy chọn. Để tìm ra tệp mã nguồn C nào chứa các tham chiếu đến sl.h
tệp tiêu đề, sử dụng lệnh này:
grep -l "sl.h" * .c
Tên tệp được liệt kê, không phải các dòng trùng khớp.
Và tất nhiên, chúng tôi có thể tìm kiếm các tệp không chứa cụm từ tìm kiếm. Các -L
(tệp không khớp) tùy chọn thực hiện điều đó.
grep -L "sl.h" * .c
Bắt đầu và Kết thúc Dòng
Chúng ta có thể buộc grep
để chỉ hiển thị các kết quả phù hợp ở đầu hoặc cuối dòng. Toán tử biểu thức chính quy “^” khớp với đầu dòng. Trên thực tế, tất cả các dòng trong tệp nhật ký sẽ chứa khoảng trắng, nhưng chúng tôi sẽ tìm kiếm các dòng có khoảng trắng là ký tự đầu tiên của chúng:
grep "^" geek-1.log
Các dòng có khoảng trắng là ký tự đầu tiên - ở đầu dòng - được hiển thị.
Để khớp với cuối dòng, hãy sử dụng toán tử biểu thức chính quy “$”. Chúng tôi sẽ tìm kiếm các dòng kết thúc bằng “00.”
grep "00 $" geek-1.log
Màn hình hiển thị các dòng có "00" là ký tự cuối cùng của chúng.
Sử dụng Pipes với grep
Tất nhiên, bạn có thể chuyển đầu vào đến grep
, chuyển đầu ra từ grep
vào một chương trình khác và có grep
nép mình vào giữa một chuỗi ống.
Giả sử chúng tôi muốn xem tất cả các lần xuất hiện của chuỗi “ExtractParameters” trong các tệp mã nguồn C của chúng tôi. Chúng tôi biết rằng sẽ có khá nhiều, vì vậy chúng tôi chuyển đầu ra vào ít hơn
:
grep "ExtractParameters" * .c | ít hơn
Đầu ra được trình bày trong ít hơn
.
Điều này cho phép bạn duyệt qua danh sách tệp và sử dụng ít hơn
cơ sở tìm kiếm.
Nếu chúng tôi chuyển đầu ra từ grep
thành wc
và sử dụng -l
(dòng), chúng ta có thể đếm số dòng trong các tệp mã nguồn có chứa “ExtractParameters”. (Chúng tôi có thể đạt được điều này bằng cách sử dụng grep
-c
(đếm) tùy chọn, nhưng đây là một cách gọn gàng để chứng minh đường ống ra khỏi grep
.)
grep "ExtractParameters" * .c | wc -l
Với lệnh tiếp theo, chúng tôi sẽ chuyển đầu ra từ ls
thành grep
và chuyển đầu ra từ grep
thành sắp xếp
. Chúng tôi đang liệt kê các tệp trong thư mục hiện tại, chọn những tệp có chuỗi “Tháng 8” và sắp xếp chúng theo kích thước tệp:
ls -l | grep "Tháng 8" | sắp xếp + 4n
Hãy phá vỡ điều đó:
- ls -l: Thực hiện một danh sách định dạng dài của các tệp bằng cách sử dụng
ls
. - grep “Tháng 8”: Chọn các dòng từ
ls
danh sách có "Tháng 8" trong đó. Lưu ý rằng điều này cũng sẽ tìm thấy các tệp có "Tháng 8" trong tên của chúng. - sắp xếp + 4n: Sắp xếp đầu ra từ grep trên cột thứ tư (kích thước tệp).
Chúng tôi nhận được danh sách được sắp xếp của tất cả các tệp được sửa đổi vào tháng 8 (bất kể năm nào), theo thứ tự tăng dần về kích thước tệp.
LIÊN QUAN:Cách sử dụng Pipes trên Linux
grep: Ít một lệnh hơn, nhiều hơn một đồng minh
grep
là một công cụ tuyệt vời để bạn sử dụng. Nó có từ năm 1974 và vẫn đang tiếp tục phát triển mạnh mẽ bởi vì chúng ta cần những gì nó làm, và không có gì tốt hơn.
Khớp nối grep
với một số biểu thức chính quy-fu thực sự đưa nó lên cấp độ tiếp theo.
LIÊN QUAN:Cách Sử dụng Cụm từ Thông dụng Cơ bản để Tìm kiếm Tốt hơn và Tiết kiệm Thời gian