103.2 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
103 Lệnh GNU và Unix |
Mục tiêu: |
103.2 Xử lý Luồng Văn bản bằng Bộ Lọc |
Bài: |
1 trên 1 |
Giới thiệu
Xử lý văn bản là một phần chính trong công việc của mọi quản trị viên hệ thống. Doug McIlroy, một thành viên của nhóm phát triển Unix đời đầu, đã tóm tắt triết lý của Unix và nói rằng (bên cạnh nhiều điều quan trọng khác): “Viết chương trình là để xử lý các luồng văn bản, bởi vì nó chính là một giao diện phổ quát trên phạm vi toàn cầu.” Linux được lấy cảm hứng từ hệ điều hành Unix và luôn nhất quán áp dụng triết lý của Unix. Vì vậy, quản trị viên phải lường trước được việc có rất nhiều công cụ thao tác văn bản trong một bản phân phối Linux.
Đánh giá nhanh về việc Chuyển hướng và Các Đường ống
Những điều sau cũng là triết lý của Unix:
-
Viết chương trình để làm một việc và làm tốt việc đó.
-
Viết chương trình để có thể làm việc cùng nhau.
Để các chương trình có thể hoạt động cùng nhau, phương thức phổ biến nhất là thông qua việc dẫn ống và chuyển hướng. Gần như tất cả các chương trình xử lý văn bản của chúng ta đều sẽ lấy văn bản từ đầu vào tiêu chuẩn (stdin), xuất nó thành đầu ra tiêu chuẩn (stdout) và gửi lỗi cuối cùng đến đầu ra lỗi tiêu chuẩn (stderr). Trừ khi có chỉ định khác, đầu vào tiêu chuẩn sẽ chính là những gì ta nhập trên bàn phím (chương trình sẽ đọc nó sau khi người dùng nhấn phím Enter). Tương tự, đầu ra tiêu chuẩn và các lỗi sẽ được hiển thị trên màn hình cửa sổ dòng lệnh. Hãy cùng xem tiến trình này thực sự hoạt động như thế nào.
Trong cửa sổ dòng lệnh, hãy nhập cat
rồi nhấn phím Enter. Sau đó, hãy gõ một phần văn bản ngẫu nhiên.
$ cat This is a test This is a test Hey! Hey! It is repeating everything I type! It is repeating everything I type! (I will hit ctrl+c so I will stop this nonsense) (I will hit ctrl+c so I will stop this nonsense) ^C
Để biết thêm thông tin về lệnh cat
(thuật ngữ này xuất phát từ “concatenate” - nối liền), hãy tham khảo các trang hướng dẫn.
Note
|
Nếu đang làm việc trên một bản cài đặt máy chủ Linux đơn giản, một số lệnh như |
Như đã trình bày ở trên, nếu không có chỉ định nào khác, cat
sẽ đọc từ đầu vào tiêu chuẩn (bất cứ thứ gì người dùng nhập) và xuất bất cứ thứ gì nó đọc được ra cửa sổ dòng lệnh (đầu ra tiêu chuẩn của nó).
Bây giờ, hãy thử như sau:
$ cat > mytextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this ^C $ cat mytextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
>
(dấu lớn hơn) yêu cầu cat
hướng đầu ra của nó tới tệp mytextfile
mà không phải đầu ra tiêu chuẩn. Bây giờ, hãy thử như sau:
$ cat mytextfile > mynewtextfile $ cat mynewtextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Điều này có tác dụng sao chép mytextfile
sang mynewtextfile
. Ta có thể xác minh rằng hai tệp này có cùng nội dung bằng lệnh diff
:
$ diff mynewtextfile mytextfile
Vì đầu ra không có gì, các tệp đều được coi ngang bằng nhau. Bây giờ, hãy thử dùng toán tử chuyển hướng nối (>>
):
$ echo 'This is my new line' >> mynewtextfile $ diff mynewtextfile mytextfile 4d3 < This is my new line
Cho đến nay, chúng ta đã sử dụng việc chuyển hướng để tạo và thao tác với các tệp. Chúng ta cũng có thể sử dụng các đường ống (được biểu thị bằng ký hiệu |
) để chuyển hướng đầu ra của chương trình này sang một chương trình khác. Hãy cùng tìm các dòng có từ "this":
$ cat mytextfile | grep this I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this $ cat mytextfile | grep -i this This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Bây giờ, chúng ta đã dẫn đầu ra của cat
sang một lệnh khác là grep
. Hãy lưu ý khi bỏ qua chức năng phân biệt chữ hoa chữ thường (sử dụng tùy chọn -i
), kết quả nhận được sẽ có thêm một dòng bổ sung.
Xử lý Luồng Văn bản
Đọc Tệp Nén
Chúng ta sẽ tạo một tệp có tên ftu.txt
và chứa một danh sách các lệnh sau:
bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Bây giờ, chúng ta sẽ sử dụng lệnh grep
để in tất cả các dòng chứa chuỗi cat
:
$ cat ftu.txt | grep cat bzcat cat xzcat zcat
Một cách khác để lấy thông tin này là sử dụng lệnh grep
để lọc văn bản trực tiếp mà không cần sử dụng một ứng dụng khác để gửi dòng văn bản tới stdout
.
$ grep cat ftu.txt bzcat cat xzcat zcat
Note
|
Hãy nhớ rằng có rất nhiều cách để thực hiện cùng một tác vụ bằng Linux. |
Có các lệnh khác để xử lý tệp nén (bzcat
cho tệp nén bzip
, xzcat
cho tệp nén xz
và zcat
cho tệp nén gzip
) và mỗi lệnh đều được sử dụng để xem nội dung của tệp nén dựa trên thuật toán nén được sử dụng.
Sau khi xác minh tệp mới tạo ftu.txt
là tệp duy nhất trong thư mục, hãy tạo một bản nén gzip
của tệp:
$ ls ftu* ftu.txt $ gzip ftu.txt $ ls ftu* ftu.txt.gz
Tiếp theo, hãy sử dụng lệnh zcat
để xem nội dung của tệp nén gzip:
$ zcat ftu.txt.gz bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Hãy lưu ý rằng gzip
sẽ nén ftu.txt
thành ftu.txt.gz
và xóa tệp gốc. Theo mặc định, sẽ không có đầu ra nào từ lệnh gzip
được hiển thị. Tuy nhiên, nếu muốn gzip
cho biết nó đang làm gì, hãy sử dụng tùy chọn -v
(verbose) để có được đầu ra “chi tiết”.
Xem Tệp trong Pager
Ta đã biết rằng cat
sẽ nối một tệp với đầu ra tiêu chuẩn (một khi tệp được cung cấp sau lệnh). Tệp /var/log/syslog
là nơi hệ thống Linux lưu trữ mọi sự kiện quan trọng đang diễn ra trong hệ thống. Hãy sử dụng lệnh sudo
để nâng đặc quyền và đọc tệp /var/log/syslog
:
$ sudo cat /var/log/syslog
…ta sẽ thấy các tin nhắn cuộn rất nhanh trong cửa sổ dòng lệnh. Ta có thể dẫn đầu ra sang chương trình less
để kết quả được phân trang. Bằng cách sử dụng less
, ta có thể sử dụng các phím mũi tên để điều hướng thông qua đầu ra và cũng có thể sử dụng các lệnh giống vi
để điều hướng và tìm kiếm trong toàn bộ văn bản.
Tuy nhiên, thay vì dẫn lệnh cat
vào một chương trình phân trang, sẽ thực tế hơn nếu ta trực tiếp sử dụng chương trình phân trang:
$ sudo less /var/log/syslog ... (output omitted for clarity)
Lấy một phần của Tệp Văn bản
Nếu chỉ cần xem lại phần đầu hoặc phần cuối của tệp, ta có thể sử dụng nhiều phương pháp khác. Lệnh head
được sử dụng để đọc mười dòng đầu tiên của tệp theo mặc định và lệnh tail
được sử dụng để đọc mười dòng cuối cùng của tệp theo mặc định. Bây giờ, hãy thử:
$ sudo head /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) $ sudo tail /var/log/syslog Nov 13 10:24:45 hypatia kernel: [ 8001.679238] mce: CPU7: Core temperature/speed normal Nov 13 10:24:46 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:24:46 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:24:47 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:24:47 hypatia systemd[2004]: Started Tracker metadata extractor. Nov 13 10:24:54 hypatia kernel: [ 8010.462227] mce: CPU0: Core temperature above threshold, cpu clock throttled (total events = 502907) Nov 13 10:24:54 hypatia kernel: [ 8010.462228] mce: CPU4: Core temperature above threshold, cpu clock throttled (total events = 502911) Nov 13 10:24:54 hypatia kernel: [ 8010.469221] mce: CPU0: Core temperature/speed normal Nov 13 10:24:54 hypatia kernel: [ 8010.469222] mce: CPU4: Core temperature/speed normal Nov 13 10:25:03 hypatia systemd[2004]: tracker-extract.service: Succeeded.
Để giúp minh họa số dòng được hiển thị, chúng ta có thể dẫn đầu ra của lệnh head
thành lệnh nl
. Lệnh này sẽ hiển thị số dòng văn bản được truyền vào lệnh:
$ sudo head /var/log/syslog | nl 1 Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed 2 Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. 3 Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. 4 Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) 5 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' 6 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' 7 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' 8 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' 9 Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! 10 Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
Và chúng ta có thể làm tương tự bằng cách dẫn đầu ra của lệnh tail
sang lệnh wc
. Lệnh này theo mặc định sẽ đếm số từ trong tài liệu và sử dụng khóa chuyển -l
để in ra số dòng văn bản mà lệnh đã đọc:
$ sudo tail /var/log/syslog | wc -l 10
Nếu quản trị viên cần xem lại nhiều hơn (hoặc ít hơn) phần đầu hoặc phần cuối của tệp, tùy chọn -n
có thể được sử dụng để giới hạn đầu ra của lệnh:
$ sudo tail -n 5 /var/log/syslog Nov 13 10:37:24 hypatia systemd[2004]: tracker-extract.service: Succeeded. Nov 13 10:37:42 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:37:42 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:37:43 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:37:43 hypatia systemd[2004]: Started Tracker metadata extractor. $ sudo head -n 12 /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) Nov 12 08:04:30 hypatia vdr: [882] no DVB device found Nov 12 08:04:30 hypatia vdr: [882] initializing plugin: vnsiserver (1.8.0): VDR-Network-Streaming-Interface (VNSI) Server
Khái niệm cơ bản về sed - Trình chỉnh sửa Luồng
Chúng ta hãy xem các tệp, thuật ngữ và tiện ích khác không có cat
trong tên của chúng. Chúng ta có thể làm điều này bằng cách truyền tùy chọn -v
cho grep
để lệnh chỉ xuất ra các dòng không chứa cat
:
$ zcat ftu.txt.gz | grep -v cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Hầu hết những gì chúng ta có thể làm với grep
thì chúng ta cũng có thể làm với sed
— trình chỉnh sửa luồng — bao gồm việc lọc và chuyển đổi văn bản (như được nêu trong trang hướng dẫn của sed
). Trước tiên, chúng ta sẽ khôi phục tệp ftu.txt
của mình bằng cách giải nén kho lưu trữ tệp gzip
:
$ gunzip ftu.txt.gz $ ls ftu* ftu.txt
Bây giờ, chúng ta có thể sử dụng sed
để chỉ liệt kê các dòng chứa chuỗi cat
:
$ sed -n /cat/p < ftu.txt bzcat cat xzcat zcat
Chúng ta đã sử dụng dấu nhỏ hơn <
để hướng nội dung của tệp ftu.txt into
vào lệnh sed
. Từ được đặt giữa các dấu gạch chéo (tức /cat/
) là thuật ngữ mà chúng ta đang tìm kiếm. Tùy chọn -n
sẽ ra lệnh cho sed
không tạo đầu ra (trừ khi các kết quả sau này được lệnh p
hướng dẫn). Hãy thử chạy cùng lệnh này mà không có tùy chọn -n
để xem điều gì sẽ xảy ra. Sau đó, hãy thử:
$ sed /cat/d < ftu.txt cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Nếu không sử dụng tùy chọn -n
, sed
sẽ in mọi thứ từ tệp ngoại trừ những gì d
đã hướng dẫn sed
xóa khỏi đầu ra của nó.
Cách sử dụng phổ biến của sed
là tìm và thay thế văn bản trong một tệp. Giả sử chúng ta muốn thay đổi mọi lần xuất hiện của cat
thành dog
. Ta có thể sử dụng sed
để làm điều này bằng cách cung cấp tùy chọn s
để hoán đổi từng trường hợp của thuật ngữ đầu tiên (cat
) cho thuật ngữ thứ hai (dog
):
$ sed s/cat/dog/ < ftu.txt bzdog dog cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzdog zdog
Thay vì sử dụng toán tử chuyển hướng (<
) để truyền tệp ftu.txt
vào lệnh sed
, chúng ta chỉ cần lệnh sed
hoạt động trực tiếp trên tệp. Chúng ta sẽ thử điều này ngay sau đây, đồng thời tạo một bản sao lưu của tệp gốc:
$ sed -i.backup s/cat/dog/ ftu.txt $ ls ftu* ftu.txt ftu.txt.backup
Tùy chọn -i
sẽ thực hiện thao tác sed
tại chỗ trên tệp gốc. Nếu không sử dụng .backup
sau tham số -i
, điều đó có nghĩa là ta đã vừa viết lại chính tệp gốc của mình. Bất cứ nội dung nào được sử dụng làm văn bản sau tham số -i
đều sẽ trở thành tên của tệp gốc được lưu trước khi các sửa đổi mà người dùng đã yêu cầu sed
thực hiện xảy ra.
Đảm bảo tính toàn vẹn của Dữ liệu
Chúng ta đã chứng minh được việc thao tác với các tệp trong Linux là rất dễ dàng. Đôi khi, ta có thể sẽ muốn phân phối tệp cho người khác và cần chắc chắn rằng người nhận sẽ nhận được bản sao thực của tệp gốc. Một trường hợp sử dụng rất phổ biến của kỹ thuật này là khi các máy chủ phân phối Linux lưu trữ các hình ảnh CD hoặc DVD có thể tải xuống của phần mềm cùng với các tệp chứa các giá trị tổng kiểm tra được tính toán của các hình ảnh đĩa đó. Dưới đây là một kiểu ví dụ liệt kê từ máy bản sao tải xuống Debian (Debian download mirror):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [PARENTDIR] Parent Directory - [SUM] MD5SUMS 2019-09-08 17:46 274 [CRT] MD5SUMS.sign 2019-09-08 17:52 833 [SUM] SHA1SUMS 2019-09-08 17:46 306 [CRT] SHA1SUMS.sign 2019-09-08 17:52 833 [SUM] SHA256SUMS 2019-09-08 17:46 402 [CRT] SHA256SUMS.sign 2019-09-08 17:52 833 [SUM] SHA512SUMS 2019-09-08 17:46 658 [CRT] SHA512SUMS.sign 2019-09-08 17:52 833 [ISO] debian-10.1.0-amd64-netinst.iso 2019-09-08 04:37 335M [ISO] debian-10.1.0-amd64-xfce-CD-1.iso 2019-09-08 04:38 641M [ISO] debian-edu-10.1.0-amd64-netinst.iso 2019-09-08 04:38 405M [ISO] debian-mac-10.1.0-amd64-netinst.iso 2019-09-08 04:38 334M ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Trong danh sách trên, các tệp hình ảnh của bộ cài đặt Debian được đi kèm theo cùng các tệp văn bản có chứa tổng kiểm tra của các tệp từ các thuật toán khác nhau (MD5, SHA1, SHA256 và SHA512).
Note
|
Tổng kiểm tra là một giá trị bắt nguồn từ một phép tính toán học đối với một tệp dựa trên một hàm băm mật mã. Có nhiều loại hàm băm mật mã khác nhau với độ mạnh khác nhau. Kỳ thi sẽ yêu cầu bạn làm quen với việc sử dụng |
Sau khi đã tải xuống một tệp (ví dụ: hình ảnh debian-10.1.0-amd64-netinst.iso
), chúng ta sẽ so sánh tổng kiểm tra của tệp được tải xuống với giá trị tổng kiểm tra được cung cấp.
Dưới đây là một ví dụ để minh họa. Chúng ta sẽ tính giá trị SHA256 của tệp ftu.txt
bằng cách sử dụng lệnh sha256sum
:
$ sha256sum ftu.txt 345452304fc26999a715652543c352e5fc7ee0c1b9deac6f57542ec91daf261c ftu.txt
Chuỗi ký tự dài trước tên tệp là giá trị tổng kiểm tra SHA256 của tệp văn bản này. Hãy cùng tạo một tệp chứa giá trị đó để ta có thể sử dụng nó và xác minh tính toàn vẹn của tệp văn bản gốc. Chúng ta có thể làm điều này với cùng một lệnh sha256sum
và chuyển hướng đầu ra sang một tệp:
$ sha256sum ftu.txt > sha256.txt
Bây giờ, để xác minh tệp ftu.txt
, ta chỉ cần sử dụng cùng một lệnh và cung cấp tên tệp chứa giá trị tổng kiểm tra cùng với khoá chuyển -c
:
$ sha256sum -c sha256.txt ftu.txt: OK
Giá trị chứa trong tệp khớp với tổng kiểm tra SHA256 đã tính cho tệp ftu.txt
, đúng như chúng ta mong đợi. Tuy nhiên, nếu tệp gốc đã bị sửa đổi (chẳng hạn như một vài byte bị mất trong quá trình tải xuống tệp hoặc ai đó đã cố tình can thiệp vào tệp đó) thì việc kiểm tra giá trị sẽ không thành công. Trong những trường hợp như vậy, chúng ta sẽ biết rằng tệp của mình đã bị lỗi hoặc bị hỏng và sẽ không thể tin tưởng vào tính toàn vẹn của nội dung. Để chứng minh điều này, hãy cùng thêm một phần văn bản vào cuối tệp:
$ echo "new entry" >> ftu.txt
Bây giờ, chúng ta sẽ thử xác minh tính toàn vẹn của tệp:
$ sha256sum -c sha256.txt ftu.txt: FAILED sha256sum: WARNING: 1 computed checksum did NOT match
Và chúng ta thấy được rằng tổng kiểm tra không khớp với những gì được mong đợi đối với tệp. Do đó, chúng ta không thể tin tưởng vào tính toàn vẹn của tệp này. Ta có thể thử tải xuống một bản sao mới của tệp, báo cáo lỗi tổng kiểm tra cho người gửi tệp hoặc báo cáo cho nhóm bảo mật trung tâm dữ liệu, tùy thuộc vào mức độ quan trọng của tệp.
Phân tích kỹ hơn về Tệp
Lệnh kết xuất bát phân (od
) thường được sử dụng để gỡ lỗi các ứng dụng và các tệp khác nhau. Bản thân lệnh od
sẽ chỉ liệt kê nội dung của tệp ở định dạng bát phân. Chúng ta có thể sử dụng tệp ftu.txt
trước đó để thực hành với lệnh này:
$ od ftu.txt 0000000 075142 060543 005164 060543 005164 072543 005164 062550 0000020 062141 066012 071545 005163 062155 071465 066565 067012 0000040 005154 062157 070012 071541 062564 071412 062145 071412 0000060 060550 032462 071466 066565 071412 060550 030465 071462 0000100 066565 071412 071157 005164 070163 064554 005164 060564 0000120 066151 072012 005162 067165 070551 073412 005143 075170 0000140 060543 005164 061572 072141 000012 0000151
Cột đầu tiên của đầu ra là phần bù byte cho mỗi dòng đầu ra. Vì od
in ra thông tin ở định dạng bát phân theo mặc định nên mỗi dòng đều sẽ bắt đầu bằng phần bù byte gồm tám bit, theo sau là tám cột, mỗi cột đều chứa giá trị bát phân của dữ liệu trong cột đó.
Tip
|
Hãy nhớ rằng một byte có độ dài 8 bit. |
Nếu cần xem nội dung của tệp ở định dạng thập lục phân, hãy sử dụng tùy chọn -x
:
$ od -x ftu.txt 0000000 7a62 6163 0a74 6163 0a74 7563 0a74 6568 0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a 0000040 0a6c 646f 700a 7361 6574 730a 6465 730a 0000060 6168 3532 7336 6d75 730a 6168 3135 7332 0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174 0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78 0000140 6163 0a74 637a 7461 000a 0000151
Giờ đây, mỗi cột trong số tám cột sau cột phần bù byte đều được biểu thị bằng các giá trị thập lục phân tương đương của chúng.
Một cách sử dụng hữu ích của lệnh od
là để gỡ lỗi các tệp lệnh. Ví dụ: lệnh od
có thể hiển thị các ký tự thường không được nhìn thấy tồn tại trong một tệp, chẳng hạn như các mục nhập xuống dòng. Chúng ta có thể làm điều này với tùy chọn -c
để các mục nhập trong cột này sẽ được hiển thị dưới dạng ký tự tương đương của chúng thay vì hiển thị ký hiệu số cho mỗi byte:
$ od -c ftu.txt 0000000 b z c a t \n c a t \n c u t \n h e 0000020 a d \n l e s s \n m d 5 s u m \n n 0000040 l \n o d \n p a s t e \n s e d \n s 0000060 h a 2 5 6 s u m \n s h a 5 1 2 s 0000100 u m \n s o r t \n s p l i t \n t a 0000120 i l \n t r \n u n i q \n w c \n x z 0000140 c a t \n z c a t \n 0000151
Tất cả các mục nhập xuống dòng trong tệp đều được biểu thị bằng các ký tự \n
ẩn. Nếu chỉ muốn xem tất cả các ký tự trong một tệp và không cần xem thông tin phần bù byte, cột phần bù byte có thể được xóa khỏi đầu ra như sau:
$ od -An -c ftu.txt b z c a t \n c a t \n c u t \n h e a d \n l e s s \n m d 5 s u m \n n l \n o d \n p a s t e \n s e d \n s h a 2 5 6 s u m \n s h a 5 1 2 s u m \n s o r t \n s p l i t \n t a i l \n t r \n u n i q \n w c \n x z c a t \n z c a t \n
Bài tập Hướng dẫn
-
Ai đó vừa tặng một chiếc máy tính xách tay cho trường học của bạn và bạn muốn cài đặt Linux trên đó. Không có hướng dẫn sử dụng và bạn buộc phải khởi động nó từ ổ USB mà không có bất kỳ đồ họa nào. Bạn có một thiết bị đầu cuối tương tác vỏ và đối với mỗi bộ xử lý bạn có sẽ có một dòng dành cho nó trong tệp
/proc/cpuinfo
:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (lines skipped) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (more lines skipped)
-
Hãy sử dụng các lệnh
grep
vàwc
để hiển thị số lượng bộ xử lý bạn có. -
Hãy làm điều tương tự với
sed
thay vìgrep
.
-
-
Hãy khám phá tệp
/etc/passwd
cục bộ của bạn bằng các lệnhgrep
,sed
,head
vàtail
cho mỗi tác vụ bên dưới:-
Những người dùng nào có quyền truy cập vào vỏ Bash?
-
Hệ thống của bạn có nhiều người dùng tồn tại để xử lý các chương trình cụ thể hoặc cho các mục đích quản trị. Họ không có quyền truy cập vào vỏ. Có bao nhiêu người dùng trong số đó tồn tại trong hệ thống?
-
Có bao nhiêu người dùng và nhóm tồn tại trong hệ thống (hãy nhớ: chỉ sử dụng tệp
/etc/passwd
)? -
Hãy chỉ liệt kê dòng đầu tiên, dòng cuối cùng và dòng thứ mười của tệp
/etc/passwd
.
-
-
Hãy xem ví dụ về tệp
/etc/passwd
này. Hãy sao chép các dòng bên dưới vào tệp cục bộ có tênmypasswd
cho bài tập này.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Hãy liệt kê tất cả những người dùng trong nhóm
1000
(sử dụngsed
để chỉ chọn trường thích hợp) từ tệpmypasswd
của bạn. -
Hãy chỉ liệt kê tên đầy đủ của tất cả những người dùng trong nhóm này (sử dụng
sed
vàcut
).
-
Bài tập Mở rộng
Một lần nữa, bằng cách sử dụng tệp mypasswd
từ các bài tập trước, hãy nghĩ ra một lệnh Bash để chọn ra duy nhất một cá nhân từ Main Office giành chiến thắng trong cuộc thi xổ số. Hãy sử dụng lệnh sed
để chỉ in ra các dòng dành cho Main Office; sau đó, hãy sử dụng chuỗi lệnh cut
để truy xuất tên của mỗi người dùng từ các dòng này. Tiếp theo, hãy sắp xếp ngẫu nhiên các tên này và chỉ in ra tên đứng đầu trong danh sách.
+
-
Có bao nhiêu người làm việc trong lĩnh vực Tài chính, Kỹ thuật và Bán hàng? (Cân nhắc khám phá lệnh
uniq
.) -
Bạn muốn chuẩn bị một tệp CSV (các giá trị được phân tách bằng dấu phẩy) để có thể dễ dàng nhập tệp
names.csv
vào LibreOffice từ tệpmypasswd
trong ví dụ trước. Nội dung tệp sẽ có định dạng sau:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Mẹo: Sử dụng các lệnh
sed
,cut
vàpaste
để đạt được kết quả mong muốn. Hãy lưu ý rằng dấu phẩy (,
) sẽ là dấu phân cách cho tệp này. -
Giả sử rằng bảng tính
names.csv
được tạo trong bài tập trước là một tệp quan trọng và chúng ta muốn đảm bảo rằng không ai có thể can thiệp vào bảng tính đó kể từ thời điểm chúng ta gửi tệp và thời điểm người nhận nhận được tệp. Làm cách nào để chúng ta có thể đảm bảo tính toàn vẹn của tệp này bằng cách sử dụngmd5sum
? -
Bạn đã tự hứa với mình sẽ đọc một cuốn sách kinh điển, mỗi ngày 100 dòng và bạn quyết định bắt đầu với Mariner and Mystic của Herman Melville. Hãy nghĩ ra một lệnh bằng cách sử dụng
split
để tách cuốn sách này thành các phần, mỗi phần dài 100 dòng. Để có được cuốn sách ở định dạng văn bản thuần túy, hãy tìm nó tại https://www.gutenberg.org. -
Bằng cách sử dụng
ls -l
trên thư mục/etc
, bạn sẽ nhận được loại danh sách nào? Bạn sẽ chỉ hiển thị tên tệp bằng cách nào khi sử dụng lệnhcut
trên đầu ra của lệnhls
đã cho? Còn tên tệp và chủ sở hữu của các tệp thì sao? Cùng với các lệnhls -l
vàcut
, hãy sử dụng lệnhtr
để nén nhiều khoảng trắng thành một khoảng trắng để hỗ trợ định dạng đầu ra bằng lệnhcut
. -
Bài tập này giả định rằng bạn đang sử dụng một máy thật (không phải máy ảo). Bạn cũng phải có một chiếc USB. Hãy xem lại các trang hướng dẫn cho lệnh
tail
và tìm hiểu cách theo dõi tệp khi văn bản được thêm vào tệp. Trong khi theo dõi đầu ra của lệnhtail
trên tệp/var/log/syslog
, hãy cắm USB. Hãy viết ra lệnh đầy đủ mà bạn sẽ sử dụng để lấy Tên Sản phẩm, Nhà sản xuất và Tổng dung lượng bộ nhớ của USB.
Tóm tắt
Xử lý các luồng văn bản có tầm quan trọng lớn trong việc quản trị bất kỳ hệ thống nào trong Linux. Các luồng văn bản có thể được xử lý bằng tệp lệnh để tự động hóa các tác vụ hàng ngày hoặc tìm thông tin gỡ lỗi có liên quan trong tệp nhật ký. Dưới đây là một bản tóm tắt ngắn về các lệnh đã được nhắc đến trong bài học này:
cat
-
Được sử dụng để kết hợp hoặc đọc các tệp văn bản thuần túy.
bzcat
-
Cho phép xử lý hoặc đọc các tệp được nén bằng phương pháp
bzip2
. xzcat
-
Cho phép xử lý hoặc đọc các tệp được nén bằng phương pháp
xz
. zcat
-
Cho phép xử lý hoặc đọc các tệp được nén bằng phương pháp
gzip
. less
-
Phân trang nội dung của tệp và cho phép chức năng điều hướng và tìm kiếm.
head
-
Hiển thị 10 dòng đầu tiên của tệp. Với việc sử dụng khóa chuyển
-n
, có thể hiển thị ít hoặc nhiều dòng hơn. tail
-
Hiển thị 10 dòng cuối cùng của tệp. Với việc sử dụng khóa chuyển
-n
, nó có thể hiển thị ít hoặc nhiều dòng hơn. Tùy chọn-f
được sử dụng để theo dõi đầu ra của tệp văn bản có dữ liệu mới đang được ghi vào đó. wc
-
Viết tắt của “word count” (số từ), nhưng tùy thuộc vào thông số bạn sử dụng, nó sẽ đếm ký tự, từ và dòng.
sort
-
Được sử dụng để sắp xếp đầu ra của danh sách theo thứ tự bảng chữ cái, đảo ngược thứ tự bảng chữ cái hoặc theo thứ tự ngẫu nhiên.
uniq
-
Được sử dụng để liệt kê (và đếm) các chuỗi khớp.
od
-
Lệnh “octal dump” được sử dụng để hiển thị tệp nhị phân theo ký hiệu bát phân, thập phân hoặc thập lục phân.
nl
-
Lệnh “number line” sẽ hiển thị số dòng trong một tệp cũng như tạo lại một tệp với mỗi dòng được thêm vào trước bởi số dòng của nó.
sed
-
Trình chỉnh sửa luồng có thể được sử dụng để tìm các lần xuất hiện khớp của chuỗi bằng cách sử dụng Biểu thức chính quy cũng như chỉnh sửa tệp bằng cách sử dụng các mẫu được xác định trước.
tr
-
Lệnh dịch có thể thay thế các ký tự, đồng thời loại bỏ và nén các ký tự lặp lại.
cut
-
Lệnh này có thể in các cột của tệp văn bản dưới dạng các trường dựa trên dấu phân cách ký tự của tệp.
paste
-
Nối các tệp trong các cột dựa trên việc sử dụng dấu tách trường.
split
-
Lệnh này có thể chia các tệp lớn thành các tệp nhỏ hơn tùy thuộc vào tiêu chí được đặt bởi các tùy chọn của lệnh.
md5sum
-
Được sử dụng để tính toán giá trị băm MD5 của tệp. Cũng được sử dụng để xác minh tệp dựa trên giá trị băm hiện có để đảm bảo tính toàn vẹn của tệp.
sha256sum
-
Được sử dụng để tính toán giá trị băm SHA256 của tệp. Cũng được sử dụng để xác minh tệp dựa trên giá trị băm hiện có để đảm bảo tính toàn vẹn của tệp.
sha512sum
-
Được sử dụng để tính toán giá trị băm SHA512 của tệp. Cũng được sử dụng để xác minh tệp dựa trên giá trị băm hiện có để đảm bảo tính toàn vẹn của tệp.
Đáp án Bài tập Hướng dẫn
-
Ai đó vừa tặng một chiếc máy tính xách tay cho trường học của bạn và bạn muốn cài đặt Linux trên đó. Không có hướng dẫn sử dụng và bạn buộc phải khởi động nó từ ổ USB mà không có bất kỳ đồ họa nào. Bạn có một thiết bị đầu cuối tương tác vỏ và đối với mỗi bộ xử lý bạn có sẽ có một dòng dành cho nó trong tệp
/proc/cpuinfo
:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (lines skipped) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (more lines skipped)
-
Hãy sử dụng các lệnh
grep
vàwc
để hiển thị số lượng bộ xử lý bạn có.Here are two options:
$ cat /proc/cpuinfo | grep processor | wc -l $ grep processor /proc/cpuinfo | wc -l
Bạn đã biết có một số cách có thể làm điều tương tự, vậy khi nào bạn nên sử dụng chúng? Điều này phụ thuộc vào một số yếu tố, hai yếu tố quan trọng nhất là hiệu suất và khả năng đọc. Hầu như bạn sẽ sử dụng các lệnh vỏ bên trong các tệp lệnh vỏ để tự động hóa các tác vụ của mình. Các tệp lệnh càng lớn và phức tạp thì bạn càng phải lo lắng về việc duy trì tốc độ của chúng.
-
Hãy làm điều tương tự với
sed
thay vìgrep
.Bây giờ, thay vì
grep
, chúng ta sẽ thử điều này vớised
:$ sed -n /processor/p /proc/cpuinfo | wc -l
Ở đây, chúng ta đã sử dụng
sed
với tham số-n
. Vì vậy,sed
sẽ không in bất kỳ thứ gì ngoại trừ những gì khớp với biểu thứcprocessor
theo hướng dẫn của lệnhp
. Như chúng ta đã làm trong các giải phápgrep
,wc -l
sẽ đếm số dòng - cũng chính là số lượng bộ xử lý mà chúng ta có.Hãy xem ví dụ tiếp theo này:
$ sed -n /processor/p /proc/cpuinfo | sed -n '$='
Chuỗi lệnh này cung cấp các kết quả giống hệt với ví dụ trước, trong đó, đầu ra của
sed
được chuyển thành lệnhwc
. Sự khác biệt ở đây là thay vì sử dụngwc -l
để đếm số dòng,sed
lại được gọi để cung cấp chức năng tương đương. Một lần nữa, chúng ta đang chặn đầu ra củased
với tùy chọn-n
, ngoại trừ biểu thức mà chúng ta đang gọi một cách rõ ràng, tức'$='
. Biểu thức này yêu cầused
khớp với dòng cuối cùng ($
) và sau đó sẽ in số dòng đó (=
).
-
-
Hãy khám phá tệp
/etc/passwd
cục bộ của bạn bằng các lệnhgrep
,sed
,head
vàtail
cho mỗi tác vụ bên dưới:-
Những người dùng nào có quyền truy cập vào vỏ Bash?
$ grep ":/bin/bash$" /etc/passwd
Chúng ta có thể cải thiện câu trả lời này bằng cách chỉ hiển thị tên của người dùng sử dụng vỏ Bash.
$ grep ":/bin/bash$" /etc/passwd | cut -d: -f1
Tên người dùng là trường đầu tiên (tham số
-f1
của lệnhcut
) và tệp/etc/passwd
sử dụng:
làm dấu phân cách (tham số-d:
của lệnhcut
), chúng ta chỉ dẫn đầu ra của lệnhgrep
sang lệnhcut
thích hợp. -
Hệ thống của bạn có nhiều người dùng tồn tại để xử lý các chương trình cụ thể hoặc cho các mục đích quản trị. Họ không có quyền truy cập vào vỏ. Có bao nhiêu người dùng trong số đó tồn tại trong hệ thống?
Cách dễ nhất để tìm ra điều này là in ra các dòng cho các tài khoản không sử dụng vỏ Bash:
$ grep -v ":/bin/bash$" /etc/passwd | wc -l
-
Có bao nhiêu người dùng và nhóm tồn tại trong hệ thống (hãy nhớ: chỉ sử dụng tệp
/etc/passwd
)?Trường đầu tiên của bất kỳ dòng cụ thể nào trong tệp
/etc/passwd
sẽ là tên người dùng, trường thứ hai thường làx
cho biết mật khẩu người dùng không được lưu trữ ở đây (nó sẽ được mã hóa trong tệp/etc/shadow
), thứ ba là id người dùng (UID) và thứ tư là id nhóm (GID). Vì vậy, mã sau sẽ cho chúng ta biết về số lượng người dùng:$ cut -d: -f3 /etc/passwd | wc -l
Tuy nhiên, có những trường hợp mà trong đó, bạn đã thiết lập các siêu người dùng khác nhau hoặc các loại người dùng đặc biệt khác chia sẻ cùng một UID (id người dùng). Vì vậy, để đảm bảo an toàn, chúng ta sẽ dẫn kết quả của lệnh
cut
sang lệnhsort
và sau đó đếm số dòng.$ cut -d: -f3 /etc/passwd | sort -u | wc -l
Đối với số lượng nhóm:
$ cut -d: -f4 /etc/passwd | sort -u | wc -l
-
Hãy chỉ liệt kê tên đầy đủ của tất cả những người dùng trong nhóm này (sử dụng
sed
vàcut
).This will do:
$ sed -n -e '1'p -e '10'p -e '$'p /etc/passwd
Hãy nhớ rằng tham số
-n
sẽ yêu cầused
không in bất cứ thứ gì ngoài những gì được chỉ định bởi lệnhp
. Ký hiệu đô la ($
) được sử dụng ở đây là biểu thức chính quy (có nghĩa là dòng cuối cùng của tệp).
-
-
Hãy xem ví dụ về tệp
/etc/passwd
này. Hãy sao chép các dòng bên dưới vào tệp cục bộ có tênmypasswd
cho bài tập này.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Hãy liệt kê tất cả những người dùng trong nhóm
1000
(sử dụngsed
để chỉ chọn trường thích hợp) từ tệpmypasswd
của bạn.GID là trường thứ tư trong tệp
/etc/passwd
. Có thể bạn sẽ muốn thử mã này:$ sed -n /1000/p mypasswd
Trong trường hợp này, bạn cũng sẽ nhận được dòng sau:
carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
Bạn biết điều này không chính xác vì Carol Smith là thành viên của GID 2000 và nó khớp là do UID. Tuy nhiên, bạn có thể đã nhận thấy rằng sau GID, trường tiếp theo đã bắt đầu bằng ký tự chữ hoa. Chúng ta có thể sử dụng một biểu thức chính quy để giải quyết vấn đề này.
$ sed -n /:1000:[A-Z]/p mypasswd
Biểu thức
[A-Z]
sẽ khớp với bất kỳ ký tự chữ hoa nào. Bạn sẽ tìm hiểu thêm về điều này trong bài học tương ứng. -
Hãy chỉ liệt kê tên đầy đủ của tất cả những người dùng trong nhóm này (sử dụng
sed
vàcut
).Sử dụng kỹ thuật tương tự mà bạn đã dùng để giải phần đầu tiên của bài tập này và dẫn nó thành lệnh
cut
.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 Dave Edwards,Finance,,,Main Office Emma Jones,Finance,,,Main Office Frank Cassidy,Finance,,,Main Office Grace Kearns,Engineering,,,Main Office Henry Adams,Sales,,,Main Office John Chapel,Sales,,,Main Office
Chưa xong đâu! Hãy lưu ý cách các trường bên trong kết quả của bạn có thể được phân tách bằng dấu
,
. Vì vậy, chúng ta sẽ dẫn đầu ra sang một lệnhcut
khác và sử dụng,
làm dấu phân cách.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 | cut -d, -f1 Dave Edwards Emma Jones Frank Cassidy Grace Kearns Henry Adams John Chapel
-
Đáp án Bài tập Mở rộng
Một lần nữa, bằng cách sử dụng tệp mypasswd
từ các bài tập trước, hãy nghĩ ra một lệnh Bash để chọn ra duy nhất một cá nhân từ Main Office giành chiến thắng trong cuộc thi xổ số. Hãy sử dụng lệnh sed
để chỉ in ra các dòng dành cho Main Office; sau đó, hãy sử dụng chuỗi lệnh cut
để truy xuất tên của mỗi người dùng từ các dòng này. Tiếp theo, hãy sắp xếp ngẫu nhiên các tên này và chỉ in ra tên đứng đầu trong danh sách.
+
Trước tiên, hãy khám phá cách tham số -R
điều khiển đầu ra của lệnh sort
(sắp xếp). Hãy lặp lại lệnh này một vài lần trên máy của bạn (lưu ý rằng bạn cần đặt 'Main Office' trong dấu trích dẫn đơn để sed
xử lý nó dưới dạng một chuỗi):
+
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R
+ Giải pháp cho vấn đề này sẽ là:
+
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R | head -1
-
Có bao nhiêu người làm việc trong lĩnh vực Tài chính, Kỹ thuật và Bán hàng? (Cân nhắc khám phá lệnh
uniq
.)Hãy tiếp tục dựa trên những gì bạn đã học được từ các bài tập trước. Hãy thử như sau:
$ sed -n /'Main Office'/p mypasswd $ sed -n /'Main Office'/p mypasswd | cut -d, -f2
Lưu ý rằng bây giờ chúng ta không quan tâm đến
:
như một dấu phân cách. Ta chỉ cần trường thứ hai khi chia các dòng theo các ký tự,
.$ sed -n /'Main Office'/p mypasswd | cut -d, -f2 | uniq -c 4 Finance 1 Engineering 2 Sales
Lệnh
uniq
sẽ chỉ xuất ra các dòng duy nhất (không phải các dòng lặp lại) và tham số-c
chouniq
đếm số lần xuất hiện của các dòng ngang nhau. Có một lưu ý ở đây:uniq
sẽ chỉ xem xét các dòng liền kề. Nếu không phải, bạn sẽ phải sử dụng lệnhsort
. -
Bạn muốn chuẩn bị một tệp CSV (các giá trị được phân tách bằng dấu phẩy) để có thể dễ dàng nhập tệp
names.csv
vào LibreOffice từ tệpmypasswd
trong ví dụ trước. Nội dung tệp sẽ có định dạng sau:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Mẹo: Sử dụng các lệnh
sed
,cut
vàpaste
để đạt được kết quả mong muốn. Hãy lưu ý rằng dấu phẩy (,
) sẽ là dấu phân cách cho tệp này.Bắt đầu với các lệnh
sed
vàcut
dựa trên những gì chúng ta đã học được từ các bài tập trước:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname
Bây giờ, chúng ta đã có tệp
firstname
với tên của các nhân viên.$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname
Bây giờ, chúng ta đã có tệp
lastname
chứa họ của từng nhân viên.Tiếp theo, chúng ta sẽ xác định xem mỗi nhân viên làm việc trong bộ phận nào:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department
Trước khi tiến tới giải pháp cuối cùng, hãy thử các lệnh sau để xem chúng tạo ra loại đầu ra nào:
$ cat firstname lastname department $ paste firstname lastname department
Và sau đó là giải pháp cuối cùng:
$ paste firstname lastname department | tr '\t' , $ paste firstname lastname department | tr '\t' , > names.csv
Ở đây, chúng ta đã sử dụng lệnh
tr
để dịch\t
(dấu tách tab) bằng dấu,
. Lệnhtr
khá hữu ích khi chúng ta cần trao đổi các ký tự với nhau. Hãy chắc chắn là bạn có xem lại các trang hướng dẫn cho cảtr
vàpaste
. Ví dụ: chúng ta có thể sử dụng tùy chọn-d
cho dấu phân cách để làm cho lệnh trước đó bớt phức tạp hơn:$ paste -d, firstname lastname department
Chúng ta đã sử dụng lệnh
paste
ở đây để giúp bạn làm quen với nó. Tuy nhiên, chúng ta có thể dễ dàng thực hiện tất cả các tác vụ trong một chuỗi lệnh duy nhất:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
-
Giả sử rằng bảng tính
names.csv
được tạo trong bài tập trước là một tệp quan trọng và chúng ta muốn đảm bảo rằng không ai có thể can thiệp vào bảng tính đó kể từ thời điểm ta gửi tệp cho ai đó và thời điểm người nhận nhận được tệp. Làm cách nào để chúng ta có thể đảm bảo tính toàn vẹn của tệp này bằng cách sử dụngmd5sum
?Nếu xem các trang hướng dẫn cho
md5sum
,sha256sum
vàsha512sum
, bạn sẽ thấy tất cả đều bắt đầu bằng văn bản sau:“compute and check XXX message digest”
Trong đó, “XXX” là thuật toán sẽ được sử dụng để tạo thông báo tóm tắt này.
Chúng ta sẽ sử dụng
md5sum
làm ví dụ và bạn có thể thử với các lệnh khác sau này.$ md5sum names.csv 61f0251fcab61d9575b1d0cbf0195e25 names.csv
Ví dụ: bây giờ, bạn có thể cung cấp tệp thông qua dịch vụ ftp an toàn và gửi thông báo tóm tắt được tạo bằng cách sử dụng một phương tiện liên lạc an toàn khác. Nếu tệp đã được sửa đổi dù chỉ một chút thì thông báo tóm tắt cũng sẽ hoàn toàn khác. Để chứng minh điều này, hãy chỉnh sửa
names.csv
và đổi Jones thành James như trong minh họa ở đây:$ sed -i.backup s/Jones/James/ names.csv $ md5sum names.csv f44a0d68cb480466099021bf6d6d2e65 names.csv
Bất cứ khi nào cung cấp tệp để tải xuống, bạn cũng nên phân phối thông báo tóm tắt tương ứng để những người tải xuống tệp của bạn có thể tạo thông báo tóm tắt mới và đối chiếu với bản gốc. Nếu duyệt qua https://kernel.org, bạn sẽ tìm thấy trang https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc nơi có thể lấy sha256sum cho tất cả các tệp có sẵn để tải xuống.
-
Bạn đã tự hứa với mình rằng bạn sẽ đọc một cuốn sách kinh điển, mỗi ngày 100 dòng và bạn quyết định bắt đầu với Mariner and Mystic của Herman Melville. Hãy nghĩ ra một lệnh bằng cách sử dụng
split
để tách cuốn sách này thành các phần, mỗi phần dài 100 dòng. Để có được cuốn sách ở định dạng văn bản thuần túy, hãy tìm nó tại https://www.gutenberg.org.Đầu tiên, chúng ta sẽ lấy toàn bộ cuốn sách từ trang Project Gutenberg nơi bạn có thể lấy cuốn sách này và những cuốn sách khác có sẵn trong phạm vi công cộng.
$ wget https://www.gutenberg.org/files/50461/50461-0.txt
Có thể bạn sẽ cần phải cài đặt
wget
nếu chưa có nó trong hệ thống (ngoài ra, bạn cũng có thể sử dụngcurl
). Hãy sử dụngless
để xác minh sách:$ less 50461-0.txt
Bây giờ, chúng ta sẽ chia cuốn sách thành từng phần, mỗi phần có 100 dòng:
$ split -l 100 -d 50461-0.txt melville
50461-0.txt
là tệp mà chúng ta sẽ chia tách.melville
sẽ là tiền tố cho các tệp được chia.-l 100
chỉ định số dòng và tùy chọn-d
sẽ yêu cầusplit
đánh số các tệp (sử dụng hậu tố được cung cấp). Bạn có thể sử dụngnl
trên bất kỳ tệp nào được chia tách (có thể không phải trên tệp cuối cùng) và xác nhận mỗi tệp có 100 dòng. -
Bằng cách sử dụng
ls -l
trên thư mục/etc
, bạn sẽ nhận được loại danh sách nào? Bạn sẽ chỉ hiển thị tên tệp bằng cách nào khi sử dụng lệnhcut
trên đầu ra của lệnhls
đã cho? Còn tên tệp và chủ sở hữu của các tệp thì sao? Cùng với các lệnhls -l
vàcut
, hãy sử dụng lệnhtr
để nén nhiều khoảng trắng thành một khoảng trắng để hỗ trợ định dạng đầu ra bằng lệnhcut
.Bản thân lệnh
ls
sẽ chỉ cung cấp cho bạn tên của các tệp. Tuy nhiên, chúng ta có thể chuẩn bị đầu ra củals -l
(danh sách dài) để trích xuất thông tin cụ thể hơn.$ ls -l /etc | tr -s ' ' , drwxr-xr-x,3,root,root,4096,out,24,16:58,acpi -rw-r--r--,1,root,root,3028,dez,17,2018,adduser.conf -rw-r--r--,1,root,root,10,out,2,17:38,adjtime drwxr-xr-x,2,root,root,12288,out,31,09:40,alternatives -rw-r--r--,1,root,root,401,mai,29,2017,anacrontab -rw-r--r--,1,root,root,433,out,1,2017,apg.conf drwxr-xr-x,6,root,root,4096,dez,17,2018,apm drwxr-xr-x,3,root,root,4096,out,24,16:58,apparmor drwxr-xr-x,9,root,root,4096,nov,6,20:20,apparmor.d
Tham số
-s
sẽ hướng dẫntr
thu nhỏ các khoảng trắng lặp lại thành một bản thể duy nhất chỉ có một khoảng trắng. Lệnhtr
sẽ hoạt động đối với mọi loại ký tự lặp lại mà bạn chỉ định. Sau đó, chúng ta sẽ thay thế khoảng trắng bằng dấu phẩy,
. Vì không cần thay thế các khoảng trắng trong ví dụ nên chúng ta sẽ chỉ bỏ qua,
.$ ls -l /etc | tr -s ' ' drwxr-xr-x 3 root root 4096 out 24 16:58 acpi -rw-r--r-- 1 root root 3028 dez 17 2018 adduser.conf -rw-r--r-- 1 root root 10 out 2 17:38 adjtime drwxr-xr-x 2 root root 12288 out 31 09:40 alternatives -rw-r--r-- 1 root root 401 mai 29 2017 anacrontab -rw-r--r-- 1 root root 433 out 1 2017 apg.conf drwxr-xr-x 6 root root 4096 dez 17 2018 apm drwxr-xr-x 3 root root 4096 out 24 16:58 apparmor
Nếu chỉ muốn tên tệp thì chúng ta chỉ cần hiển thị trường thứ chín:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9
Đối với tên tệp và chủ sở hữu tệp, chúng ta sẽ cần trường thứ chín và thứ ba:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9,3
Nếu chúng ta chỉ cần tên thư mục và chủ sở hữu của nó thì sao?
$ ls -l /etc | grep ^d | tr -s ' ' | cut -d" " -f9,3
-
Bài tập này giả định rằng bạn đang sử dụng một máy thật (không phải máy ảo). Bạn cũng phải có một chiếc USB. Hãy xem lại các trang hướng dẫn cho lệnh
tail
và tìm hiểu cách theo dõi tệp khi văn bản được thêm vào tệp. Trong khi theo dõi đầu ra của lệnhtail
trên tệp/var/log/syslog
, hãy cắm USB. Hãy viết ra lệnh đầy đủ mà bạn sẽ sử dụng để lấy Tên Sản phẩm, Nhà sản xuất và Tổng dung lượng bộ nhớ của USB.$ tail -f /var/log/syslog | grep -i 'product\:\|blocks\|manufacturer' Nov 8 06:01:35 brod-avell kernel: [124954.369361] usb 1-4.3: Product: Cruzer Blade Nov 8 06:01:35 brod-avell kernel: [124954.369364] usb 1-4.3: Manufacturer: SanDisk Nov 8 06:01:37 brod-avell kernel: [124955.419267] sd 2:0:0:0: [sdc] 61056064 512-byte logical blocks: (31.3 GB/29.1 GiB)
Tất nhiên đây chỉ là một ví dụ và kết quả sẽ khác biệt tùy thuộc vào từng nhà sản xuất USB. Bây giờ, hãy lưu ý rằng chúng ta đã sử dụng tham số
-i
với lệnhgrep
vì ta không chắc liệu các chuỗi mình đang tìm kiếm là chữ hoa hay chữ thường. Chúng ta cũng đã sử dụng|
như một Hàm OR logic nên thực tế chúng ta đang tìm kiếm các dòng có chứaproduct
HOẶCblocks
HOẶCmanufacturer
.