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.txtsed
| 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 -uVxargs, 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).