Học bằng cách đọc theo thứ tự

awk — Trích xuất trường

Thực hành awk: '{print $1}' lấy một cột, $NF lấy cột cuối cùng, -F',' đổi dấu phân tách thành dấu phẩy, NR và NF, và /error/{print $2} chỉ xử lý các dòng khớp — minh họa và thực hành trên terminal trong trình duyệt.

Trích xuất cột — $1 / $NF / -F

awk là lệnh tách mỗi dòng thành các cột (trường) theo khoảng trắng và cho phép bạn xử lý từng cột một. Viết awk '{print $1}' sẽ trích xuất và in ra chỉ cột đầu tiên của mỗi dòng. Bên trong {} bạn viết hành động cần thực hiện trên mỗi dòng (ở đây là print). $1 là cột đầu tiên, $2 là cột thứ hai, và $0 chỉ toàn bộ dòng.

$NF là cách đặc biệt để chỉ cột cuối cùng. NF là biến lưu số trường trên một dòng, nên $NF trả về cột cuối cùng của dòng đó. Dù số cột khác nhau giữa các dòng, bạn vẫn luôn lấy được cột cuối. Khi dấu phân tách không phải khoảng trắng, hãy chỉ định bằng -F, chẳng hạn -F','. Tốt nhất là đặt dấu phân tách trong dấu nháy (-F',').

printf 'alice 30 tokyo\nbob 25 osaka\n' > users.txt   # tạo dữ liệu mẫu
awk '{print $1}' users.txt                              # cột 1: alice và bob
awk '{print $2}' users.txt                              # cột 2: 30 và 25
awk '{print $NF}' users.txt                             # cột cuối: tokyo và osaka
printf 'alice,30\nbob,25\n' > csv.txt                  # dữ liệu mẫu phân tách bằng dấu phẩy
awk -F',' '{print $1}' csv.txt                          # dấu phân tách là dấu phẩy, cột 1
awk đếm cột như thế nào
alice30tokyo$1 = alice$2 = 30$NF = tokyo (cuối)
$1 là cột đầu tiên, và $NF trỏ đến cột cuối cùng của dòng đó.
Cú phápÝ nghĩaVí dụ
$1Trích xuất cột 1awk '{print $1}' users.txt
$2Trích xuất cột 2awk '{print $2}' users.txt
$NFTrích xuất cột cuối cùngawk '{print $NF}' users.txt
$0Trích xuất toàn bộ dòngawk '{print $0}' users.txt
-F','Đổi dấu phân tách thành dấu phẩyawk -F',' '{print $1}' csv.txt
NRSố thứ tự dòng hiện tạiawk '{print NR, $0}' nf.txt
NFSố trường trên dòngawk '{print NF}' nf.txt
/pat/{print $1}In cột 1 của các dòng khớp với patawk '/error/{print $1}' log.txt

① Tạo dữ liệu phân tách bằng khoảng trắng với printf 'alice 30 tokyo\nbob 25 osaka\n' > users.txt.

② Kiểm tra nội dung bằng cat users.txt.

③ Dùng awk để in ra chỉ cột đầu tiên của mỗi dòng.

④ Sau đó dùng awk '{print $2}' users.txt để in ra cột thứ hai của mỗi dòng.

⑤ Tiếp theo, dùng cú pháp chỉ cột cuối cùng để in ra cột cuối của mỗi dòng.

⑥ Tạo dữ liệu phân tách bằng dấu phẩy với printf 'alice,30\nbob,25\n' > csv.txt, sau đó in cột 1 bằng tùy chọn chỉ định dấu phân tách. (Nếu bạn chạy đúng, phần giải thích sẽ hiện ra.)

Linux console
0 / 7 đã hoàn thành
Loading Linux Terminal...

Số thứ tự dòng và số trường — NR / NF

NR là biến tích hợp lưu số thứ tự của dòng đang được xử lý, và NF lưu số trường của dòng đó. Viết awk '{print NR, $0}' sẽ in mỗi dòng đầy đủ kèm số thứ tự ở trước. Với awk '{print NF}' bạn có thể xem mỗi dòng được tách thành bao nhiêu cột.

printf 'red\ngreen blue\n' > nf.txt   # tạo dữ liệu mẫu
awk '{print NR, $0}' nf.txt             # 1 red / 2 green blue
awk '{print NF}' nf.txt                 # dòng 1 có 1 cột, dòng 2 có 2 cột

① Tạo hai dòng với số trường khác nhau bằng printf 'red\ngreen blue\n' > nf.txt.

② Với awk, kết hợp biến số thứ tự dòng với toàn bộ dòng để in mỗi dòng kèm số thứ tự ở trước.

③ Sau đó in biến số trường và kiểm tra rằng dòng 1 và dòng 2 có số trường khác nhau.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

Chỉ xử lý các dòng khớp — /pat/{print ...}

Khi bạn viết một mẫu trước chương trình, awk chỉ áp dụng chương trình đó cho các dòng khớp. awk '/error/{print $1}' in cột 1 chỉ với các dòng chứa error. Trong khi grep hiển thị toàn bộ dòng, awk có thể trích xuất chỉ những cột bạn cần từ các dòng khớp.

Xử lý chỉ các dòng khớp bằng mẫu
awk '{print $1}' fin cột 1 củamọi dòngawk '/error/{print $1}' fcột 1 chỉ củadòng error
Mẫu trước chương trình thu hẹp các dòng được xử lý.
printf 'error disk\ninfo start\nerror cpu\n' > log.txt   # tạo dữ liệu mẫu
awk '/error/{print $2}' log.txt                            # cột 2 của dòng error: disk và cpu

① Tạo tệp dữ liệu mẫu với printf 'error disk\ninfo start\nerror cpu\n' > log.txt.

② Với awk, viết mẫu trước chương trình và in cột 2 chỉ cho các dòng chứa error.

③ Kiểm tra rằng các từ được in ra chỉ là các cột trích xuất từ dòng error.

④ Cũng chạy grep error log.txt và so sánh: grep in toàn bộ dòng, còn awk chỉ in cột 2.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1awk '{print $1}' f xuất ra gì?

Câu 2Bạn thêm tùy chọn nào để awk dùng dấu phẩy làm dấu phân tách?

Câu 3awk '/error/{print $1}' f xử lý những dòng nào?