Câu 1awk '{print $1}' f xuất ra gì?
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
$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ĩa | Ví dụ |
|---|---|---|
$1 | Trích xuất cột 1 | awk '{print $1}' users.txt |
$2 | Trích xuất cột 2 | awk '{print $2}' users.txt |
$NF | Trích xuất cột cuối cùng | awk '{print $NF}' users.txt |
$0 | Trích xuất toàn bộ dòng | awk '{print $0}' users.txt |
-F',' | Đổi dấu phân tách thành dấu phẩy | awk -F',' '{print $1}' csv.txt |
NR | Số thứ tự dòng hiện tại | awk '{print NR, $0}' nf.txt |
NF | Số trường trên dòng | awk '{print NF}' nf.txt |
/pat/{print $1} | In cột 1 của các dòng khớp với pat | awk '/error/{print $1}' log.txt |
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
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.
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
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
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?