TopDev

Trở Thành Chuyên Gia Dòng Lệnh: 20 Kỹ Thuật Shell Nâng Cao Mà Bạn PHẢI BIẾT!

minhdev 📖 13 phút đọc

Bạn đã thành thạo các lệnh cơ bản và biết cách viết Shell Script? Tuyệt vời! Nhưng để thực sự làm chủ Terminal, bạn cần khai phá những "bí kíp" nâng cao hơn nữa. Bài viết này sẽ bật mí 20 lệnh và kỹ thuật Shell đỉnh cao, từ tối ưu hóa workflow hàng ngày với alias, kiểm soát tiến trình, tự động hóa tác vụ định kỳ với cron, đến việc xử lý văn bản phức tạp với Regex, sed, awk và nhiều hơn thế nữa.

Hãy cùng TopDev khám phá và biến mình thành một "chuyên gia" thực thụ về dòng lệnh!



I. Tùy Chỉnh và Tối Ưu Hóa Workflow#

1. alias - Tạo lối tắt cho các lệnh dài dòng!#

  • alias là một cách để tạo tên thay thế (lối tắt) cho một lệnh hoặc một chuỗi lệnh dài. Giúp bạn tiết kiệm thời gian gõ phím và giảm thiểu lỗi.

  • Tạo alias: alias ll='ls -alF' # Tạo alias 'll' cho lệnh 'ls -alF' alias myip='curl ifconfig.me' # Tạo alias 'myip' để xem địa chỉ IP công cộng

  • Sử dụng alias: Sau khi tạo, bạn chỉ cần gõ ll hoặc myip.

  • Xóa alias: unalias ll

  • Để alias tồn tại vĩnh viễn: Thêm định nghĩa alias vào tệp cấu hình Shell của bạn (ví dụ: ~/.bashrc hoặc ~/.zshrc). Sau khi thêm, chạy source ~/.bashrc để áp dụng ngay.

2. source hoặc . - Nạp lại cấu hình tức thì#

  • source (hoặc dấu chấm .) dùng để thực thi một script trong Shell hiện tại, thay vì khởi tạo một Shell con mới.

  • Khi nào sử dụng? Rất hữu ích khi bạn muốn áp dụng các thay đổi trong tệp cấu hình (như ~/.bashrc sau khi thêm alias hoặc biến môi trường) mà không cần đóng và mở lại Terminal. source ~/.bashrc # Áp dụng các thay đổi trong .bashrc . ~/.profile # Tương tự, sử dụng dấu chấm

II. Quản Lý Tiến Trình: Nắm Quyền Kiểm Soát!#

3. Background/Foreground Process (&, fg, bg, jobs)#

Khi chạy các lệnh mất nhiều thời gian, bạn không muốn Terminal bị "treo" chờ đợi.

  • Background Process (&): Chạy một lệnh ở chế độ nền, giải phóng Terminal để bạn có thể làm việc khác. long_running_script.sh & # Chạy script ở chế độ nền Bạn sẽ thấy một job ID (ví dụ: [1] 12345) - đó là ID của tiến trình và job.

  • jobs: Hiển thị danh sách các job đang chạy ở chế độ nền. ` jobs

    Output: [1]+ Running long_running_script.sh &

    `

  • fg [job_id] (foreground): Đưa một job từ chế độ nền lên chế độ nền trước. fg 1 # Đưa job [1] lên nền trước

  • bg [job_id] (background): Đưa một job đã tạm dừng (paused) trở lại chế độ nền. Thường sau khi bạn nhấn Ctrl+Z (tạm dừng tiến trình nền trước). `

    Sau khi nhấn Ctrl+Z cho một lệnh đang chạy:

    ^Z

    [1]+ Stopped long_running_script.sh

    bg 1 # Tiếp tục chạy job [1] ở chế độ nền `

4. nohup - Giữ lệnh chạy ngay cả khi bạn đóng Terminal!#

  • nohup (no hangup) dùng để chạy một lệnh sao cho nó không bị dừng khi người dùng đăng xuất hoặc đóng Terminal. Output mặc định sẽ được chuyển hướng đến tệp nohup.out.

  • Ví dụ: ` nohup my_long_process.sh &

    Lệnh này sẽ chạy ở chế độ nền và không bị dừng ngay cả khi bạn đóng cửa sổ Terminal.

    `

5. ps, top, htop - Giám sát tiến trình hiệu quả#

  • ps (process status): Hiển thị danh sách các tiến trình đang chạy. ps aux: Hiển thị tất cả tiến trình của tất cả người dùng (User-oriented, show processes not attached to a terminal).

    • ps -ef: Hiển thị tất cả tiến trình dưới dạng đầy đủ (full listing).
  • top: Cung cấp cái nhìn động, thời gian thực về các tiến trình đang chạy, sắp xếp theo CPU hoặc RAM sử dụng. Nhấn q để thoát.

  • htop: Phiên bản nâng cao, thân thiện với người dùng hơn của top, cung cấp giao diện màu sắc, dễ đọc, có thể cuộn ngang/dọc và tương tác với các tiến trình. Cần cài đặt (sudo apt install htop hoặc sudo yum install htop).

6. kill, killall - Gửi tín hiệu đến tiến trình#

  • kill [PID]: Gửi một tín hiệu (mặc định là TERM - terminate) đến một tiến trình bằng ID của nó (PID). Tìm PID: Sử dụng ps aux | grep [tên_tiến_trình].

    • Tín hiệu quan trọng: kill [PID] hoặc kill -15 [PID] (TERM): Yêu cầu tiến trình dừng lại một cách "duyên dáng" (cho phép nó dọn dẹp trước khi thoát).

      • kill -9 [PID] (KILL): "Giết" tiến trình một cách cưỡng bức, không cho phép nó dọn dẹp. Chỉ sử dụng khi TERM không hiệu quả.
  • killall [process_name]: Gửi tín hiệu đến tất cả các tiến trình có tên được chỉ định. Tiện lợi hơn khi không cần tìm PID. killall firefox # Đóng tất cả các cửa sổ Firefox

III. Lập Lịch Tác Vụ: Tự Động Hóa Định Kỳ Với cron#

7. croncrontab - Lên lịch tác vụ tự động!#

  • cron: Là một daemon (dịch vụ chạy nền) trên Linux/Unix, có nhiệm vụ chạy các tác vụ được lên lịch tự động vào những thời điểm cụ thể.

  • crontab: Là tệp chứa các dòng lệnh (cron jobs) mà cron sẽ thực thi. Mỗi người dùng có một crontab riêng.

  • Tạo/Chỉnh sửa cron job: crontab -e # Mở crontab của bạn để chỉnh sửa Bạn sẽ thấy một trình soạn thảo văn bản (thường là vi hoặc nano). Mỗi dòng trong crontab đại diện cho một job: `

            • command_to_execute Các dấu*tương ứng với:phút giờ ngày_trong_tháng tháng ngày_trong_tuần**Ví dụ:** Chạy scriptbackup.sh` vào 3 giờ sáng mỗi ngày:

0 3 * * * /path/to/backup.sh

    - Chạy `check_disk_space.sh` vào 10 giờ sáng và 4 giờ chiều mỗi ngày làm việc (Thứ 2 đến Thứ 6):

0 10,16 * * 1-5 /path/to/check_disk_space.sh

  • Xem các cron job hiện có: crontab -l

IV. Xử Lý Văn Bản Nâng Cao: Regex, sed, awk#

8. Regular Expressions (Regex) là gì và ứng dụng của chúng trong Shell?#

  • Regex (Biểu thức chính quy): Là một chuỗi ký tự đặc biệt tạo thành một mẫu tìm kiếm. Regex được sử dụng để tìm kiếm, khớp, và thay thế các chuỗi văn bản phức tạp.

  • Ứng dụng trong Shell: Regex là "linh hồn" của các lệnh xử lý văn bản như grep, sed, awk, find (với tùy chọn regex). Ví dụ Regex đơn giản: ^abc: Khớp với chuỗi bắt đầu bằng "abc". - xyz$: Khớp với chuỗi kết thúc bằng "xyz". - a.b: Khớp với "a" theo sau bởi bất kỳ ký tự nào, rồi đến "b" (ví dụ: "axb", "aZb"). - [0-9]+: Khớp với một hoặc nhiều chữ số. - colou?r: Khớp với "color" hoặc "colour" (? làm ký tự trước đó tùy chọn).

9. sed (Stream Editor) - Thay thế và biến đổi văn bản!#

  • sed là một công cụ mạnh mẽ để lọc và biến đổi văn bản dòng theo dòng. Thường được dùng để tìm kiếm và thay thế chuỗi.

  • Ví dụ về thay thế chuỗi: Thay thế "old_text" bằng "new_text" trong myfile.txt (chỉ thay thế lần xuất hiện đầu tiên trên mỗi dòng): ` sed 's/old_text/new_text/' myfile.txt

`

- Thay thế tất cả các lần xuất hiện "error" bằng "CRITICAL_ERROR" trên mỗi dòng (thêm `g` - global flag):

sed 's/error/CRITICAL_ERROR/g' mylog.log

- Thay đổi tại chỗ (ghi đè lên tệp gốc, dùng `-i`):

sed -i 's/http:/https:/g' config.txt

10. awk - Xử lý văn bản theo cột/trường!#

  • awk là một ngôn ngữ lập trình mạnh mẽ để xử lý các tệp văn bản dựa trên các mẫu (pattern) và hành động (action). Nó đặc biệt giỏi trong việc xử lý dữ liệu theo các trường (cột).

  • Ví dụ về xử lý văn bản theo cột: In cột thứ nhất và cột thứ ba từ tệp data.txt (mặc định phân tách bằng khoảng trắng): ` awk '{print $1, $3}' data.txt

`

- Tính tổng cột thứ hai của một tệp (ví dụ: tổng kích thước tệp từ `ls -l`):

ls -l | awk '{sum += $5} END {print sum}' ($5 là cột kích thước tệp trong output của ls -l)

V. Kết Nối Mạng và Truyền Tải Dữ Liệu#

11. ssh - Đăng nhập và làm việc trên máy chủ từ xa#

  • ssh (Secure Shell) là giao thức và công cụ cho phép bạn kết nối và điều khiển an toàn một máy tính từ xa qua mạng.

  • Ví dụ: ssh username@remote_host_ip # Kết nối với máy chủ từ xa ssh -p 2222 username@remote_host_ip # Kết nối qua cổng khác (nếu không phải mặc định 22)

12. scp - Sao chép tệp an toàn giữa các máy tính#

  • scp (Secure Copy) dùng để sao chép tệp giữa các máy tính qua mạng một cách an toàn (sử dụng SSH).

  • Ví dụ: Sao chép tệp từ máy cục bộ lên máy chủ từ xa: ` scp local_file.txt username@remote_host_ip:/path/to/remote/directory/

`

- Sao chép tệp từ máy chủ từ xa về máy cục bộ:

scp username@remote_host_ip:/path/to/remote/file.txt /path/to/local/directory/

- Sao chép thư mục đệ quy (`-r`):

scp -r local_folder/ username@remote_host_ip:/path/to/remote/

13. wget hoặc curl - Tải tệp từ internet#

  • wget: Công cụ dòng lệnh đơn giản để tải tệp từ web. Thường dùng cho các tác vụ tải xuống đơn giản hoặc đệ quy. wget https://example.com/file.zip # Tải file.zip

  • curl: Công cụ mạnh mẽ hơn, đa năng hơn wget. Hỗ trợ nhiều giao thức (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, v.v.), có khả năng gửi dữ liệu (POST requests), làm việc với API, v.v. curl -O https://example.com/file.zip # Tải file.zip (-O để lưu với tên gốc) curl -o newname.html https://example.com/ # Tải và lưu thành newname.html curl -X POST -d "key=value" https://api.example.com/data # Gửi POST request

  • Phân biệt: wget thiên về tải xuống, curl thiên về truyền dữ liệu (upload/download, test API) và hỗ trợ nhiều giao thức hơn.

14. netstat hoặc ss - Kiểm tra kết nối mạng#

  • netstat (network statistics): Hiển thị các kết nối mạng, bảng định tuyến, thống kê giao diện, v.v. (đang dần bị thay thế). netstat -tulnp: Hiển thị tất cả các cổng đang lắng nghe (listening) TCP/UDP, kèm theo PID và tên chương trình.

  • ss (socket statistics): Công cụ hiện đại hơn và nhanh hơn netstat để kiểm tra các socket. ss -tulnp: Tương tự như lệnh netstat trên.

    • ss -s: Hiển thị thống kê tóm tắt về các socket.

VI. Quản Lý Hệ Thống Khác#

15. dfdu khác nhau như thế nào?#

Đây là hai lệnh thường gây nhầm lẫn nhưng có mục đích khác nhau:

  • df (disk free): Hiển thị dung lượng đĩa trống trên các hệ thống tệp (file systems) đã được mount. Nó cho biết tổng dung lượng, dung lượng đã sử dụng, dung lượng còn trống của cả phân vùng. df -h # Hiển thị ở định dạng dễ đọc (GB, MB)

  • du (disk usage): Tính toán và hiển thị dung lượng đĩa mà một tệp hoặc thư mục cụ thể đang chiếm giữ. Nó đi sâu vào từng tệp/thư mục con. du -h my_folder/ # Hiển thị dung lượng của my_folder và các thư mục con du -sh my_folder/ # Chỉ hiển thị tổng dung lượng của my_folder

16. PATH biến môi trường và cách Shell tìm kiếm các lệnh#

  • PATH: Là một biến môi trường quan trọng, chứa một danh sách các thư mục được phân tách bằng dấu hai chấm (:).

  • Cách Shell tìm kiếm lệnh: Khi bạn gõ một lệnh (ví dụ: ls, git, python), Shell sẽ duyệt qua từng thư mục trong biến PATH từ trái sang phải, tìm kiếm một tệp thực thi có tên tương ứng. Lệnh đầu tiên nó tìm thấy sẽ được thực thi.

  • Kiểm tra PATH của bạn: ` echo $PATH

    Output: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

    `

17. Thêm một thư mục vào PATH#

Để Shell có thể tìm thấy các script hoặc chương trình của bạn mà không cần gõ đường dẫn đầy đủ.

  • Tạm thời (chỉ cho phiên Terminal hiện tại): export PATH=$PATH:/path/to/your/new/directory (Thêm thư mục vào cuối PATH hiện có)

  • Vĩnh viễn: Thêm dòng export PATH=$PATH:/path/to/your/new/directory vào cuối tệp cấu hình Shell của bạn (ví dụ: ~/.bashrc hoặc ~/.zshrc), sau đó chạy source ~/.bashrc.

18. apropos - Tìm kiếm lệnh liên quan#

  • apropos [keyword]: Giúp bạn tìm kiếm các lệnh liên quan đến một chủ đề cụ thể bằng cách tìm kiếm trong các trang man (manual pages) của hệ thống. Rất hữu ích khi bạn không nhớ tên chính xác của một lệnh.

  • Ví dụ: apropos network # Tìm kiếm các lệnh liên quan đến "network" apropos find # Tìm kiếm các lệnh liên quan đến "find"

19. Giải nén tệp .tar.gz (nhắc lại và củng cố)#

Mặc dù đã đề cập, đây là một thao tác cực kỳ phổ biến và quan trọng!

  • Cú pháp: ` tar -xzvf archive.tar.gz

    -x: extract (giải nén)

    -z: gzip (xử lý với gzip)

    -v: verbose (hiển thị chi tiết)

    -f: file (chỉ định tệp archive)

    `

20. tr (translate) - Thay thế hoặc xóa ký tự#

  • tr là một bộ lọc lệnh dùng để dịch (translate) hoặc xóa các ký tự từ stdin và gửi kết quả ra stdout.

  • Ví dụ về thay thế ký tự: Chuyển đổi tất cả chữ hoa thành chữ thường: ` echo "HELLO WORLD" | tr '[:upper:]' '[:lower:]' # Output: hello world

`

- Thay thế dấu cách bằng dấu gạch ngang:

echo "my file name" | tr ' ' '-' # Output: my-file-name

  • Ví dụ về xóa ký tự (-d): Xóa tất cả các số: ` echo "My phone is 123-456-7890" | tr -d '0-9' # Output: My phone is --

`



Lời Kết#

Với 20 lệnh và kỹ thuật Shell nâng cao này, bạn không chỉ có thể thực hiện các tác vụ quản trị hệ thống phức tạp mà còn tối ưu hóa đáng kể quy trình làm việc hàng ngày của mình. Từ việc tùy chỉnh Shell với alias, quản lý tiến trình bằng jobskill, tự động hóa tác vụ định kỳ với cron, đến việc xử lý văn bản chuyên sâu bằng sedawk, bạn đã nắm trong tay những công cụ mà mọi chuyên gia dòng lệnh đều sử dụng.

Hãy dành thời gian thực hành, thử nghiệm và áp dụng chúng vào các tình huống thực tế của bạn. Dòng lệnh là một thế giới rộng lớn, và mỗi lệnh mới bạn học được sẽ mở ra thêm nhiều khả năng mới.

Bài liên quan trong #Shell

✓ Đã sao chép link