Những lệnh lọc/ filter văn bản để vận hành tệp hiệu quả trong Linux

Trong bài viết này, chúng ta sẽ xem xét một số công cụ dòng lệnh hoạt động như bộ lọc/ filter văn bản trong Linux. Một bộ lọc là một chương trình đọc đầu vào tiêu chuẩn, thực hiện một thao tác lên nó và ghi kết quả ra đầu ra tiêu chuẩn.

Vì lý do này, nó có thể được sử dụng để xử lý thông tin một cách mạnh mẽ như tái cấu trúc đầu ra để tạo báo cáo hữu ích, sửa đổi văn bản trong các tệp và nhiều tác vụ quản trị hệ thống khác.

Với nhưng quan điểm trên, dưới đây là một số bộ lọc tệp hoặc văn bản hữu ích trong Linux.

1. Lệnh Awk

Awk là ngôn ngữ xử lý và quét chuỗi đáng chú ý, nó có thể được sử dụng để xây dựng bộ lọc hữu ích trong Linux. Bạn có thể bắt đầu sử dụng nó bằng cách đọc qua chuỗi hướng dẫn Awk Part 1 đến Part 13 của chúng tôi.

Ngoài ra, cũng đọc qua trang man của awk để biết thêm thông tin và tùy chọn sử dụng:

$ man awk

2. Lệnh Sed

Sed là một trình biên tập dòng mạnh mẽ để lọc và biến đổi văn bản. Trang man của sed đã thêm các tùy chọn điều khiển và hướng dẫn:

$ man sed

3. Lệnh Grep, Egrep, Fgrep, Rgrep

Các bộ lọc này xuất các dòng phù hợp với một mẫu cho trước. Chúng đọc các dòng từ một tệp hoặc đầu vào tiêu chuẩn và mặc định in tất cả các dòng phù hợp ra đầu ra tiêu chuẩn.

Lưu ý: Chương trình chính là grep, các biến thể khác chỉ là việc sử dụng các tùy chọn grep cụ thể như dưới đây (và vẫn được sử dụng để tương thích ngược):

$ egrep = grep -E
$ fgrep = grep -F
$ rgrep = grep -r  

Dưới đây là một số lệnh grep cơ bản:

tecmint@TecMint ~ $ grep "aaronkilik" /etc/passwd
aaronkilik:x:1001:1001::/home/aaronkilik:

tecmint@TecMint ~ $ cat /etc/passwd | grep "aronkilik"
aaronkilik:x:1001:1001::/home/aaronkilik:

4. Lệnh Head

Head được sử dụng để hiển thị các phần đầu của một tệp, mặc định là in ra 10 dòng đầu tiên. Bạn có thể sử dụng cờ -n num để chỉ định số dòng cần hiển thị:

tecmint@TecMint ~ $ head /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)

tecmint@TecMint ~ $ head  -n 5 /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root

5. Lệnh Tail

Tail in ra các phần cuối (mặc định là 10 dòng) của một tệp. Sử dụng cờ -n num để chỉ định số dòng cần hiển thị.

Lệnh dưới đây sẽ xuất ra 5 dòng cuối cùng của tệp đã chỉ định:

tecmint@TecMint ~ $ tail -n 5 /var/log/auth.log
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

Thêm vào đó, tail có một tùy chọn đặc biệt -f để theo dõi các thay đổi trong một tệp thời gian thực (đặc biệt là các tệp nhật ký).

Lệnh sau sẽ cho phép bạn theo dõi các thay đổi trong tệp đã chỉ định:

tecmint@TecMint ~ $ tail -f /var/log/auth.log
Jan  6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

Đọc qua trang man của tail để biết danh sách đầy đủ các tùy chọn và hướng dẫn sử dụng:

$ man tail

6. Lệnh Sort

Sort được sử dụng để sắp xếp các dòng của một tệp văn bản hoặc từ đầu vào tiêu chuẩn.

Dưới đây là nội dung của một tệp có tên domain.list:

tecmint@TecMint ~ $ cat domains.list
tecmint.com
tecmint.com
news.tecmint.com
news.tecmint.com
linuxsay.com
linuxsay.com
windowsmint.com
windowsmint.com

Bạn có thể chạy một lệnh sắp xếp đơn giản để sắp xếp nội dung tệp như sau:

tecmint@TecMint ~ $ sort domains.list
linuxsay.com
linuxsay.com
news.tecmint.com
news.tecmint.com
tecmint.com
tecmint.com
windowsmint.com
windowsmint.com

7. Lệnh Uniq

Lệnh uniq được sử dụng để báo cáo hoặc loại bỏ các dòng lặp lại, nó lọc các dòng từ đầu vào tiêu chuẩn và ghi kết quả ra đầu ra tiêu chuẩn.

Sau khi chạy sort trên luồng đầu vào, bạn có thể loại bỏ các dòng lặp lại bằng uniq như ví dụ dưới đây.

Để chỉ số lượng lần xuất hiện của một dòng, sử dụng tùy chọn -c và bỏ qua sự khác biệt trong việc so sánh bằng cách bao gồm tùy chọn -i:

tecmint@TecMint ~ $ cat domains.list
tecmint.com
tecmint.com
news.tecmint.com
news.tecmint.com
linuxsay.com
linuxsay.com
windowsmint.com

tecmint@TecMint ~ $ sort domains.list | uniq -c 
2 linuxsay.com
2 news.tecmint.com
2 tecmint.com
1 windowsmint.com 

Đọc qua trang man của uniq để biết thêm thông tin sử dụng và các cờ khác:

$ man uniq

8. Lệnh Fmt

Fmt là công cụ định dạng văn bản đơn giản và tối ưu, nó định dạng lại đoạn văn bản trong tệp đã chỉ định và in kết quả ra đầu ra tiêu chuẩn.

Dưới đây là nội dung được trích xuất từ tệp domain-list.txt:

1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com

Để định dạng lại nội dung trên thành một danh sách chuẩn, chạy lệnh sau với cờ -w để xác định độ rộng dòng tối đa:

tecmint@TecMint ~ $ cat domain-list.txt 
1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com

tecmint@TecMint ~ $ fmt -w 1 domain-list.txt
1.tecmint.com 
2.news.tecmint.com 
3.linuxsay.com 
4.windowsmint.com

9. Lệnh Pr

Pr chuyển đổi các tệp văn bản hoặc đầu vào tiêu chuẩn cho việc in. Ví dụ trên các hệ thống Debian, bạn có thể liệt kê tất cả các gói đã cài đặt như sau:

$ dpkg -l

Để tổ chức danh sách thành trang và cột sẵn sàng cho việc in, sử dụng lệnh sau:

tecmint@TecMint ~ $ dpkg -l | pr --columns 3 -l 20  

2017-01-06 13:19                                                  Page 1


Desired=Unknown/Install ii  adduser		ii  apg
| Status=Not/Inst/Conf- ii  adwaita-icon-theme	ii  app-install-data
|/ Err?=(none)/Reinst-r ii  adwaita-icon-theme- ii  apparmor
||/ Name		ii  alsa-base		ii  apt
+++-=================== ii  alsa-utils		ii  apt-clone
ii  accountsservice	ii  anacron		ii  apt-transport-https
ii  acl			ii  apache2		ii  apt-utils
ii  acpi-support	ii  apache2-bin		ii  apt-xapian-index
ii  acpid		ii  apache2-data	ii  aptdaemon
ii  add-apt-key		ii  apache2-utils	ii  aptdaemon-data


2017-01-06 13:19                                                  Page 2


ii  aptitude		ii  avahi-daemon	ii  bind9-host
ii  aptitude-common	ii  avahi-utils		ii  binfmt-support
ii  apturl		ii  aview		ii  binutils
ii  apturl-common	ii  banshee		ii  bison
ii  archdetect-deb	ii  baobab		ii  blt
ii  aspell		ii  base-files		ii  blueberry
ii  aspell-en		ii  base-passwd		ii  bluetooth
ii  at-spi2-core	ii  bash		ii  bluez
ii  attr		ii  bash-completion	ii  bluez-cups
ii  avahi-autoipd	ii  bc			ii  bluez-obexd

.....

Các cờ được sử dụng ở đây là:

  1. --column xác định số cột được tạo ra trong đầu ra.
  2. -l chỉ định độ dài trang (mặc định là 66 dòng).

10. Lệnh Tr

Công cụ này dịch hoặc xóa các ký tự từ đầu vào tiêu chuẩn và ghi kết quả ra đầu ra tiêu chuẩn.

Cú pháp sử dụng tr như sau:

$ tr options set1 set2

Xem các ví dụ dưới đây, trong lệnh đầu tiên, set1( [:upper:] ) đại diện cho trường hợp của các ký tự đầu vào (tất cả đều viết hoa).

Sau đó, set2([:lower:]) đại diện cho trường hợp các ký tự kết quả sẽ được. Tương tự trong ví dụ thứ hai và dãy thoát \n có nghĩa là in kết quả trên một dòng mới:

tecmint@TecMint ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
www.tecmint.com

tecmint@TecMint ~ $ echo "news.tecmint.com" | tr [:lower:] [:upper:]
NEWS.TECMINT.COM

11. Lệnh More

More là một lệnh sàng lọc xem tệp hữu ích được tạo ra chủ yếu để xem các chứng chỉ. Nó hiển thị nội dung tệp dưới dạng trang, trong đó người dùng có thể nhấn [Enter] để xem thêm thông tin.

Bạn có thể sử dụng nó để xem các tệp lớn như sau:

tecmint@TecMint ~ $ dmesg | more
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
--More--

12. Lệnh Less

Less là ngược của lệnh more trên và nó cung cấp thêm tính năng và nhanh hơn đối với các tệp lớn.

Sử dụng nó theo cùng cách như more:

tecmint@TecMint ~ $ dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
:

Đó là tất cả cho bây giờ, hãy cho chúng tôi biết về bất kỳ công cụ dòng lệnh hữu ích nào không được đề cập ở đây, hoạt động như các bộ lọc văn bản trong Linux thông qua phần bình luận dưới đây.