[Linux-tips] Sử dụng piping, redirection, filters trong command line

I. Giới thiệu

1. Pipe và redirection

Khi làm việc trên linux command line. Chắc hẳn chúng ta đã từng sử dụng pipe và redirection. Chẳng hạn như để tìm và in dòng chứa từ "Xin chào" từ file log.txt ra file result.txt: cat log.txt | grep "Xin chào" > README.txt Tuy nhiên nhiều bạn không biết là mình đã vừa sử dụng pipe ( | ) và redirection ( > ) trong linux 😄


Vậy pipe và redirection là gì? - Pipe: thực tế pipe có nghĩa là cái ống, là công cụ để cho dòng chảy đi qua. Trong linux pipe có kí hiệu là dấu gạch đứng ( | ). Và nó có tác dụng chuyển dòng chảy dữ liệu (data stream) từ output chương trình này sang input của chương trình ở sau nó A | B - Output (STDOUT) của chương trình A sẽ thành input (STDIN) của chương trình B - Redirection: dùng để điều hướng data stream giữa 1 chương trình và 1 file (khác với pipe là 2 chương trình). Các ký hiệu của redirection bao gồm: 1. > Xuất STDOUT vào file (overwrite) 2. >> Xuất STDOUT vào file (append) 3. < Đọc STDIN từ file 4. 2> Xuất STDERR vào file


Ở trên có đề cập tới data stream. Vậy data stream gồm những loại nào? Mọi chương trình linux trên command line đều bao gồm 3 loại data stream: 1. STDIN(0) - Standard input (dữ liệu đầu vào) 2. STDOUT(1) - Standard output (dữ liệu đầu ra) 3. STDERR(2) - Standard error (dữ liệu lỗi đầu ra)

2. Filters

Filter trong giới hạn command line là một chương trình có nhiệm vụ nhận dữ liệu đầu vào (STDIN), xử lý và xuất ra kết quả (STDOUT). Các filter phổ biến bao gồm:

Tên Chức năng
head In ra n dòng dữ liệu đầu tiên.
tail In ra n dòng dữ liệu từ dưới lên.
sort Sắp xếp dữ liệu.
nl Hiện thị dòng dữ liệu kèm số thứ tự dòng.
wc Đếm ký tự, từ, dòng, byte.
cut Cắt dữ liệu.
sed Tìm kiếm và thay thế dữ liệu.
uniq Bỏ dòng trùng lặp.
tac Hiển thị dữ liệu từ dưới lên. Ngược lại so với cat.

II. Một số ví dụ thực tế

1. Pipling

  • Liệt kê file, thư mục chứa từ "php"
$ ls ~ | grep php
  • Kiểm tra process mysql có đang chạy hay không
$ ps aux | grep mysql

2. Redirection

  • Redirect STDOUT to file. Lưu danh sách module php vào file
$ php -m > modules.txt
  • Redirecting STDIN from file. Import SQL vào database
$ mysql -uroot -proot mydatabase < data.sql
  • Redirect STDERR
$ ls /root 2> errrors.txt
$ cat errors.txt
ls: cannot open directory '/root': Permission denied
  • Redirect cả STDOUT và STDERR
$ ls /root ~ > output.txt 2>&1
$ cat output.txt
ls: cannot open directory '/root': Permission denied
Documents Music Pictures

3. Filter

  • head [-số dòng muốn hiển thị] [path]
$ head -n 3 lovers.txt
Me
Myself
I
  • tail [-số dòng muốn hiển thị] [path]
$ tail -n 3 lovers.txt
I
Myself
Me
  • sort [-options] [path]
$ cat traicay.txt
Cam
Xoai
Chuoi
$ sort traicay.txt
Cam
Chuoi
Xoai
  • nl [-options] [path]
$ sort traicay.txt | nl 
1. Cam
2. Chuoi
3. Xoai
  • wc [-options] [path]
$ wc traicay.txt -l
3
  • sed <expression> [path]. Expression thường có dạng s/search/replace/g
$ sed 's/Chuoi/Chanh/g' traicay.txt | sort
Cam
Chanh
Xoai
  • uniq [options] [path]. Lệnh này có nhược điểm chỉ loại bỏ được các dòng trùng lặp kề nhau
$ cat traicay.txt
Cam
Cam
Xoai
$ uniq traicay.txt
Cam
Xoai
  • tac [path]
$ cat traicay.txt
Cam
Chanh
Xoai
$ tac traicay.txt
Xoai
Chanh
Cam

Để tìm hiểu thêm các lệnh này các các options hữu dụng khác các bạn có thể tìm trong manual page của lệnh đó bằng cách dùng lệnh

$ man tên_lệnh

Chúc các bạn sử dụng Linux vui vẻ và hiệu quả 😄