3.2 Bài 1
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
3 Sức mạnh của Dòng lệnh |
Mục tiêu: |
3.2 Tìm kiếm và Trích xuất Dữ liệu từ Tệp |
Bài: |
1 trên 2 |
Giới thiệu
Trong bài học này, chúng ta sẽ tập trung vào việc chuyển hướng hoặc truyền thông tin từ nguồn này sang nguồn khác với sự trợ giúp của các công cụ cụ thể. Dòng lệnh Linux chuyển hướng thông tin qua các kênh tiêu chuẩn cụ thể. Đầu vào tiêu chuẩn (stdin hoặc kênh 0) của lệnh được coi là bàn phím và đầu ra tiêu chuẩn (stdout hoặc kênh 1) được coi là màn hình. Ngoài ra còn có một kênh khác được sử dụng để chuyển hướng đầu ra lỗi (stderr hoặc kênh 2) của lệnh hoặc thông báo lỗi của chương trình. Đầu vào và/hoặc đầu ra có thể được chuyển hướng.
Khi chạy một lệnh, đôi khi chúng ta sẽ muốn truyền một số thông tin đến lệnh hoặc chuyển hướng đầu ra đến một tệp cụ thể. Từng chức năng này sẽ được giới thiệu trong hai phần tiếp theo.
Chuyển hướng I/O
Chuyển hướng I/O cho phép người dùng chuyển hướng thông tin từ hoặc tới một lệnh bằng cách sử dụng tệp văn bản. Như đã mô tả trước ở trên, đầu vào, đầu ra tiêu chuẩn và đầu ra lỗi có thể được chuyển hướng và thông tin có thể được lấy từ các tệp văn bản.
Chuyển hướng Đầu ra Tiêu chuẩn
Để chuyển hướng đầu ra tiêu chuẩn sang một tệp thay vì màn hình, chúng ta cần sử dụng toán tử >
kèm theo sau là tên của tệp. Nếu tệp không tồn tại thì một tệp mới sẽ được tạo; nếu tệp đã có sẵn thì thông tin sẽ ghi đè lên tệp này.
Để xem nội dung của tệp vừa tạo, chúng ta có thể sử dụng lệnh cat
. Theo mặc định, lệnh này sẽ hiển thị nội dung của một tệp trên màn hình. Hãy tham khảo trang hướng dẫn để tìm hiểu thêm về các chức năng của nó.
Ví dụ dưới đây sẽ minh họa chức năng của toán tử. Trong trường hợp đầu tiên, một tệp mới được tạo có chứa văn bản “Hello World!”:
$ echo "Hello World!" > text $ cat text Hello World!
Trong lần gọi thứ hai, tệp đó sẽ bị ghi đè bằng văn bản mới:
$ echo "Hello!" > text $ cat text Hello!
Nếu muốn thêm thông tin mới vào cuối tệp, chúng ta cần sử dụng toán tử >>
. Toán tử này cũng sẽ tạo một tệp mới nếu nó không thể tìm thấy tệp hiện có.
Ví dụ đầu tiên cho ta thấy về việc bổ sung văn bản. Như có thể thấy, văn bản mới đã được thêm vào dòng sau:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
Ví dụ thứ hai minh hoạ việc một tệp mới sẽ được tạo:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Chuyển hướng Lỗi Tiêu chuẩn
Để chỉ chuyển hướng các thông báo lỗi, người dùng sẽ cần sử dụng toán tử 2>
kèm theo sau là tên của tệp chứa lỗi. Nếu tệp không tồn tại thì tệp mới sẽ được tạo; nếu tệp đã có sẵn thì nó sẽ bị ghi đè.
Như đã giải thích, kênh chuyển hướng lỗi tiêu chuẩn là kênh 2. Kênh phải được chỉ định khi chuyển hướng lỗi tiêu chuẩn, trái ngược với đầu ra tiêu chuẩn khác nơi kênh 1 được chỉ định theo mặc định. Ví dụ: lệnh sau sẽ tìm kiếm tệp hoặc thư mục có tên games
và chỉ ghi lỗi vào tệp text-error
, cùng lúc hiển thị đầu ra tiêu chuẩn trên màn hình:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Để biết thêm thông tin về lệnh |
Ví dụ: lệnh sau sẽ chạy mà không có lỗi, do đó sẽ không có thông tin nào được ghi lại trong tệp text-error
:
$ sort /etc/passwd 2> text-error $ cat text-error
Cũng như đầu ra tiêu chuẩn, lỗi tiêu chuẩn cũng có thể được thêm vào một tệp có toán tử 2>>
. Thao tác này sẽ thêm lỗi mới vào cuối tệp. Nếu tệp không tồn tại, một tệp mới sẽ được tạo. Ví dụ đầu tiên cho thấy việc bổ sung thông tin mới vào tệp, trong khi ví dụ thứ hai cho thấy lệnh tạo một tệp mới khi không thể tìm thấy tệp có cùng tên hiện có:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
Khi sử dụng loại chuyển hướng này, sẽ chỉ có các thông báo lỗi được chuyển hướng đến tệp, đầu ra bình thường sẽ được ghi trên màn hình hoặc chuyển qua đầu ra tiêu chuẩn hoặc stdout.
Có một tệp cụ thể mà về mặt kỹ thuật có thể coi là một bit bucket (một tệp chấp nhận đầu vào và không thực hiện bất kỳ hành động nào với nó): /dev/null
. Bạn có thể chuyển hướng bất kỳ thông tin không liên quan nào mà bạn không muốn được hiển thị hoặc được chuyển hướng vào một tệp quan trọng như minh họa trong ví dụ dưới đây:
$ sort /etc 2> /dev/null
Chuyển hướng Đầu vào Tiêu chuẩn
Loại chuyển hướng này được sử dụng để nhập dữ liệu cho một lệnh từ một tệp được chỉ định thay vì bàn phím. Trong trường hợp này, toán tử <
được sử dụng như minh họa trong ví dụ dưới đây:
$ cat < text Hello! Hello to you too!
Chuyển hướng đầu vào tiêu chuẩn thường được sử dụng với các lệnh không chấp nhận đối số tệp. Lệnh tr
là một trong số đó. Lệnh này có thể được sử dụng để biên dịch nội dung tệp bằng cách sửa đổi các ký tự trong tệp theo những cách cụ thể, chẳng hạn như xóa bất kỳ ký tự cụ thể nào khỏi tệp; ví dụ bên dưới cho thấy việc xóa ký tự l
:
$ tr -d "l" < text Heo! Heo to you too!
Để biết thêm thông tin, hãy tham khảo trang hướng dẫn của tr
.
Here Documents
Không giống như việc chuyển hướng đầu ra, toán tử <<
hoạt động theo một cách khác so với các toán tử khác. Luồng đầu vào này còn được gọi là here document. Here document đại diện cho khối mã hoặc văn bản có thể được chuyển hướng đến lệnh hoặc chương trình tương tác. Các loại ngôn ngữ kịch bản khác nhau như bash
, sh
và csh
có thể lấy đầu vào trực tiếp từ dòng lệnh mà không cần sử dụng bất kỳ tệp văn bản nào.
Như có thể thấy trong ví dụ dưới đây, toán tử được sử dụng để nhập dữ liệu vào lệnh, trong khi từ đứng sau lại không chỉ định tên tệp. Từ này được hiểu là dấu phân tách của đầu vào và nó sẽ không được coi là một phần của nội dung, do đó mà cat
sẽ không hiển thị nó:
$ cat << hello > hey > ola > hello hey ola
Tham khảo trang hướng dẫn của lệnh cat
để tìm thêm thông tin.
Kết hợp
Sự kết hợp đầu tiên mà chúng ta sẽ khám phá là giữa việc chuyển hướng đầu ra tiêu chuẩn và đầu ra lỗi tiêu chuẩn vào cùng một tệp. Các toán tử &>
và &>>
sẽ được sử dụng; &
biểu thị sự kết hợp của kênh 1 và kênh 2. Toán tử đầu tiên sẽ ghi đè lên nội dung hiện có của tệp và toán tử thứ hai sẽ nối hoặc thêm thông tin mới vào cuối tệp. Cả hai toán tử sẽ cho phép tạo tệp mới nếu nó chưa tồn tại giống như ở trong các phần trước:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Hãy xem một ví dụ sử dụng lệnh cut
:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
Lệnh cut
sẽ cắt các trường được chỉ định khỏi tệp đầu vào bằng cách sử dụng tùy chọn -f
, trong trường hợp này sẽ là trường thứ 3. Để lệnh tìm được trường, dấu phân tách cũng cần phải được chỉ định bằng tùy chọn -d
. Trong trường hợp của chúng ta, ký tự phân tách sẽ là dấu /
.
Để tìm hiểu thêm về lệnh cut
, hãy tham khảo trang hướng dẫn của nó.
Đường ống Dòng lệnh
Việc chuyển hướng chủ yếu được sử dụng để lưu trữ kết quả của một lệnh sẽ được xử lý bởi một lệnh khác. Loại quy trình trung gian này có thể trở nên rất mất công và phức tạp nếu bạn muốn dữ liệu trải qua nhiều quy trình. Để tránh điều này, bạn có thể liên kết lệnh trực tiếp qua các đường ống. Nói cách khác, đầu ra của lệnh đầu tiên sẽ tự động trở thành đầu vào của lệnh thứ hai. Kết nối này được thực hiện bằng cách sử dụng toán tử |
(thanh dọc):
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
Trong ví dụ trên, lệnh less
đứng sau toán tử đường ống sẽ sửa đổi cách hiển thị tệp. Lệnh less
hiển thị tệp văn bản cho phép người dùng cuộn lên và xuống một dòng tại thời điểm đó. less
cũng được sử dụng theo mặc định để hiển thị các trang hướng dẫn như đã được nhắc tới trong các bài học trước.
Có thể sử dụng nhiều đường ống cùng một lúc. Các lệnh trung gian sẽ nhận đầu vào, sau đó thay đổi nó và tạo ra đầu ra được gọi là bộ lọc. Hãy sử dụng lệnh ls -l
và thử đếm số từ trong 10 dòng đầu tiên của kết quả. Để làm điều này, chúng ta sẽ phải sử dụng lệnh head
mà theo mặc định sẽ hiển thị 10 dòng đầu tiên của tệp và sau đó đếm số từ bằng lệnh wc
:
$ ls -l | head | wc -w 10
Như đã đề cập trước đó, theo mặc định, head
sẽ chỉ hiển thị 10 dòng đầu tiên của tệp văn bản được chỉ định. Hành vi này có thể được sửa đổi bằng cách sử dụng các tùy chọn cụ thể. Hãy kiểm tra trang hướng dẫn của lệnh để tìm thêm thông tin.
Như đã đề cập trước đó, theo mặc định, head
chỉ hiển thị 10 dòng đầu tiên của tệp văn bản được chỉ định. Hành vi này có thể được sửa đổi bằng cách sử dụng các tùy chọn cụ thể. Hãy kiểm tra trang hướng dẫn của lệnh để tìm thêm thông tin.
Note
|
Tùy chọn |
Theo mặc định, lệnh wc
(word count - số từ) sẽ đếm số dòng, từ và byte của tệp. Như được nhắc đến trong bài tập, tùy chọn -w
sẽ khiến lệnh chỉ đếm từ ở trong các dòng đã chọn. Các tùy chọn phổ biến nhất mà bạn có thể sử dụng với lệnh này là -l
để chỉ định cho lệnh chỉ đếm các dòng và -c
được sử dụng để chỉ đếm các byte. Có thể tìm thấy trong trang hướng dẫn của lệnh nhiều biến thể và tùy chọn khác của lệnh cũng như thêm thông tin về wc
.
Bài tập Hướng dẫn
-
Hãy liệt kê nội dung của thư mục hiện tại của bạn, bao gồm quyền sở hữu và các quyền, đồng thời chuyển hướng đầu ra tới một tệp có tên
contents.txt
trong thư mục chính của bạn. -
Hãy sắp xếp nội dung của tệp
contents.txt
từ thư mục hiện tại của bạn và nối nó vào cuối tệp mới có têncontents-sorted.txt
. -
Hãy hiển thị 10 dòng cuối cùng của tệp
/etc/passwd
và chuyển hướng nó tới một tệp mới trong thư mụcDocuments
người dùng của bạn. -
Hãy đếm số từ trong tệp
contents.txt
và nối đầu ra vào cuối tệpfield2.txt
trong thư mục chính của bạn. Bạn sẽ cần sử dụng cả chuyển hướng đầu vào và đầu ra. -
Hãy hiển thị 5 dòng đầu tiên của tệp
/etc/passwd
và sắp xếp đầu ra theo thứ tự bảng chữ cái đảo ngược. -
Sử dụng tệp
contents.txt
đã tạo trước đó, hãy đếm số ký tự của 9 dòng cuối cùng. -
Hãy đếm số lượng tệp có tên
test
trong thư mục/usr/share
và các thư mục con của nó. Lưu ý: mỗi dòng đầu ra từ lệnhfind
sẽ đại diện cho một tệp.
Bài tập Mở rộng
-
Hãy chọn trường thứ hai của tệp
contents.txt
và chuyển hướng đầu ra tiêu chuẩn và đầu ra lỗi sang một tệp khác có tênfield1.txt
. -
Sử dụng toán tử chuyển hướng đầu vào và lệnh
tr
, hãy xóa dấu gạch ngang (-
) khỏi tệpcontents.txt
. -
Lợi ích lớn nhất của việc chỉ chuyển hướng lỗi đến một tệp là gì?
-
Hãy thay thế tất cả các khoảng trắng lặp lại trong tệp
contents.txt
được sắp xếp theo thứ tự bảng chữ cái bằng một khoảng trắng. -
Trong một dòng lệnh, hãy loại bỏ các khoảng trắng lặp lại (như đã thực hiện trong bài tập trước), chọn trường thứ chín và sắp xếp theo thứ tự bảng chữ cái đảo ngược và không phân biệt chữ hoa chữ thường. Bạn đã phải sử dụng bao nhiêu đường ống?
Tóm tắt
Trong bài học này, bạn đã học về:
-
Các loại chuyển hướng
-
Cách sử dụng các toán tử chuyển hướng
-
Cách sử dụng đường ống để lọc đầu ra của lệnh
Các lệnh được sử dụng trong bài này:
cut
-
Loại bỏ các phần từ mỗi dòng của một tệp.
cat
-
Hiển thị hoặc nối các tệp.
find
-
Tìm kiếm các tệp trong một hệ thống phân cấp thư mục.
less
-
Hiển thị một tệp, cho phép người dùng cuộn một dòng tại một thời điểm.
more
-
Hiển thị một tệp, một trang tại thời điểm đó.
head
-
Hiển thị 10 dòng đầu tiên của tệp.
tail
-
Hiển thị 10 dòng cuối cùng của tệp.
sort
-
Sắp xếp các tệp.
wc
-
Đếm theo mặc định số dòng, từ hoặc byte của tệp.
Đáp án Bài tập Hướng dẫn
-
Hãy liệt kê nội dung của thư mục hiện tại của bạn, bao gồm quyền sở hữu và các quyền, đồng thời chuyển hướng đầu ra tới một tệp có tên
contents.txt
trong thư mục chính của bạn.$ ls -l > contents.txt
-
Hãy sắp xếp nội dung của tệp
contents.txt
từ thư mục hiện tại của bạn và nối nó vào cuối tệp mới có têncontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Hãy hiển thị 10 dòng cuối cùng của tệp
/etc/passwd
và chuyển hướng nó tới một tệp mới trong thư mụcDocuments
người dùng của bạn.$ tail /etc/passwd > Documents/newfile
-
Hãy đếm số từ trong tệp
contents.txt
và nối đầu ra vào cuối tệpfield2.txt
trong thư mục chính của bạn. Bạn sẽ cần sử dụng cả chuyển hướng đầu vào và đầu ra.$ wc < contents.txt >> field2.txt
-
Hãy hiển thị 5 dòng đầu tiên của tệp
/etc/passwd
và sắp xếp đầu ra theo thứ tự bảng chữ cái đảo ngược.$ head -n 5 /etc/passwd | sort -r
-
Sử dụng tệp
contents.txt
đã tạo trước đó, hãy đếm số ký tự của 9 dòng cuối cùng.$ tail -n 9 contents.txt | wc -c 531
-
Hãy đếm số lượng tệp có tên
test
trong thư mục/usr/share
và các thư mục con của nó. Lưu ý: mỗi dòng đầu ra từ lệnhfind
sẽ đại diện cho một tệp.$ find /usr/share -name test | wc -l 125
Đáp án Bài tập Mở rộng
-
Hãy chọn trường thứ hai của tệp
contents.txt
và chuyển hướng đầu ra tiêu chuẩn và đầu ra lỗi sang một tệp khác có tênfield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
Sử dụng toán tử chuyển hướng đầu vào và lệnh
tr
, hãy xóa dấu gạch ngang (-
) khỏi tệpcontents.txt
.$ tr -d "-" < contents.txt
-
Lợi ích lớn nhất của việc chỉ chuyển hướng lỗi đến một tệp là gì?
Chỉ chuyển hướng lỗi đến một tệp có thể giúp giữ tệp nhật ký được theo dõi thường xuyên.
-
Hãy thay thế tất cả các khoảng trắng lặp lại trong tệp
contents.txt
được sắp xếp theo thứ tự bảng chữ cái bằng một khoảng trắng.$ sort contents.txt | tr -s " "
-
Trong một dòng lệnh, hãy loại bỏ các khoảng trắng lặp lại (như đã thực hiện trong bài tập trước), chọn trường thứ chín và sắp xếp theo thứ tự bảng chữ cái đảo ngược và không phân biệt chữ hoa chữ thường. Bạn đã phải sử dụng bao nhiêu đường ống?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
Bài tập sử dụng 3 ống, mỗi ống dành cho một bộ lọc.