Hôm trước chúng ta đã tìm hiểu về cách sử dụng lệnh grep và một số quy tắc Regular Expression cơ bản trong Linux. Bài hôm nay chúng ta sẽ tìm hiểu cách sử dụng Lệnh sed, các định hướng nhập xuất và cơ chế đường ống (pipes).
Định hướng nhập, xuất
STDOUT là viết tắt của standard output, mô tả chuẩn đầu ra của Linux. STDOUT xuất kết quả ra màn hình của terminal. Khi xử lý và xuất văn bản, văn bản có thể được sàng lọc nhiều lần để có được phiên bản cuối cùng. Linux hỗ trợ tính năng ngõ ra của lệnh này là ngõ vào của lệnh kia.
Xuất ra file
Sử dụng toán tử > để xuất dữ liệu ra file, xóa file cũ nếu file đã tồn tại.
$ echo "Nov 16, 2022" > AccountAudit.txt
$ cat AccountAudit.txt
Nov 16, 2022
Như vậy ta thấy chuỗi “Nov 16, 2022” đã được ghi vào file AccountAudit.txt.
Xuất và ghi vào cuối file
Tương tự như ví dụ nên, nhưng nếu file đã tồn tại thì ghi nội dung vào cuối của file đó.
$ wc -l /etc/passwd >> AccountAudit.txt
$ cat AccountAudit.txt
Nov 16, 2019
44 /etc/passwd
Cơ chế đường ống
Ngõ ra của lệnh này là ngõ vào của lệnh kia.
$ grep /bin/bash$ /etc/passwd | wc -l
3
Lệnh sed
Lệnh này dùng để chỉnh sửa văn bản mà không cần dùng đến các trình soạn thảo văn bản – stream editor. sed
có tốc độ rất nhanh. Quá trình chỉnh sửa bằng lệnh sed
trải qua như sau:
- Đọc một dòng văn bản tại một thời điểm từ luồng đầu vào.
- Khớp các văn bản đó với các lệnh cung cấp.
- Sửa đổi văn bản như chỉ định của các lệnh.
- Hiển thị văn bản đã sửa đổi.
Sau khi kết thúc một dòng, quy trình này sẽ được lặp lại cho đến hết văn bản.
Lệnh này nghe có vẻ khó hiểu, đầu tiên về cú pháp của nó:
sed [OPTIONS] [SCRIPT]… [FILENAME]
Để hiểu rõ hơn, chúng ta cùng đi vào ví dụ:
$ echo "I like cake." | sed 's/cake/donuts/'
I like donuts.
Toàn bộ lệnh phía sau từ khóa sed
được gọi là script, và được đặt trong dấu ngoặc kép (“”). Ở ví dụ trên script là “s/cake/donuts
“. Kí tự “s” có nghĩa là tìm kiếm chuỗi đầu tiên. Và toàn bộ ý nghĩa của câu lệnh này là thay thế từ “cake” đầu tiên bằng từ “donuts“.
Giả sử nếu chúng ta muốn thay thế toàn bộ chữ “cake” thành “donuts” thì sao? Lúc này, ta cần thêm ký tự “g” (g ngụ ý là global):
$ echo "I love cake and more cake." | sed 's/cake/donuts/g'
I love donuts and more donuts.
Ta có thể chỉnh sửa nội dung của cả file:
$ cat cake.txt
Christine likes chocolate cake.
Rich likes lemon cake.
Tim only likes yellow cake.
Samantha does not like cake.
Lệnh sed
:
$ sed 's/cake/donuts/' cake.txt
Christine likes chocolate donuts.
Rich likes lemon donuts.
Tim only likes yellow donuts.
Samantha does not like donuts.
Lưu ý là lệnh sed
chỉ thay đổi đầu ra, nó không có tác dụng thay thế file gốc ban đầu.