Luyện tập Vim, xử lý văn bản và biểu thức chính quy trong Linux

Vim: Các chế độ và kỹ thuật sử dụng cơ bản

Vim hoạt động qua bốn chế độ chính:

  • Normal mode: mặc định khi mở file, dùng để di chuyển, xóa, sao chép.
  • Insert mode: vào bằng i, a, I, A… để nhập văn bản.
  • Command mode: nhấn : để chạy lệnh như lưu, tìm kiếm, thiết lập.
  • Visual mode: nhấn v (ký tự), V (dòng), hoặc Ctrl+v (khối) để chọn vùng văn bản.

Một số lệnh hữu ích:

  • :set number – hiển thị số dòng.
  • y – copy, p – dán, d – cắt/xóa.
  • :w – lưu, :wq – lưu và thoát, :q! – thoát không lưu.

Các công cụ xử lý văn bản: cat, more, tail

cat dùng để hiển thị hoặc nối file:

# Hiển thị nội dung
cat file1.txt

# Nối hai file thành một
cat file1.txt file2.txt > merged.txt

# Kết hợp với grep để lọc dòng
cat log.txt | grep "ERROR"

# Phân trang khi nội dung dài
cat large.txt | less

more cho phép xem từng trang:

more document.txt

Di chuyển: phím cách (trang tiếp), mũi tên (dòng), q để thoát.

tail hiển thị cuối file, rất hữu ích với log:

# 5 dòng cuối
tail -n5 access.log

# Theo dõi thay đổi theo thời gian thực
tail -f /var/log/syslog

Biểu thức chính quy (Regular Expressions)

Cơ bản (BRE)

  • . – bất kỳ ký tự nào (trừ xuống dòng).
  • [a-z], [0-9] – phạm vi ký tự.
  • [^a-z] – ký tự không thuộc phạm vi.
  • * – lặp 0 hoặc nhiều lần; \+ – ít nhất 1 lần; \? – 0 hoặc 1 lần.
  • ^, $ – đầu/dòng cuối.
  • \<, \> – ranh giới từ.
  • \(abc\) – nhóm; tham chiếu lại bằng \1, \2

Mở rộng (ERE – dùng với grep -E hoặc sed -r)

  • +, ?, {m,n} – không cần escape.
  • | – hoặc: error|warning.
  • Nhóm dùng (...) thay vì \(...\).

Bộ ba xử lý văn bản: grep, sed, awk

grep – tìm kiếm theo mẫu

grep -n "login" /var/log/auth.log     # kèm số dòng
grep -v "success" log.txt             # loại bỏ dòng khớp
grep -E "fail|denied" secure.log      # ERE
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" access.log  # trích IP

sed – chỉnh sửa luồng

# Xóa ký tự đầu mỗi dòng
sed 's/.//' file.txt

# Thay thế toàn cục
sed 's/old/new/g' config.conf

# Xóa dòng trống
sed '/^$/d' data.txt

# Trích cột thứ 2 (dấu phân cách :)
sed -n 's/[^:]*:\([^:]*\).*/\1/p' /etc/passwd

awk – phân tích và báo cáo

# In cột đầu tiên
awk '{print $1}' report.txt

# Với dấu phân cách tùy chỉnh
awk -F: '{print $1, $6}' /etc/passwd

# Đếm số dòng có "error"
awk '/error/ {count++} END {print count+0}' app.log

# Chuyển chữ thường → hoa
awk '{print toupper($0)}' words.txt

Thực hành: Biến đổi văn bản bằng sed

  • Xóa ký tự thứ 2 mỗi dòng:
    sed -r 's/(.)(.)(.*)/\1\3/' file
  • Xóa ký tự cuối:
    sed 's/.$//' file
  • Xóa từ thứ hai:
    sed -r 's/([^ ]+ )[^ ]+(.*)/\1\2/' file
  • Hoán đổi từ đầu và cuối:
    awk '{t=$1; $1=$NF; $NF=t; print}' file
  • Xóa mọi chữ số:
    sed 's/[0-9]//g' file

Cấu trúc chương trình và dữ liệu

  • Chương trình: tập hợp lệnh máy tính thực hiện nhiệm vụ cụ thể.
  • Thuật toán: chuỗi bước rõ ràng để giải quyết vấn đề.
  • Cấu trúc dữ liệu: cách tổ chức, lưu trữ dữ liệu để truy xuất hiệu quả.
  • Dữ liệu: thông tin đầu vào/đầu ra; là tài sản cốt lõi của phần mềm.

Các loại biến trong shell

  • Môi trường: kế thừa sang tiến trình con, khai báo bằng export VAR=value.
  • Vị trí: $0 (tên lệnh), $1..$9 (tham số), $# (số tham số), $@ (mảng tham số).
  • Chỉ đọc: readonly PI=3.14 – không thể ghi đè.
  • Cục bộ: trong hàm, dùng local var=value.
  • Mã trạng thái: $? – 0 (thành công), khác 0 (lỗi).

Ví dụ: Trò chơi đoán số

#!/bin/bash
target=$((RANDOM % 100 + 1))
echo "Đã tạo số bí mật (1–100). Bắt đầu đoán!"

while true; do
    read -p "Nhập số: " guess
    if [[ ! "$guess" =~ ^[0-9]+$ ]]; then
        echo "Vui lòng nhập số nguyên!"
        continue
    fi

    if (( guess > target )); then
        echo -e "\033[33mLớn hơn số bí mật!\033[0m"
    elif (( guess < target )); then
        echo -e "\033[31mNhỏ hơn số bí mật!\033[0m"
    else
        echo -e "\033[32mChính xác! Số là $target.\033[0m"
        break
    fi
done

Thẻ: Vim linux-shell regular-expressions grep sed

Đăng vào ngày 27 tháng 5 lúc 18:31