Sổ tay kỹ thuật

Xử lý text – awk, sed, cut, sort, uniq, xargs, column

cheatsheet#linux#awk#sed#shell· cập nhật 2026-11-06

Tra nhanh one-liner lọc, đếm, tính tổng, sửa và định dạng log hoặc output show của thiết bị mạng bằng công cụ có sẵn trên Linux.

Sửa trang này
Mục lục

Ví dụ chạy trên GNU coreutils/gawk/GNU sed (Ubuntu). Cột trong output thiết bị cách nhau bằng nhiều khoảng trắng: awk mặc định tách theo khoảng trắng liên tiếp nên hợp hơn cut. JSON/YAML thì dùng jq/yq, cú pháp regex xem Regex cheatsheet.

awk

Mục đích Lệnh
In cột 1 và cột cuối awk '{print $1, $NF}' file
Đổi dấu phân cách đầu vào awk -F: '{print $1, $7}' /etc/passwd
Bỏ dòng header awk 'NR>1' file
Lọc theo giá trị cột awk '$9 >= 500' access.log
Lọc theo regex trên một cột awk '$NF !~ /^[0-9]+$/' bgp.txt
Tổng một cột awk '{s+=$10} END {print s}' access.log
Tổng theo nhóm awk '{b[$1]+=$10} END {for (k in b) print k, b[k]}' access.log
Bỏ dòng trùng, giữ thứ tự awk '!seen[$0]++' file
Định dạng cột cố định awk '{printf "%-15s %s\n", $1, $NF}' file
Xuất CSV awk -v OFS=, '{$1=$1; print}' file
In khối từ dòng khớp A đến dòng khớp B awk '/^interface Gi0/,/^!/' running.cfg
Interface nào đang shutdown (config dạng khối) awk '/^interface/{i=$2} /^ shutdown/{print i}' running.cfg
# BGP summary (IOS XR/IOS): neighbor chưa Established (cột cuối không phải số prefix)
awk 'NR>1 && $NF !~ /^[0-9]+$/ {print $1, "AS"$3, $NF}' bgp-summary.txt
# Tổng prefix nhận
awk 'NR>1 && $NF ~ /^[0-9]+$/ {s+=$NF} END {print s}' bgp-summary.txt
# show interface brief: admin up nhưng protocol down
awk 'NR>1 && $2=="up" && $3!="up" {print $1, $4}' intf-brief.txt

sed

Mục đích Lệnh
Thay thế (mọi lần trong dòng) sed 's/old/new/g' file
Sửa tại chỗ, giữ bản .bak sed -i.bak 's/timeout = 30/timeout = 60/' app.conf
Regex mở rộng, giữ nhóm sed -E 's/^(log_level\s*=\s*).*/\1debug/' app.conf
Dấu phân cách khác khi có / sed 's#/var/log#/data/log#g' file
In dòng 10-20 sed -n '10,20p' file
In khối giữa 2 pattern sed -n '/^router bgp/,/^!/p' running.cfg
Xoá dòng comment và dòng trống sed -E '/^\s*(#|$)/d' file
Chèn dòng đầu file sed '1i # managed by ansible' file
Số dòng chứa pattern sed -n '/ERROR/=' app.log
Nhiều lệnh sed -e 's/a/b/' -e '/^$/d' file

sed -i trên macOS (BSD) cần sed -i ''. Thử lệnh không có -i trước, xem output đúng rồi mới sửa tại chỗ.

cut, sort, uniq, tr, paste

Mục đích Lệnh
Cột 1 và 3, phân cách , cut -d, -f1,3 file.csv
Ký tự 1-20 mỗi dòng cut -c1-20 file
Sort số, ngược sort -rn file
Sort theo cột 2, dạng số sort -k2,2n file
Sort giá trị dạng 1K/2M/3G du -sh * | sort -h
Sort địa chỉ IPv4 sort -V ips.txt hoặc sort -t. -k1,1n -k2,2n -k3,3n -k4,4n ips.txt
Đếm và xếp hạng sort file | uniq -c | sort -rn | head
Chỉ dòng trùng / chỉ dòng duy nhất sort file | uniq -d / sort file | uniq -u
Dòng có trong B mà không có trong A (đã sort) comm -13 a.txt b.txt
Gộp nhiều khoảng trắng thành một tr -s ' ' < file
Chữ hoa → thường tr 'A-Z' 'a-z' < file
Nối các dòng thành một, cách bằng , paste -sd, file
Bỏ dòng đầu tail -n +2 file
# Top 10 IP gọi tới nginx
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# Đếm request theo phút
awk '{print substr($4,2,17)}' /var/log/nginx/access.log | uniq -c
# Trích mọi IPv4 trong file, không trùng
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' file | sort -uV

xargs, column

Mục đích Lệnh
Chạy lệnh cho mỗi dòng xargs -I{} ping -c1 -W1 {} < hosts.txt
Song song 8 tiến trình xargs -P8 -I{} ssh {} uptime < hosts.txt
An toàn với tên file có khoảng trắng find . -name '*.log' -print0 | xargs -0 gzip
Gom nhiều tham số cho mỗi lệnh xargs -n 50 rm < files.txt
Xem lệnh trước khi chạy xargs -t -I{} echo {} < hosts.txt
Căn cột cho output lộn xộn column -t file
Căn bảng CSV column -t -s, file.csv

-I{} đã ngầm xử lý từng dòng một, không kết hợp với -n (xargs sẽ cảnh báo và bỏ -n).