Nó nhanh, mạnh mẽ, và chính tên của nó cũng cho thấy nó thực hiện một tác vụ kỹ thuật: grep. Với công cụ làm việc không thể thiếu này trên dòng lệnh, bạn có thể nhanh chóng tìm thấy văn bản ẩn trong các tệp của mình. Hiểu về grep là bước đầu tiên để gia nhập hội những bậc thầy dòng lệnh.
Tại sao không sử dụng Finder?
Rất dễ dàng để tìm tệp bằng Finder khi bạn biết tên của chúng. Nhưng lệnh grep sẽ giúp bạn tiết kiệm thời gian khi cố gắng tìm nội dung bên trong các tệp. Bạn có thể dễ dàng sử dụng grep từ dòng lệnh để tìm kiếm văn bản cụ thể, và bạn sẽ nhận được kết quả trong vài giây. (Bạn cũng có thể sử dụng grep trong một số trình soạn thảo văn bản.)
Finder cung cấp một chức năng tương tự: tìm kiếm theo nội dung. (Nhấn Command-F trong Finder, chọn Nội dung trong menu bật lên Tìm kiếm các mục có, và nhập chuỗi tìm kiếm vào trường văn bản.) Nhưng Finder chỉ tìm kiếm bên trong các tệp đã được lập chỉ mục, và nó bỏ qua các tệp hệ thống ẩn trừ khi bạn rõ ràng chọn tìm kiếm các tệp hiển thị và tệp ẩn và thêm thư mục Hệ thống vào tìm kiếm.
Finder cũng thiếu tính linh hoạt của grep: trong khi nó rất tốt để tìm kiếm một từ cụ thể (ví dụ: Walden), nó trở nên kém hữu ích hơn khi bạn muốn tìm một chuỗi dài hơn. Tìm kiếm Walden Pond, và nó sẽ trả về tất cả các tệp chứa Walden hoặc Pond.
Sử dụng grep cũng cho phép bạn truy cập vào các biểu thức chính quy. Những sự kết hợp của chữ cái, số, ký tự đại diện và các ký tự đặc biệt khác cho phép bạn tìm thấy nhiều hơn chỉ là từ ngữ. Bạn có thể tìm kiếm hầu hết mọi chuỗi ký tự: địa chỉ IP trong tệp nhật ký; số điện thoại trong danh sách liên hệ; hoặc các chuỗi cụ thể chứa một loạt các số, chữ cái hoặc các ký tự khác. Khi sử dụng biểu thức chính quy, bạn chỉ bị giới hạn bởi trí tưởng tượng của mình.
Làm quen với Grep
Lệnh grep tìm kiếm bên trong một hoặc nhiều tệp cho chuỗi hoặc văn bản mà bạn chỉ định. Cú pháp của nó là: grep tùy chọn chuỗi_tìm_kiếm tệp….
Ở mức cơ bản nhất, bạn cho grep biết cần tìm gì và ở đâu: Ví dụ: grep AppleTalk /etc/services. Ở đây, bạn yêu cầu grep tìm kiếm AppleTalk trong tệp services nằm trong thư mục /etc. (Tệp hữu ích này chứa danh sách các số cổng mạng cho các dịch vụ thường dùng.) Lệnh sẽ hiển thị mỗi dòng chứa chuỗi tìm kiếm của bạn:
echo 4/ddp # AppleTalk Echo Protocolat-rtmp 201/udp # AppleTalk Routing Maintenanceat-rtmp 201/tcp # AppleTalk Routing Maintenance
Và cứ thế. Bạn có thể sử dụng ký tự đại diện dấu sao (*) quen thuộc để grep tìm kiếm một nhóm tệp trong thư mục làm việc hiện tại, như trong grep Walden *. Lệnh này tìm kiếm tất cả các tệp trong thư mục hiện tại từ khóa Walden, và trả về kết quả như sau:
Tệp nhị phân Walden.doc khớppepys_diary.txt:đã nói xấu về anh ta, và nói với tôi về sự hèn hạ của Lionell WaldenExcursions.txt:che giấu kinh nghiệm của anh ta. Tất cả những người đọc “Walden” sẽ nhớ đến mục đích của anh ta khi đến Walden Pond không phải để sống tiết kiệm hay sống xa hoa
Và cứ thế. Như ví dụ trên cho thấy, tìm kiếm trả về một số kết quả khớp. Kết quả đầu tiên, Walden.doc, là một tệp Word. Lệnh grep gọi các loại tệp độc quyền như vậy là tệp nhị phân. Nó không thể hiển thị nội dung của tệp nhị phân, nhưng nó có thể tìm kiếm bên trong chúng và cho bạn biết nếu có gì khớp. Các ví dụ tiếp theo đến từ các tệp văn bản thuần túy, mà grep có thể hiển thị kết quả. Bạn sẽ thấy tên tệp, theo sau là kết quả khớp của chuỗi tìm kiếm trong ngữ cảnh của nó.
Bạn có thể tìm kiếm bất kỳ chuỗi văn bản nhiều từ nào bằng cách đặt chuỗi đó trong dấu ngoặc đơn. Ví dụ: nếu bạn muốn tìm cụm từ Walden Pond, bạn sẽ nhập grep ‘Walden Pond’ *.
Lưu ý rằng grep không thích ngắt dòng của Macintosh. Nó trả về các dòng chứa chuỗi tìm kiếm, nhưng nó không coi ngắt dòng Mac là gì khác ngoài các ký tự. Trong trường hợp đó, “dòng” mà nó trả về là toàn bộ tệp; điều này có thể đưa rất nhiều văn bản vào cửa sổ Terminal của bạn.
Trong ví dụ trước, grep chạy trong một thư mục cụ thể, kiểm tra tất cả các tệp có trong đó. Nếu bạn muốn chạy grep trên một thư mục và các thư mục con của nó, hoặc bạn muốn grep tìm kiếm chuỗi bất kể chữ hoa hay chữ thường? Bạn cần thêm các tùy chọn. Ví dụ: để tìm kiếm Walden ở bất cứ đâu trong một thư mục hoặc các thư mục con của nó, hãy sử dụng tùy chọn -r (đệ quy): grep -r Walden ~/Documents/*.
Điều chỉnh tìm kiếm của bạn
| Để tìm… | Sử dụng tùy chọn này | Ví dụ |
|---|---|---|
| Văn bản trong các thư mục con | -r | grep -r Walden ~/Documents/* Tìm Walden trong bất kỳ tệp nào trong bất kỳ thư mục con nào của ~/Documents. |
| Chỉ các từ nguyên vẹn | -w | grep -w live Chỉ tìm live; không tìm liver, lives, lived, v.v. |
| Văn bản không phân biệt chữ hoa chữ thường | -i | grep -i pond Tìm pond, POND, hoặc Pond. |
| Chỉ tên tệp | -l | grep -l Walden Tìm các tệp chứa Walden, nhưng chỉ trả về danh sách tên tệp. |
| Chỉ số lần xuất hiện | -c | grep -c Walden Trả về tên các tệp chứa Walden và số lần xuất hiện trong mỗi tệp. |
Lệnh grep có một số tùy chọn cho phép bạn tinh chỉnh cách bạn tìm kiếm văn bản, cũng như loại kết quả grep trả về. Hãy bắt đầu với các tùy chọn hữu ích được liệt kê ở đây. (Lưu ý rằng bạn cũng có thể kết hợp các tùy chọn – ví dụ: grep -rl Walden tìm kiếm các thư mục con và chỉ trả về danh sách các tệp chứa từ Walden.)
Tìm kiếm nhiều chuỗi
Sử dụng dấu ống (|), một toán tử chuyển hướng Unix, bạn có thể yêu cầu grep tìm kiếm nhiều hơn một chuỗi. Giả sử bạn muốn tìm các tệp chứa cả Walden và Pond trên cùng một dòng. Bạn sẽ sử dụng lệnh này: grep Walden * | grep Pond. Phần đầu tiên của lệnh tìm kiếm từ Walden trong bất kỳ tệp nào trong thư mục hiện tại, và phần thứ hai chạy một lệnh grep khác trên kết quả của lệnh đầu tiên. Terminal chỉ hiển thị kết quả cuối cùng của hai lệnh được kết hợp.
Bạn có thể nối nhiều lệnh grep lại với nhau, như thế này:
grep a /usr/share/dict/words | grep e | grep i | grep o | grep u
. Lệnh này tìm kiếm trong một tệp từ điển đặc biệt các từ chứa chữ cái thường a. Sau đó, nó tìm kiếm các từ chứa e trong kết quả, và cứ thế, cuối cùng chỉ trả về các từ chứa cả năm nguyên âm.
Chức năng này của grep hữu ích nhất khi bạn tìm kiếm các chuỗi cụ thể trong đầu ra từ các lệnh khác. Bằng cách này, bạn có thể thu hẹp đầu ra dài và phức tạp. Ví dụ: đây là một cách phổ biến để tìm ID quy trình của một chương trình bị kẹt để bạn có thể buộc đóng nó từ dòng lệnh: nhập ps -ax | grep Finder.
Lệnh này trước tiên lấy danh sách tất cả các quy trình đang chạy trên máy Mac của bạn, và sau đó sàng lọc danh sách này để tìm các dòng chứa từ Finder. Ví dụ: kết quả của bạn có thể như sau:
390 ?? S 4:18.96 /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder2292 std R+ 0:00.00 grep Finder
ID quy trình là số đầu tiên trên mỗi dòng; ở đây, Finder là 390. (Bạn sẽ nhận thấy lệnh cũng trả về chính nó; vì từ Finder có trong lệnh grep, nên nó cũng được liệt kê.) Vì vậy, nếu Finder bị kẹt, điều này sẽ cung cấp cho bạn thông tin cần thiết để buộc đóng nó. Bây giờ bạn sẽ nhập lệnh (trong đó ID quy trình là đối số cuối cùng) kill -9 390.
Thêm biểu thức chính quy vào
Mặc dù bạn đã thấy một số sức mạnh của lệnh grep, nhưng bạn có thể đi xa hơn nữa bằng cách sử dụng biểu thức chính quy, các tổ hợp ký tự đặc biệt hoạt động như ký tự đại diện. Dưới đây là một vài ví dụ.
Nếu bạn không chắc chắn cách đánh vần từ separate (là a hay e?), hãy chạy lệnh này để kiểm tra tệp từ điển đặc biệt ẩn trong máy Mac của bạn:
grep ^sep.r.te /usr/share/dict/words
Bạn sẽ nhận được một danh sách các từ bao gồm separate, separately, separately, separateness và separates.
Lưu ý hai ký tự đặc biệt trong lệnh: dấu mũ (^) và dấu chấm (.). Dấu mũ cho grep biết phải tìm kiếm chuỗi ở đầu dòng, vì vậy kết quả không bao gồm các từ như inseparate. Dấu chấm khớp với bất kỳ ký tự nào ngoại trừ một dòng mới.
Nếu bạn muốn tìm tất cả các số điện thoại trong một tệp cụ thể thì sao? Hãy thử lệnh này, lệnh này sẽ tìm các số điện thoại ở định dạng 555-1234:
grep [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] phonebook.txt.
Mỗi ký tự đại diện [0-9] khớp với bất kỳ ký tự nào trong phạm vi được chỉ định trong dấu ngoặc vuông. Bạn có thể sử dụng các phạm vi như [1-3] để giới hạn tìm kiếm của mình đối với các chuỗi cụ thể. Điều này cũng hoạt động đối với chữ cái: [a-n] khớp với bất kỳ ký tự thường nào từ a đến n. Bạn có thể tự tạo phạm vi của mình với các tập hợp ký tự – ví dụ: [aeiou] sẽ chỉ khớp với nguyên âm. Bạn có thể tìm hiểu thêm về biểu thức chính quy bằng cách nhập man grep trong Terminal, hoặc bằng cách tham khảo cuốn sách xuất sắc Mastering Regular Expressions của Jeffrey Friedl, ấn bản thứ hai (O’Reilly, 2002). Chỉ cần luyện tập một chút, bạn sẽ sử dụng grep và biểu thức chính quy để tìm bất cứ thứ gì bạn muốn.
Kirk McElhearn là tác giả của The Mac OS X Command Line: Unix Under the Hood (Sybex, 2004). Blog của ông, Kirkville, có các bài viết và mẹo về việc sử dụng dòng lệnh với Mac OS X.]

