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ặcCtrl+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