Bạn đã từng phải tìm kiếm một chuỗi hoặc mẫu cụ thể trong một tệp tin, nhưng không biết bắt đầu tìm ở đâu? Vậy thì, lệnh grep chính là cứu trợ! grep là một công cụ tìm kiếm mẫu tệp tin mạnh mẽ được trang bị trong mọi bản phân phối Linux. Nếu vì bất kỳ lý do nào mà nó không được cài đặt trên hệ thống của bạn, bạn có thể dễ dàng cài đặt nó thông qua trình quản lý gói của bạn như được hiển thị.
$ sudo apt install grep [On Debian, Ubuntu and Mint]
$ sudo yum install grep [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux]
$ sudo emerge -a sys-apps/grep [On Gentoo Linux]
$ sudo apk add grep [On Alpine Linux]
$ sudo pacman -S grep [On Arch Linux]
$ sudo zypper install grep [On OpenSUSE]
Tôi đã thấy cách dễ nhất để làm quen với lệnh grep là chỉ cần nhảy vào và sử dụng một số ví dụ thực tế.
1. Tìm kiếm và tìm file trong Linux
Hãy giả sử rằng bạn vừa mới cài đặt một bản sao mới của Ubuntu trên máy tính của bạn và bạn sẽ thử viết các kịch bản Python.
Bạn đã tìm kiếm trên web và thấy rằng có hai phiên bản khác nhau của Python được sử dụng, và bạn không biết phiên bản nào của Python được cài đặt trên Ubuntu bởi trình cài đặt, hoặc nó đã cài bất kỳ module nào hay chưa.
Chỉ cần chạy lệnh dpkg sau đây kèm grep như được hiển thị:
dpkg -l | grep -i python
Tìm tập tin bằng lệnh Grep
Đầu tiên, chúng ta chạy lệnh dpkg –l
, để liệt kê các gói *.deb
đã được cài đặt trên hệ thống của bạn. Tiếp theo, chúng ta ống kết xuất đó tới grep -i python
, nghĩa là chỉ đơn giản là “đi tới grep và lọc và trả về mọi thứ có chứa ‘python’ trong nó.”
Không phân biệt chữ hoa/thường, -i
được sử dụng để bỏ qua chữ hoa/thường, vì grep có phân biệt chữ hoa/thường. Việc sử dụng tùy chọn -i
là một thói quen tốt, trừ khi bạn đang cố gắng thực hiện tìm kiếm cụ thể hơn.
2. Tìm kiếm và lọc tệp trong Linux
grep cũng có thể được sử dụng để tìm kiếm và lọc trong các tệp tin cá nhân hoặc nhiều tệp tin. Hãy xem ví dụ sau:
Bạn gặp một số vấn đề với Máy chủ Web Apache của bạn và bạn đã tham gia vào một trong số nhiều diễn đàn tuyệt vời trên mạng để xin một số sự trợ giúp.
Người tốt bụng trả lời bạn đã yêu cầu bạn gửi nội dung của tệp tin /etc/apache2/apache2.conf của bạn. Có lẽ dễ hơn cho bạn và mọi người nếu bạn chỉ muốn xem các dòng không được chú thích? Vậy thì, bạn hoàn toàn có thể! Chỉ cần chạy lệnh này:
grep -v ^\# /etc/apache2/apache2.conf | grep .
Tùy chọn -v
không cho phép grep lấy kết quả ngược, có nghĩa là thay vì in ra các dòng khớp, nó sẽ in ra các dòng không khớp với biểu thức, trong trường hợp này, các dòng chú thích #
.
Lưu ý rằng chúng ta cũng đã sử dụng grep .
ở cuối để ẩn kết quả của các dòng trống. Điều này cho phép chúng ta chỉ nhìn thấy cấu hình trong terminal của chúng ta.
In các dòng không chú thích trong Linux
3. Tìm tất cả các tệp .mp3 trong Linux
grep cũng có thể rất hữu ích để lọc từ stdout. Ví dụ, hãy tưởng tượng rằng bạn có một thư mục đầy những tệp tin âm nhạc trong nhiều định dạng khác nhau.
Bạn muốn tìm tất cả các tệp tin *.mp3
của nghệ sĩ JayZ, nhưng bạn không muốn có bất kỳ bài hát remix. Sử dụng một lệnh find với một vài ống grep sẽ giúp bạn:
# find . -name “*.mp3” | grep –i JayZ | grep –vi “remix”
Trong ví dụ này, chúng tôi sử dụng find để in tất cả các tệp tin có phần mở rộng *.mp3
, liên kết nó đến grep –i
để lọc và in ra tất cả các tệp tin chứa tên “JayZ”, và sau đó dùng một ống khác tới grep –vi
để loại bỏ và không in ra tất cả các tên tệp chứa chuỗi (bất kỳ chữ hoa/thường) “remix”.
4. Hiển thị số dòng trước hoặc sau chuỗi tìm kiếm
Hai tùy chọn khác là -A
và -B
để hiển thị dòng trùng khớp và một số dòng trước hoặc sau chuỗi tìm kiếm.
Mặc dù trang man đưa ra một giải thích chi tiết hơn, nhưng tôi thấy nó dễ nhớ nhất khi nhớ tùy chọn là -A
= after, và -B
= before:
ifconfig | grep -A 4 inet
ifconfig | grep -B 2 UP
In số dòng trước và sau chuỗi
5. In số dòng xung quanh Match
Tùy chọn -C
của grep tương tự, nhưng thay vì in ra các dòng trước hoặc sau chuỗi, nó in ra các dòng cả hai hướng:
# ifconfig | grep -C 2 lo
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 15314 bytes 1593769 (1.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
6. Đếm số trận đấu
Tương tự như ống kết xuất một chuỗi grep đến đếm số từ (lệnh wc), tùy chọn tích hợp sẵn trong grep cũng có thể thực hiện công việc tương tự:
# ifconfig | grep -c inet6
7. Tìm kiếm tệp theo chuỗi đã cho trong Linux
Tùy chọn –n
cho grep rất hữu ích khi gỡ lỗi các tệp tin trong quá trình biên dịch. Nó hiển thị số dòng trong tệp tin của chuỗi tìm kiếm:
# grep -n "main" setup.py
8. Tìm kiếm đệ quy một chuỗi trong tất cả các thư mục
Nếu bạn muốn tìm kiếm một chuỗi trong thư mục hiện tại cùng với tất cả các thư mục con, bạn có thể chỉ định tùy chọn –r
để tìm kiếm theo cách đệ quy:
# grep -r “function” *
9. Tìm kiếm toàn bộ mẫu
Sử dụng tùy chọn -w
của grep tìm kiếm toàn bộ mẫu trong chuỗi. Ví dụ, sử dụng:
# ifconfig | grep -w "RUNNING"
Sẽ in ra dòng chứa mẫu trong dấu ngoặc kép. Ngược lại, nếu bạn thử với:
# ifconfig | grep -w "RUN"
Tìm toàn bộ mẫu
Không có gì sẽ được trả về vì chúng ta không tìm kiếm một mẫu, mà là một từ nguyên.
10. Tìm kiếm một chuỗi trong Tệp Gzipped
Đáng nhắc đến là các biến thể của grep. Đầu tiên là zgrep, giống như zcat, được sử dụng cho các tệp nén gzipped. Nó có cùng các tùy chọn với grep và được sử dụng theo cách tương tự:
# zgrep -i error /var/log/syslog.2.gz
Chuỗi tìm kiếm trong tệp được nén
11. So khớp các biểu thức chính quy trong tệp
Lệnh egrep là biến thể khác nhận dạng các ký tự siêu-mẫu bổ sung như at + ? |
và ()
.
Lệnh egrep là rất hữu ích để tìm kiếm các tệp nguồn và các phần mã khác, khi cần thiết. Nó có thể được gọi từ grep bình thường bằng cách chỉ định tùy chọn -E
.
grep -E
12. Tìm kiếm một chuỗi mẫu cố định
Lệnh fgrep tìm kiếm một tệp tin hoặc danh sách các tệp tin cho một chuỗi mẫu cố định. Nó giống như grep -F
. Một cách thông thường để sử dụng fgrep là chuyển một tệp tin các mẫu cho nó:
fgrep –f file_full_of_patterns.txt file_to_search.txt
Đây chỉ là một điểm xuất phát cơ bản với lệnh grep, nhưng như bạn có thể thấy, nó rất hữu ích cho một loạt các mục đích. Ngoài những lệnh đơn giản một dòng chúng tôi đã thực hiện, grep có thể được sử dụng để viết các công việc cron mạnh mẽ, và các tập tin shell rắn rỏi, để bắt đầu.