Linux

Lệnh Grep Trong Linux: Tìm Nội Dung Trong File Và Đọc Log Như SysAdmin

phongdhphongdh
19 phút đọc
Chia sẻ:
Zalo
Lệnh Grep Trong Linux: Tìm Nội Dung Trong File Và Đọc Log Như SysAdmin

Khi một website trên VPS gặp sự cố lúc nửa đêm, việc đầu tiên quản trị viên làm không phải mở trình duyệt, mà là mở file log và tìm xem hệ thống đã ghi lại điều gì. File log vài chục nghìn dòng không thể đọc bằng mắt thường, và đó là lúc lệnh grep trong Linux phát huy sức mạnh: lọc ra đúng những dòng chứa từ khóa bạn cần trong tích tắc. Bài viết này hướng dẫn lệnh grep trong Linux cùng nhóm lệnh xem nội dung file là cat, head, tail, kỹ thuật pipe và redirect, tất cả đều thực hành trên một file log mẫu với ảnh kết quả thật.

1. Chuẩn bị file thực hành: một file log mẫu

Để các ví dụ xuyên suốt và dễ đối chiếu, bài viết dùng một file tên app.log nằm trong thư mục ~/nhat-ky, mô phỏng log của một ứng dụng web. Mỗi dòng log gồm thời gian, mức độ (INFO là thông tin thường, WARN là cảnh báo, ERROR là lỗi) và nội dung sự kiện như đăng nhập, mất kết nối cơ sở dữ liệu hay sao lưu hoàn tất. Tổng cộng file có mười hai dòng, đủ nhỏ để nhìn toàn cảnh nhưng đủ đa dạng để thực hành lọc.

Trong thực tế, log thật nằm ở thư mục /var/log, ví dụ log của web server Nginx ở /var/log/nginx/error.log hay log hệ thống ở /var/log/syslog. Mọi kỹ thuật trong bài áp dụng y hệt cho các file đó, chỉ khác đường dẫn và dung lượng lớn hơn rất nhiều. Bạn nên thực hành trên file mẫu trước để quen tay, tránh gõ lệnh thử nghiệm lên log thật của hệ thống đang chạy.

Một lưu ý nhỏ về tư duy: đọc log hiệu quả là đi từ tổng quát đến chi tiết. Trước tiên xem toàn bộ file để nắm bối cảnh, sau đó xem phần đầu và phần cuối để biết log bắt đầu và kết thúc ra sao, cuối cùng mới dùng grep khoanh vùng đúng những dòng liên quan đến sự cố. Ba bước này tương ứng ba nhóm lệnh mà bài sẽ giới thiệu lần lượt.

Chỉ khi đã nhìn toàn cảnh file log, việc lọc chi tiết bằng lệnh grep trong Linux mới thực sự có định hướng và hiệu quả.

2. Lệnh cat trong Linux: xem toàn bộ nội dung file

Lệnh cat (concatenate) in toàn bộ nội dung file ra màn hình theo cú pháp cat tên-file. Đây là lệnh xem file đơn giản nhất và thường là lệnh đầu tiên người ta gõ khi muốn biết một file chứa gì. Với các file ngắn như file cấu hình hay file log mẫu trong bài, cat cho cái nhìn trọn vẹn ngay lập tức.

Xem toàn bộ nội dung file log mẫu bằng lệnh cat trong terminal Ubuntu

Nhìn vào ảnh, mười hai dòng log hiện ra đầy đủ: ứng dụng khởi động, người dùng đăng nhập, ba dòng ERROR mất kết nối cơ sở dữ liệu và lỗi đọc file cấu hình xen giữa các dòng INFO và WARN. Chỉ với một lệnh cat, bạn đã nắm được câu chuyện của cả phiên làm việc. Tuy nhiên, nếu file có mười nghìn dòng, cat sẽ cuốn trôi màn hình và trở nên vô dụng.

Vì giới hạn đó, lệnh cat trong Linux phù hợp nhất với file ngắn và với vai trò đưa nội dung file vào các lệnh xử lý khác qua pipe, kỹ thuật sẽ học ở phần sau. Biến thể hay dùng là cat -n file để đánh số thứ tự từng dòng, rất tiện khi cần trích dẫn dòng lỗi số bao nhiêu trong báo cáo sự cố cho đồng đội.

Khi kết hợp với biểu thức chính quy, sức mạnh của lệnh grep trong Linux còn tăng lên nhiều lần so với tìm chuỗi đơn thuần.

Đọc log bằng lệnh grep trong Linux là kỹ năng sinh tồn của quản trị viên: sự cố càng gấp, khả năng lọc đúng dòng của lệnh grep trong Linux càng đáng giá.

Trong bộ ba lệnh xem file, lệnh cat trong Linux mạnh ở sự trọn vẹn, còn head và tail mạnh ở tốc độ khoanh vùng nội dung.

3. Lệnh head và tail: xem phần đầu và phần cuối file

Lệnh head in mười dòng đầu tiên của file, còn tail in mười dòng cuối cùng. Cả hai đều nhận tham số -n để tùy chỉnh số dòng, ví dụ head -n 5 app.log xem năm dòng đầu và tail -n 5 app.log xem năm dòng cuối. Với file log, head giúp biết log bắt đầu từ thời điểm nào, còn tail cho thấy những sự kiện mới nhất vừa xảy ra.

Xem năm dòng đầu bằng head -n và năm dòng cuối bằng tail -n của cùng một file log

Trong ảnh, head cho thấy giai đoạn ứng dụng khởi động và cảnh báo dung lượng đĩa đầu tiên, trong khi tail cho thấy các sự kiện gần nhất gồm lỗi đọc file cấu hình và dòng tạm dừng để bảo trì. Ghép hai lát cắt này lại, bạn định hình được khung thời gian của file log mà không cần đọc phần giữa.

Ứng dụng thực tế rất quen thuộc: sau khi khởi động lại một dịch vụ, quản trị viên thường gõ tail để xem những dòng log mới nhất có báo lỗi hay không. Lệnh tail trong Linux còn một chế độ theo dõi trực tiếp cực kỳ quan trọng với tham số -f, bài sẽ dành riêng một phần ở phía sau để thực hành kỹ.

Cặp head và tail là bước đệm tự nhiên trước khi dùng lệnh grep trong Linux để lọc sâu vào đúng dòng thông tin cần tìm.

4. Lệnh grep trong Linux: cú pháp và cách tìm cơ bản

Giờ đến nhân vật chính. Lệnh grep trong Linux tìm và in ra những dòng chứa một mẫu ký tự cho trước, theo cú pháp grep "mẫu-tìm" tên-file. Tên grep là viết tắt của cụm “global regular expression print” từ thời các trình soạn thảo Unix đời đầu, nhưng bạn chỉ cần nhớ bản chất: grep là bộ lọc dòng theo từ khóa.

Tìm dòng chứa ERROR bằng grep, đánh số dòng bằng grep -n và đếm số dòng khớp bằng grep -c

Ảnh trên trình diễn ba thao tác nền tảng. grep "ERROR" app.log lọc ra đúng ba dòng lỗi trong mười hai dòng. Thêm -n, mỗi dòng kết quả được gắn số thứ tự trong file gốc, giúp bạn quay lại đúng vị trí khi mở file bằng trình soạn thảo. Thay việc in kết quả bằng -c (count), grep chỉ trả về con số 7, là tổng số dòng chứa INFO, tiện cho việc thống kê nhanh.

Hai thói quen cần rèn ngay từ đầu: luôn đặt mẫu tìm trong cặp dấu nháy kép khi mẫu có khoảng trắng hoặc ký tự đặc biệt, và nhớ rằng grep mặc định phân biệt chữ hoa thường. Tìm “error” sẽ không ra kết quả nếu log ghi “ERROR”. Phần tiếp theo sẽ xử lý chính vấn đề hoa thường này cùng một tùy chọn đảo ngược kết quả rất mạnh.

Tóm lại, bộ ba lệnh cat trong Linux, tail và grep tạo thành vòng tròn đọc file khép kín: xem toàn cảnh, xem phần mới nhất, rồi lọc chi tiết.

Từ việc đếm số lần lỗi xuất hiện đến trích xuất báo cáo sự cố, lệnh grep trong Linux đáp ứng gần như mọi nhu cầu lọc log cơ bản.

Bốn tham số -n, -c, -i, -v bao phủ phần lớn tình huống thực tế của lệnh grep trong Linux khi đọc log mỗi ngày.

5. Grep nâng cao: bỏ qua hoa thường với -i và đảo ngược với -v

Tham số -i (ignore case) bảo grep bỏ qua phân biệt hoa thường, tìm “error” sẽ khớp cả ERROR, Error lẫn error. Đây là tham số nên dùng khi bạn không chắc log ghi từ khóa theo kiểu nào. Ngược lại, tham số -v (invert match) đảo ngược kết quả: thay vì lấy dòng chứa mẫu, grep loại bỏ chúng và in phần còn lại.

Tìm không phân biệt hoa thường bằng grep -i và loại bỏ dòng INFO bằng grep -v

Trong ảnh, grep -i "error" app.log cho kết quả giống hệt tìm “ERROR” viết hoa. Lệnh grep -v "INFO" app.log loại toàn bộ dòng thông tin thường, chỉ giữ lại các dòng WARN và ERROR, tức đúng phần đáng chú ý của file log. Khi log bị nhấn chìm bởi hàng nghìn dòng INFO vô hại, grep -v là cách nhanh nhất để nhìn thấy vấn đề.

Hai tham số này kết hợp rất linh hoạt, chẳng hạn grep -iv "info" app.log vừa bỏ qua hoa thường vừa đảo ngược, lọc ra mọi dòng không phải thông tin thường. Nắm được cú pháp và bốn tham số -n, -c, -i, -v là bạn đã dùng lệnh grep trong Linux ở mức đáp ứng phần lớn nhu cầu công việc hằng ngày.

Không có pipe và redirect trong Linux, grep chỉ in kết quả ra màn hình; có chúng, kết quả trở thành đầu vào cho bất kỳ xử lý nào tiếp theo.

6. Pipe và redirect: nối lệnh với nhau, ghi kết quả ra file

Pipe, ký hiệu |, là cơ chế chuyển kết quả đầu ra của lệnh trước thành đầu vào cho lệnh sau. Ví dụ grep "ERROR" app.log | wc -l đếm số dòng lỗi bằng cách đưa kết quả grep cho lệnh đếm dòng wc. Mỗi lệnh chỉ làm một việc thật tốt, và pipe là cách xâu chuỗi chúng thành một dây chuyền xử lý mạnh mẽ.

Redirect là cơ chế chuyển hướng đầu ra: dấu > ghi kết quả vào file (ghi đè nội dung cũ), dấu >> ghi nối thêm vào cuối file. Ví dụ grep "ERROR" app.log > loi.txt lưu toàn bộ dòng lỗi thành file riêng để gửi cho lập trình viên hoặc đính kèm báo cáo. Phân biệt rõ ghi đè và ghi nối để tránh vô tình xóa mất dữ liệu cũ.

Đếm dòng lỗi bằng pipe với wc -l, lưu kết quả grep ra file bằng redirect và xem lại file

Cùng ảnh còn cho thấy lệnh cat loi.txt đọc lại file kết quả, xác nhận ba dòng ERROR đã được lưu đúng. Bộ ba kỹ thuật grep, pipe và redirect trong Linux là nền tảng của gần như mọi thao tác xử lý log và văn bản trên máy chủ: lọc bằng grep, biến đổi bằng các lệnh tiếp theo trong ống, và chốt kết quả bằng redirect ra file.

Không quá lời khi nói lệnh grep trong Linux là một trong những lệnh được gõ nhiều nhất trên máy chủ Linux mỗi ngày.

Một file log được đọc bằng lệnh cat trong Linux cho bạn bối cảnh, nhưng chỉ grep mới cho bạn vị trí chính xác của vấn đề.

Tìm kiếm đệ quy đưa lệnh grep trong Linux từ công cụ xem một file thành công cụ khảo sát cả một cây thư mục.

7. Tìm trong cả thư mục bằng grep -r

Tham số -r (recursive) mở rộng phạm vi tìm kiếm của grep từ một file sang toàn bộ thư mục. Cú pháp grep -r "database" . tìm từ khóa database trong mọi file thuộc thư mục hiện tại và các thư mục con. Kết quả được in kèm tên file ở đầu mỗi dòng để bạn biết dòng khớp nằm ở file nào.

Tìm từ khóa trong toàn bộ thư mục bằng grep -r và đếm tổng số dòng của file bằng wc -l

Ứng dụng kinh điển của grep -r là mò cấu hình: khi cần biết file nào trong /etc đang chứa một giá trị nào đó, hay file mã nguồn nào còn tham chiếu đến một tên miền cũ, một lệnh grep -r cho đáp án trong vài giây. Kèm theo trong ảnh là lệnh wc -l app.log cho biết file có mười hai dòng, một con số nên kiểm tra trước khi quyết định dùng cat hay phải lọc bằng grep.

Cần thận trọng khi grep -r trên thư mục quá lớn hoặc chứa file nhị phân, kết quả có thể rất dài và lẫn thông báo về file nhị phân. Thêm tham số -I để bỏ qua file nhị phân và -l nếu bạn chỉ cần danh sách tên file có chứa từ khóa thay vì toàn bộ dòng khớp. Đây là hai biến thể xuất hiện thường xuyên trong các script quản trị thật.

Nếu grep là bộ lọc tĩnh, thì lệnh tail trong Linux với tham số -f là radar trực tiếp, và quản trị viên giỏi dùng cả hai thay phiên nhau.

8. Lệnh tail -f: theo dõi log theo thời gian thực

Tham số -f (follow) biến lệnh tail thành một màn hình theo dõi trực tiếp: sau khi in các dòng cuối cùng hiện có, tail không thoát ra mà treo tại đó, dòng log mới ghi vào file sẽ hiện lên ngay lập tức. Đây là công cụ không thể thiếu khi bạn cần quan sát hệ thống phản ứng ra sao ngay lúc tái hiện một lỗi.

Theo dõi log trực tiếp bằng tail -f, dòng log mới hiện lên ngay khi được ghi vào file

Trong ảnh thực hành, tail -f mở đầu bằng hai dòng log cuối, và ngay khi một dòng INFO mới về kết nối cơ sở dữ liệu được ghi thêm vào file, nó xuất hiện trên màn hình mà không cần gõ lại lệnh. Để dừng theo dõi, nhấn Ctrl + C. Kịch bản quen thuộc là mở một cửa sổ terminal chạy tail -f file log, cửa sổ còn lại thao tác trên website, và quan sát log chạy theo từng hành động.

Kết hợp tail -f với grep qua pipe, ví dụ tail -f app.log | grep "ERROR", màn hình chỉ hiện dòng lỗi ngay khi chúng phát sinh giữa dòng chảy log liên tục. Lưu ý nếu file log bị hệ thống luân chuyển (rotate) sang tên mới, tail -f có thể ngừng theo dõi; khi đó dùng biến thể tail -F để tail tự bám theo file theo tên dù file bị đổi.

Hầu hết script giám sát log tự động đều có bóng dáng của lệnh grep trong Linux ở vị trí trung tâm.

Trong quy trình xử lý sự cố, lệnh tail trong Linux thường là bước mở đầu, còn grep là bước kết luận sau khi đã khoanh vùng.

Kết hợp lệnh tail trong Linux ở chế độ follow với grep qua pipe là cấu hình theo dõi log được dùng nhiều nhất trên máy chủ thật.

9. Lệnh less: xem file lớn từng trang

Khi cần đọc kỹ một file dài theo từng trang thay vì cuốn trôi như cat, dùng lệnh less theo cú pháp less tên-file. Trong less, phím Space xuống một trang, phím b lên một trang, gõ /từ-khóa để tìm và nhảy đến vị trí khớp ngay trong lúc đọc, phím n tới kết quả tiếp theo, và phím q để thoát.

Less chỉ đọc phần nội dung đang hiển thị nên mở file vài trăm MB vẫn nhẹ nhàng, khác hẳn việc nạp cả file vào trình soạn thảo. Cặp đôi less và tổ hợp tìm kiếm nội tại của nó đặc biệt hữu ích khi bạn biết sự cố nằm đâu đó trong file nhưng chưa xác định được từ khóa chính xác để dùng grep.

Như vậy nhóm lệnh xem file có sự phân vai rõ ràng: cat cho file ngắn và để đưa dữ liệu vào pipe, head và tail cho hai đầu file, less cho việc đọc duyệt tương tác, còn grep là công cụ lọc chính xác. Tài liệu đầy đủ của grep có tại trang hướng dẫn GNU Grep, nơi bạn sẽ tìm thấy thêm về biểu thức chính quy khi cần tìm kiếm theo mẫu phức tạp.

Trong mọi tình huống đọc log, lệnh grep trong Linux luôn là bước lọc đầu tiên trước khi chuyển sang các công cụ phân tích nặng hơn.

10. Bảng tổng hợp lệnh xem và tìm nội dung file

Bảng sau tóm tắt toàn bộ lệnh đã thực hành trong bài cùng các tham số quan trọng nhất của từng lệnh, giúp bạn tra cứu nhanh khi đang xử lý sự cố và không có thời gian đọc lại từ đầu.

LệnhCông dụngVí dụ
catIn toàn bộ filecat app.log
head -nXem n dòng đầuhead -n 5 app.log
tail -nXem n dòng cuốitail -n 20 app.log
tail -fTheo dõi log trực tiếptail -f app.log
lessXem file từng trangless app.log
grepLọc dòng chứa từ khóagrep “ERROR” app.log
grep -iTìm không phân biệt hoa thườnggrep -i “error” app.log
grep -vLoại bỏ dòng chứa từ khóagrep -v “INFO” app.log
grep -nKèm số thứ tự dònggrep -n “WARN” app.log
grep -cĐếm số dòng khớpgrep -c “INFO” app.log
grep -rTìm trong cả thư mụcgrep -r “database” .
wc -lĐếm tổng số dòngwc -l app.log

Đặt bảng này cạnh phần thực hành phía trên, có thể thấy chỉ với mười hai biến thể lệnh, bạn đã bao quát được gần như mọi tình huống đọc và lọc file trên Linux. Điểm mấu chốt không nằm ở số lượng lệnh thuộc lòng, mà ở khả năng chọn đúng lệnh cho đúng câu hỏi: muốn biết chuyện gì vừa xảy ra thì tail, muốn biết lỗi xuất hiện bao nhiêu lần thì grep -c, muốn cô lập lỗi khỏi nhiễu thì grep -v.

Thành thạo pipe và redirect trong Linux biến các lệnh đơn lẻ thành một dây chuyền xử lý dữ liệu hoàn chỉnh.

11. Lỗi thường gặp khi dùng grep và đọc log

Lỗi phổ biến nhất là grep không trả về kết quả nào dù chắc chắn file có nội dung đó. Nguyên nhân hàng đầu là phân biệt hoa thường, tiếp theo là mẫu tìm chứa ký tự đặc biệt bị shell hiểu nhầm vì thiếu dấu nháy. Hãy thử lại với -i và đặt mẫu trong dấu nháy kép trước khi kết luận file không chứa từ khóa.

Lỗi thứ hai là dùng cat với file log khổng lồ làm terminal treo và cuốn mất mọi thông tin trước đó. Hãy tập phản xạ kiểm tra độ dài bằng wc -l và dung lượng bằng ls -lh trước khi mở bất kỳ file lạ nào. File càng lớn càng phải đi theo hướng lọc bằng grep thay vì đọc toàn bộ.

Lỗi thứ ba liên quan đến redirect: dùng một dấu > khiến file kết quả cũ bị ghi đè sạch, mất luôn dữ liệu lần chạy trước. Khi cần lưu log theo thời gian, hãy dùng >> ghi nối hoặc đặt tên file kèm ngày giờ. Một giây cẩn thận ở thao tác này cứu được rất nhiều giờ điều tra về sau.

12. Câu hỏi thường gặp về lệnh grep trong Linux

Grep khác gì tính năng tìm kiếm trong trình soạn thảo? Grep chạy ngay trong terminal, xử lý được file cực lớn mà không cần mở lên, và quan trọng nhất là kết hợp được với pipe để xâu chuỗi cùng các lệnh khác trong script tự động. Trình soạn thảo phù hợp khi cần sửa nội dung, còn tìm và lọc hàng loạt là lãnh địa của grep.

Làm sao tìm một cụm từ có khoảng trắng bằng grep? Chỉ cần đặt toàn bộ cụm trong dấu nháy, ví dụ grep "Mat ket noi" app.log. Dấu nháy bảo shell coi cả cụm là một tham số duy nhất. Đây cũng là lý do mọi ví dụ trong bài đều đặt mẫu tìm trong dấu nháy kép như một thói quen mặc định.

Tail -f không hiện dòng mới thì sao? Hãy kiểm tra tiến trình đang ghi vào đúng file bạn theo dõi hay file đã bị rotate sang tên khác. Nếu hệ thống dùng cơ chế luân chuyển log, đổi sang tail -F để bám theo tên file. Ngoài ra, một số ứng dụng ghi log vào hệ thống journal thay vì file, trường hợp đó cần công cụ riêng để xem.

Grep có tìm được theo mẫu phức tạp không? Có, grep hỗ trợ biểu thức chính quy (regex) để tìm theo khuôn mẫu như mọi dòng bắt đầu bằng ERROR, địa chỉ email hay địa chỉ IP. Đây là chủ đề nâng cao đáng học sau khi bạn đã chắc phần cơ bản trong bài, vì regex xuất hiện khắp nơi trong các công cụ xử lý văn bản của Linux.

Dù log nằm trong một file hay rải khắp nhiều thư mục, lệnh grep trong Linux vẫn là công cụ tìm kiếm đáng tin cậy nhất của quản trị viên.

13. Lời kết

Từ cat xem toàn bộ file, head và tail cắt hai đầu, less duyệt từng trang, đến lệnh grep trong Linux lọc chính xác theo từ khóa cùng pipe và redirect, bạn đã có đủ bộ công cụ để đọc và xử lý bất kỳ file văn bản hay file log nào trên máy chủ. Đây là nhóm kỹ năng được dùng mỗi ngày trong công việc quản trị hệ thống.

Hãy tự tạo một file log mẫu của riêng bạn và thực hành lại toàn bộ lệnh trong bài, đặc biệt là các tổ hợp grep với -i, -v, -r và tail -f theo dõi trực tiếp. Khi việc khoanh vùng một lỗi giữa hàng nghìn dòng log chỉ còn tốn vài giây, bạn sẽ hiểu vì sao grep được coi là một trong những lệnh đáng học nhất trên Linux.

Chia sẻ bài viết này:
Zalo
phongdh

phongdh

Tác giả bài viết • Content Creator

Chào mọi người, mình là Phong - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Email/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau.

Kết nối:

Bài viết liên quan

Những bài viết bạn có thể quan tâm

Thảo luận 0 bình luận Viết bình luận

Email được bảo mật và không hiển thị công khai.

Chưa có bình luận. Hãy là người mở đầu cuộc trò chuyện.

Zalo