Lệnh Grep Trong Linux (tìm Văn Bản Trong Tệp) - Android 2022

Lệnh grep là viết tắt của cụm từ in biểu thức chính quy toàn cầu, là một trong những lệnh mạnh nhất và được sử dụng phổ biến nhất trong Linux.

Grep tìm kiếm một hoặc nhiều tệp đầu vào cho các dòng khớp với một mẫu nhất định và ghi từng dòng khớp vào đầu ra tiêu chuẩn. Nếu không có tệp nào được chỉ định, grep đọc từ đầu vào tiêu chuẩn, thường là đầu ra của lệnh khác.

Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách sử dụng grep thông qua các ví dụ thực tế và giải thích chi tiết về các tùy chọn grep GNU phổ biến nhất.

Cú pháp lệnh Grep

Trước khi đi vào cách sử dụng grep , hãy bắt đầu bằng cách xem lại cú pháp cơ bản.

Các biểu thức tiện ích grep có dạng sau:

grep PATTERN

Các mục trong ngoặc vuông là tùy chọn.

  • OPTIONS - Không hoặc nhiều tùy chọn. Grep cung cấp một số tùy chọn kiểm soát hành vi của nó. PATTERN - Mẫu tìm kiếm. FILE - Không hoặc nhiều tên tệp đầu vào.

Để có thể tìm kiếm tệp, người dùng đang chạy lệnh phải có quyền truy cập đọc vào tệp.

Cách sử dụng grep để Tìm kiếm Chuỗi trong Tệp

Cách sử dụng cơ bản nhất của grep là tìm kiếm một chuỗi (văn bản) trong một tệp.

Ví dụ: để hiển thị các dòng từ tệp /etc/passwd có chứa chuỗi bash bạn có thể sử dụng lệnh sau:

grep bash /etc/passwd

Đầu ra sẽ trông giống như thế này:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Nếu chuỗi bao gồm khoảng trắng, bạn cần đặt nó trong dấu ngoặc kép đơn hoặc kép:

grep "Gnome Display Manager" /etc/passwd

Đảo ngược trận đấu (không bao gồm)

Để hiển thị các dòng không khớp với mẫu, sử dụng tùy chọn -v (hoặc --invert-match ).

Ví dụ: để hiển thị các dòng từ tệp /etc/passwd không chứa chuỗi nologin bạn có thể sử dụng lệnh sau:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Cách sử dụng Grep để tìm kiếm chuỗi trong đầu ra lệnh

Thay vì chỉ định các tệp đầu vào, bạn có thể chuyển đầu ra của một lệnh khác sang grep , và sau đó chỉ hiển thị các dòng khớp với một mẫu nhất định.

Ví dụ: để tìm hiểu các quy trình đang chạy trên hệ thống của bạn dưới dạng www-data người dùng www-data bạn có thể sử dụng lệnh ps sau:

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Bạn cũng có thể xâu chuỗi nhiều đường ống theo lệnh. Như bạn có thể thấy trong đầu ra ở trên, cũng có một dòng chứa quá trình grep . Nếu bạn không muốn dòng đó được hiển thị, hãy chuyển đầu ra sang một thể hiện grep khác như hiển thị bên dưới.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Tìm kiếm đệ quy

Để tìm kiếm đệ quy một mẫu, hãy sử dụng tùy chọn -r (hoặc --recursive ). Điều này sẽ tìm kiếm thông qua tất cả các tệp trong thư mục được chỉ định, bỏ qua các liên kết tượng trưng được gặp đệ quy. Để theo tất cả các liên kết tượng trưng, ​​sử dụng tùy chọn -R (hoặc --dereference-recursive ).

Trong ví dụ sau, chúng tôi đang tìm kiếm chuỗi linuxize.com trong tất cả các tệp trong thư mục /etc :

grep -r linuxize.com /etc

Lệnh sẽ in các dòng khớp với tiền tố của đường dẫn đầy đủ đến tệp.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Nếu thay vào đó -r bạn sử dụng tùy chọn -R grep sẽ theo tất cả các liên kết tượng trưng:

grep -R linuxize.com /etc

Lưu ý dòng cuối cùng của đầu ra. Dòng đó không được in trong ví dụ trên vì các tệp bên trong thư mục sites-enabled của Nginx là sites-enabled liên kết tượng trưng đến các tệp cấu hình bên trong thư mục sites-available của sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Chỉ hiển thị tên tệp

Để chặn đầu ra grep mặc định và chỉ in tên của các tệp chứa mẫu phù hợp, bạn có thể sử dụng tùy chọn -l (hoặc --files-with-matches ).

Ví dụ: để tìm kiếm trong tất cả các tệp kết thúc bằng .conf trong thư mục làm việc hiện tại và chỉ in tên của các tệp chứa chuỗi linuxize.com :

grep -l linuxize.com *.conf

Đầu ra sẽ trông giống như thế này:

tmux.conf haproxy.conf

Tùy chọn -l thường được sử dụng kết hợp với tùy chọn đệ quy -R :

grep -Rl linuxize.com /tmp

Tìm kiếm không nhạy cảm

Theo mặc định, grep biệt chữ hoa chữ thường. Điều này có nghĩa là các ký tự chữ hoa và chữ thường được coi là khác biệt.

Để bỏ qua trường hợp khi tìm kiếm, sử dụng tùy chọn -i (hoặc --ignore-case ).

Ví dụ: khi tìm kiếm Zebra mà không có tùy chọn nào, lệnh sau sẽ không hiển thị bất kỳ đầu ra nào, tức là có các dòng khớp:

grep Zebra /usr/share/words

Nhưng nếu bạn thực hiện tìm kiếm không phân biệt chữ hoa chữ thường bằng tùy chọn -i , nó sẽ khớp cả chữ in hoa và chữ thường:

grep -i Zebra /usr/share/words

Xác định kiểu chữ nổi Zebra Zebra sẽ phù hợp với kiểu ngựa vằn, chữ ZEbrA, hoặc bất kỳ sự kết hợp nào khác của chữ in hoa và chữ thường cho chuỗi đó.

zebra zebra's zebras

Tìm kiếm từ đầy đủ

Khi tìm kiếm trong các trò chơi điện tử, grep cũng sẽ in các dòng trong đó kiểu chữ gnu phạm được nhúng trong các từ lớn hơn, chẳng hạn như là cy cyusus hay hoặc Magn Magn.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Để chỉ trả về những dòng có chuỗi được chỉ định là toàn bộ từ (được bao quanh bởi các ký tự không phải từ), hãy sử dụng tùy chọn -w (hoặc --word-regexp ).

Các ký tự từ bao gồm các ký tự chữ và số ( az , AZ và 0-9 ) và dấu gạch dưới ( _ ). Tất cả các nhân vật khác được coi là nhân vật không từ.

grep -w gnu /usr/share/words

gnu

Hiển thị số dòng

Để hiển thị số lượng dòng chứa chuỗi khớp với mẫu, sử dụng tùy chọn -n (hoặc --line-number ). Khi sử dụng tùy chọn này, grep sẽ in các kết quả khớp với đầu ra tiêu chuẩn có tiền tố với số dòng được tìm thấy trên đó.

Ví dụ: để hiển thị các dòng từ tệp /etc/services chứa chuỗi bash tiền tố với số dòng phù hợp, bạn có thể sử dụng lệnh sau:

grep -n 10000 /etc/services

Đầu ra bên dưới cho chúng ta thấy rằng các kết quả khớp được tìm thấy trên các dòng 10423 và 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Đếm các trận đấu

Để in một số dòng phù hợp với đầu ra tiêu chuẩn, sử dụng tùy chọn -c (hoặc --count ).

Trong ví dụ dưới đây, chúng tôi đang đếm số tài khoản có /usr/bin/zsh làm vỏ.

grep -c '/usr/bin/zsh' /etc/passwd

4

Tìm kiếm nhiều chuỗi (mẫu)

Có thể tham gia hai hoặc nhiều mẫu tìm kiếm bằng toán tử OR | .

Theo mặc định, grep diễn giải mẫu như một biểu thức chính quy cơ bản trong đó các ký tự meta như | mất ý nghĩa đặc biệt của chúng, và các phiên bản gạch chéo của chúng phải được sử dụng.

Trong ví dụ dưới đây, chúng tôi đang tìm kiếm tất cả các lần xuất hiện của các từ fatal , error và critical trong tệp lỗi nhật ký Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Chế độ yên lặng

--quiet (hoặc --quiet ) bảo grep không ghi bất cứ điều gì vào thiết bị đầu cuối (đầu ra tiêu chuẩn). Nếu một kết quả khớp được tìm thấy, lệnh sẽ thoát với trạng thái 0 . Điều này hữu ích khi sử dụng grep trong shell script nơi bạn muốn kiểm tra xem một tệp có chứa chuỗi hay không và thực hiện một hành động nhất định tùy thuộc vào kết quả.

Dưới đây là một ví dụ về việc sử dụng grep trong chế độ im lặng làm lệnh kiểm tra trong câu lệnh if:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Biểu thức chính quy cơ bản

GNU Grep có hai bộ tính năng biểu thức chính quy, Cơ bản và Mở rộng. Theo mặc định, grep diễn giải mẫu như một biểu thức chính quy cơ bản.

Khi được sử dụng trong chế độ biểu thức chính quy cơ bản, tất cả các ký tự khác ngoại trừ các ký tự meta, thực sự là các biểu thức chính quy khớp với chính chúng. Dưới đây là danh sách các ký tự meta được sử dụng phổ biến nhất:

  • Sử dụng biểu tượng ^ (dấu mũ) để khớp với biểu thức ở đầu một dòng. Trong ví dụ sau, chuỗi ^kangaroo sẽ chỉ khớp nếu nó xuất hiện ở đầu dòng.

    grep "^kangaroo" file.txt

    Sử dụng ký hiệu $ (đô la) để khớp với biểu thức ở cuối dòng. Trong ví dụ sau, chuỗi kangaroo$ sẽ chỉ khớp nếu nó xuất hiện ở cuối dòng.

    grep "kangaroo$" file.txt

    Sử dụng . biểu tượng (dấu chấm) để khớp với bất kỳ ký tự đơn nào. Ví dụ: để khớp với bất cứ thứ gì bắt đầu bằng kan thì có hai ký tự và kết thúc bằng chuỗi roo , bạn có thể sử dụng mẫu sau:

    grep "kan..roo" file.txt

    Sử dụng (ngoặc) để khớp với bất kỳ ký tự đơn nào được đặt trong ngoặc. Ví dụ: tìm các dòng có chứa dấu accept hoặc accent , bạn có thể sử dụng mẫu sau:

    grep "accet" file.txt

    Sử dụng (ngoặc) để khớp với bất kỳ ký tự đơn nào được đặt trong ngoặc. Mẫu sau sẽ khớp với bất kỳ tổ hợp chuỗi nào có chứa co(any_letter_except_l)a , chẳng hạn như coca , cobalt , v.v., nhưng sẽ không khớp với các dòng có chứa cola , grep "coa" file.txt

Để thoát khỏi ý nghĩa đặc biệt của ký tự tiếp theo, hãy sử dụng biểu tượng \ (dấu gạch chéo ngược).

Biểu thức chính quy mở rộng

Để diễn giải mẫu dưới dạng biểu thức chính quy mở rộng, hãy sử dụng tùy chọn -E (hoặc --extended-regexp ). Các biểu thức chính quy mở rộng bao gồm tất cả các ký tự meta cơ bản, cùng với các ký tự meta bổ sung để tạo các mẫu tìm kiếm phức tạp và mạnh mẽ hơn. Dưới đây là một số ví dụ:

  • Khớp và trích xuất tất cả các địa chỉ email từ một tệp nhất định:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Khớp và trích xuất tất cả các địa chỉ IP hợp lệ từ một tệp đã cho:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Tùy chọn -o được sử dụng để chỉ in chuỗi phù hợp.

In dòng trước trận đấu

Để in một số dòng cụ thể trước khi khớp dòng, sử dụng tùy chọn -B (hoặc --before-context ).

Ví dụ: để hiển thị năm dòng ngữ cảnh hàng đầu trước khi khớp các dòng, bạn sẽ sử dụng lệnh sau:

grep -B 5 root /etc/passwd

Dòng in sau một trận đấu

Để in một số dòng cụ thể sau khi khớp các dòng, sử dụng tùy chọn -A (hoặc --after-context ).

Ví dụ: để hiển thị năm dòng ngữ cảnh theo sau các dòng khớp, bạn sẽ sử dụng lệnh sau:

grep -A 5 root /etc/passwd

Phần kết luận

Lệnh grep cho phép bạn tìm kiếm một mẫu bên trong các tệp. Nếu khớp nếu tìm thấy, grep sẽ in các dòng chứa mẫu đã chỉ định.

Có nhiều hơn nữa để tìm hiểu về Grep tại trang Hướng dẫn sử dụng của Grep.

thiết bị đầu cuối grep

Từ khóa » Cách Dùng Lệnh Grep Trong Linux