12 lệnh lọc văn bản trên Centos / Ubuntu / Debian / Fedora

Trong bài viết này, chúng ta sẽ xem xét một số công cụ dòng lệnh lọc văn bản trên 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 hoạt động trên nó và ghi kết quả vào đầu ra tiêu chuẩn.

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

Lệnh awk

Awk là một ngôn ngữ quét và xử lý mẫu đáng chú ý, nó có thể được sử dụng để xây dựng bộ lọc hữu ích trên Linux. Ngoài ra, hãy đọc qua trang man của awk để biết thêm thông tin và tùy chọn sử dụng:

$ man awk

Lệnh sed

Trang man của sed cung cấp các tùy chọn điều khiển và hướng dẫn bổ sung. Bạn có thể xem trang man của sed bằng cách chạy lệnh sau trong terminal:

$ man sed

Lệnh Grep, Egrep, Fgrep, Rgrep

Các lệnh lọc văn bản này xuất ra các dòng khớp với một mẫu cho trước. Chúng đọc các dòng từ một tệp tin hoặc đầu vào tiêu chuẩn và mặc định in ra tất cả các dòng khớp với mẫu đó 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ỉ đơn giản là việc sử dụng các tùy chọn cụ thể của grep 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:

Lệnh head

Lệnh head được sử dụng để hiển thị các phần đầu của một tệp tin, mặc định nó hiển thị 10 dòng đầu tiên. Bạn có thể sử dụng tùy chọn -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

Lệnh tail

Lệnh tail được sử dụng để hiển thị các phần cuối của một tệp tin (mặc định là 10 dòng). Bạn có thể sử dụng tùy chọn -n num để chỉ định số dòng cần hiển thị. Lệnh dưới đây sẽ hiển thị 5 dòng cuối cùng của tệp tin đã được 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.

Ngoài ra, lệnh tail có tùy chọn đặc biệt -f để theo dõi thay đổi trong một tệp tin theo thời gian thực (đặc biệt là các tệp tin nhật ký). Lệnh sau sẽ cho phép bạn theo dõi các thay đổi trong tệp tin đã được 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.

Hãy đọc qua trang man của lệnh tail để có danh sách đầy đủ các tùy chọn sử dụng và hướng dẫn:

$ man tail

Lệnh sort

Lệnh sort được sử dụng để sắp xếp các dòng trong 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 domains.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 lệnh sort đơn giản để sắp xếp nội dung của 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

Lệnh uniq

Một trong những lệnh lọc văn bản tiếp theo là lệnh uniq, chúng được sử dụng để báo cáo hoặc loại bỏ các dòng trùng lặp, nó lọc các dòng từ đầu vào chuẩn và ghi kết quả vào đầu ra chuẩn. Sau khi chạy lệnh sort trên một luồng đầu vào, bạn có thể loại bỏ các dòng trùng lặp bằng lệnh uniq như ví dụ dưới đây.

Để hiển thị số lần xuất hiện của mỗi dòng, sử dụng tùy chọn -c và bỏ qua sự khác biệt về chữ hoa chữ thường khi so sánh bằng cách sử dụng 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 

Hãy đọc qua trang man của lệnh uniq để biết thêm thông tin và các tùy chọn sử dụng:

$ man uniq

Lệnh fmt

fmt là một công cụ định dạng văn bản đơn giản và hiệu quả, nó sắp xếp lại các đoạn văn trong tệp đã chỉ định và hiển thị kết quả trên đầ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 tùy chọn -w để xác định độ rộng tối đa của dòng:

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

Lệnh pr

Lệnh lọc văn bản - pr chuyển đổi các tệp văn bản hoặc đầu vào tiêu chuẩn để 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 cài đặt như sau:

$ dpkg -l

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

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 tùy chọn sử dụng ở đây là:

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

Lệnh tr

Trình công cụ này chuyển đổi hoặc xóa các ký tự từ đầu vào tiêu chuẩn và viết kết quả ra đầu ra tiêu chuẩn. Cú pháp sử dụng tr như sau:

$ tr options set1 set2

Hãy 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ả là chữ in hoa).

Tiếp theo, set2 ([:lower:]) đại diện cho trường hợp mà các ký tự kết quả sẽ có. Điều này cũng áp dụng cho ví dụ thứ hai và chuỗi thoát ra \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

Lệnh more

Lệnh more là một công cụ hữu ích để xem nội dung tệp dưới dạng trang, 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--

Lệnh less

Lệnh less là tương tự như lệnh more ở trên, nhưng nó cung cấp các tính năng bổ sung và nhanh hơn một chút với các tệp lớn. Bạn có thể sử dụng nó theo cách tương tự 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ả 12 lệnh lọc văn bản hữu ích trong Linux. Những ví dụ bên trên sẽ giúp bạn hình dung rõ ràng hơn và áp dụng chúng vào thực tế để quản lý hệ điều hành.