Thứ Bảy, 29 tháng 7, 2023

Đường ống (Pipe) và lọc (Filter) kết quả trên Linux

Bài này mình giải thích cơ chế đường ống và lọc kết quả trên linux. Sau đó là các ví dụ cách dùng thông dụng cho các lệnh liên quan như grep, sort ...

Mục lục

  • 1. Pipe là gì? Filter là gì?
  • 2. Các lệnh liên quan
    • Lệnh grep
    • Lệnh sort, tail, more, less
  • 3. Kết luận

1. Pipe là gì? Filter là gì?

Trên linux rất hay dùng các lệnh ghép lại với nhau để tiết kiệm thời gian gõ lệnh và lọc bớt kết quả hiển thị ra màn hình. Theo đó output của lệnh A sẽ là đầu vào cho lệnh B xử lý. Hai hay nhiều lệnh ghép lại với nhau theo cách này gọi là cơ chế ống dẫn (pipe). Luồng dữ liệu chạy tuần tự qua các lệnh xử lý như kiểu nước chảy qua ống dẫn theo một chiều vậy.

Để tạo một ống dẫn, bạn chỉ cần thêm dấu gạch đứng | vào giữa hai lệnh.

Khi một chương trình lấy input từ một chương trình khác, thực hiện vài thao tác trên dữ liệu input này rồi ghi kết quả ra màn hình, nó được gọi là cơ chế lọc (filter). Kết quả in ra có thể là màn hình hay file ... trên linux nó gọi là đầu ra chuẩn (standard output) khái niệm này mình sẽ giải thích trong một bài khác. Cơ chế này là một ống dẫn nhưng cụ thể hơn là lệnh chạy sau đã thực hiện sửa đổi kết quả đầu ra của lệnh trước, ví dụ như lọc bớt theo ký tự trùng.

Bài viết này được đăng tại [tranvanbinh.vn]

2. Các lệnh liên quan

Phần này mình đưa ra các lệnh thông dụng để giải thích cơ chế đường ống và lọc kết quả trên Linux, đầu tiên là lệnh grep.

Lệnh grep

Chương trình (lệnh) grep tìm trong một hay nhiều file có chứa một từ khóa. Cách dùng:

1
$grep pattern file(s)

Tên gọi "grep" bắt nguồn từ một trình soạn thảo trên UNIX tên là ed. Chương trình này có lệnh tìm kiếm từ khóa theo cú pháp g/re/p nghĩa là "tìm kiếm toàn bộ trong file có từ khóa thỏa mãn rồi in ra các dòng chứa từ khóa". Từ khóa được trình bày dạng biểu thức chính quy (regular expression).

Một biểu thức chính quy là một chuỗi ký tự gồm các từ thông thường kèm theo các ký tự đặc biệt để tìm các từ khóa thỏa mãn điều kiên.

Ví dụ mình muốn tìm tất cả từ "send" trong mục controllers và commands để biết việc gửi mail thự thi ở đâu:

Trước tiên là tìm trong một file:

Kết quả có hàm send() lẫn các từ khóa comment cũng thỏa mãn trùng với từ "send". Muốn lọc bớt thì thay bằng "send()" hay "send(".

Ở đây mình còn search cho cả 2 thư mục, tham số -r cho biết lệnh grep chạy hết cả file trong thư mục (recusive).


Thay vì -r bạn có thể dùng ký tự meta: grep "send()" controllers/*.php cũng tương tự

Tìm các hàm bắt đầu bằng action (trên một số framework PHP như Symfony hay Yii thì bắt đầu hàm bằng action sẽ chạy được trên URL theo route).


lọc bớt biến $action bằng cách thêm dấu " " trắng đằng trước:


ký tự "^" đại diện cho đầu dòng, "$" đại diện cho cuối dòng. Ví dụ bạn muốn tìm các hàm khai báo rồi đến { , xong xuống dòng:

Ví dụ này tìm tất cả các file PHP trong project trừ các file thư viện vendor/ và file tests/ ra. Sau đó đếm số dòng, sếp thứ tự tăng dần.


Một ví dụ hay gặp nữa là khi bạn soi log các lệnh query SQL, ở đây là lọc các query UPDATE hoặc INSERT:

1
tail -f /var/logs/mysql/mysql_query.log | grep "UPDATE\|INSERT"

Bảng sau tóm tắt các tùy chọn cho lệnh grep:

Tùy chọnMô tả
-v(search ngược) lấy kết quả không thỏa mãn điều kiện search

-n

In ra dòng và số dòng thỏa mãn điều kiện search
-lChỉ hiện danh sách tên file chứa từ khóa thỏa mãn
-cin ra tổng số lượng dòng tìm thấy kết quả
-ithỏa mãn cả ký tự in thường lẫn in hoa

Lệnh sort, tail, more, less

sort sắp xếp kết quả đầu ra

Tùy chọnMô tả
-nsắp xếp theo số nguyên, bỏ qua kết quả rỗng và các dấu tab
-rĐảo ngược thứ tự kết quả
-fsắp xếp sao cho các ký tự in hoa, thường gần nhau
+xBỏ qua x cột khi sắp xếp

Ví dụ bạn muốn liệt kê các file PHP theo kích thước dòng:

xargs giúp đưa danh sách file từ output của ln thành mảnh tham số để chạy lệnh wc (word count). Nếu không nó sẽ đếm số lượng file thỏa mãn thay vì số dòng trong file. $1 là biến input số 1 từ output của lệnh ls,

các biến từ $1 đến $n. Mình sẽ giải thích về xargs và $ trong một bài gần nhất.

Lệnh pg, more và less để phân trang kết quả đầu ra không để nó tràn ra terminal với những output dài.

Lệnh tail, head để xem cuối file hay đầu file, ví dụ xem 10 dòng đầu tiên hay 20 dòng cuối file:

1
2
3
4
5
head -n 10 ten_file
 
tail -n 10 ten_file
 
tail -f /var/logs/mysql_query.log |grep "UPDATE\|INSERT" // tìm query SQL thỏa mãn INSERT hoặc UPDATE

3. Kết luận

Cơ chế đường ống và lọc kết quả trên Linux rất hay dùng khi muốn thu gọn các lệnh hay kết hợp các lệnh với nhau. Nó tạo ra khả năng rất mạnh và tiện lợi cho bạn tìm kiếm nhanh chóng kết quả hay thực thi các lệnh một cách tự động. Rất nhiều tác vụ tốn thời gian như xử lý ảnh, video có thể tự động nhờ các lệnh linux gộp lại. Các lệnh hay dùng như grep, tail mình hay thu gọn tiếp thông qua công cụ alliases như trong bài này hướng dẫn. Trên Windows các bạn có thể cài GitBash hay một phần mềm giả lập môi trường bash terminal như cygwin cũng có nhiều lệnh và cơ chế lọc, đường ống tương tự. Các bạn sẽ thường xuyên thấy hai cơ chế này xuất hiện trong các lệnh hướng dẫn về linux.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master