[Linux-tips] Sử dụng piping, redirection, filters trong command line
Bài đăng này đã không được cập nhật trong 3 năm
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ạngs/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ả
All rights reserved