Trong bài viết này, chúng ta sẽ khám phá 10 lệnh sed cực kỳ hữu ích giúp bạn chỉnh sửa file cấu hình trong môi trường Linux nhanh chóng mà không cần phải mất thời gian mở trình soạn thảo văn bản như VIM hay NANO. Tất cả ví dụ dưới đây sẽ được demo cụ thể và trực quan áp dụng trực tiếp trên file cấu hình hay file văn bản. Và chúng ta sẽ sử dụng lệnh sed để làm việc với file cấu hình của NGINX: /etc/nginx/nginx.conf (file cấu hình chính của NGINX) và với các lệnh sed áp dụng ở đây hoàn toàn có thể sử dụng trong môi trường chạy thật (production).
Đầu tiên, giả sử bạn đã cài đặt NGINX trên máy chủ CentOS/RHEL với lệnh sau:
(lưu ý: lệnh trên phù hợp với CentOS/RHEL, tương tự trên Debian/Ubuntu dùng lệnh apt).
Sau khi cài đặt, hãy kích hoạt và chạy dịch vụ NGINX ngay lập tức bằng lệnh:
hoặc từng bước với các lệnh sudo systemctl start nginx rồi sudo systemctl enable nginx để khởi động cùng hệ thống Linux. Khi đó, bạn có thể di chuyển vào thư mục cấu hình NGINX và bắt đầu dùng sed:
Contents
- 1 1. Xóa Comment và Dòng Trống trong nginx.conf
- 2 2. Đổi Cổng NGINX từ 80 sang 8080
- 3 3. Hiển Thị Dòng server_name và Số Dòng Tương Ứng
- 4 4. Thay Thế server_name tại Dòng Xác Định
- 5 5. In Nội Dung Trong Khoảng Dòng X–Y
- 6 6. Chèn Dòng Sau Một Mẫu
- 7 7. Chèn Dòng Trước Một Mẫu
- 8 8. Thêm Một Block Toàn Bộ Theo Mẫu
- 9 9. Xóa Block location (Rollback Nhanh)
- 10 10. In Các location Block Sử Dụng Hold Buffer
- 11 Kết Luận
1. Xóa Comment và Dòng Trống trong nginx.conf
File nginx.conf thường chứa rất nhiều dòng chú thích (bắt đầu bằng #) và dòng trống, gây rối mắt, trong khi chúng ta chỉ muốn xem hoặc chỉ cần có các dòng cấu hình cần thiết. Để “làm gọn” file này nhanh chóng, chúng ta dùng lệnh sed xóa tất cả các dòng chỉ có comment hoặc hoàn toàn trống, đồng thời tạo một file backup cấu hình NGINX mặc định. Ví dụ:
Giải thích nhanh: -i.bak chỉnh sửa ngay trên file đồng thời tạo file backup nginx.conf.bak. Biểu thức '/^\s*#/d' xóa tất cả dòng bắt đầu bằng dấu # (đã có thể có khoảng trắng ở đầu) và '/^$/d' xóa các dòng trống. Sau khi chạy lệnh này, nginx.conf sẽ gọn gàng hơn rất nhiều và bạn có thể kiểm tra bằng lệnh:
Nếu chạy lệnh ls, bạn sẽ thấy một file nginx.conf.bak vừa được tạo để lưu trữ nội dung cũ.
-
Lệnh:
-
Giải thích:
-
-i.bak: chỉnh sửa trực tiếp file và tạo bản backup có đuôi.bak. -
^\s*#: khớp các dòng comment (bắt đầu bằng#, có thể có khoảng trắng trước). -
^$: khớp các dòng trống. -
d: lệnhdeletexóa những dòng khớp trên.
-
Kết quả là file cấu hình sạch sẽ hơn, không có dòng chú thích hay dòng trống rác.


2. Đổi Cổng NGINX từ 80 sang 8080
Mặc định NGINX lắng nghe trên cổng 80. Nếu bạn muốn đổi sang cổng 8080 (ví dụ vì cổng 80 đã bị chiếm cho dịch vụ web server khác), có thể dùng sed để tìm và thay tất cả các chỉ thị listen 80; thành listen 8080;. Vì file có thể chứa cả lệnh cho IPv4 và IPv6, nên chúng ta thực hiện 2 phép thay thế trong một lệnh:
Trong đó, các phần chính:
-
listen\s\+80;thay thànhlisten 8080;(IPv4). -
\[::\]:80;thay thành[::]:8080;(IPv6).
Lệnh trên dùng -i để chỉnh sửa tại chỗ (có thể thêm .bak nếu cần lệnh tạo file backup), và hai lệnh thay thế được nối bằng dấu ;. Bạn có thể xem lại kết quả bằng cách chạy:
hoặc đơn giản chỉ cần thử lại bước in file toàn bộ như trước. Như vậy, NGINX bây giờ sẽ lắng nghe trên cổng 8080.

3. Hiển Thị Dòng server_name và Số Dòng Tương Ứng
Để kiểm tra chính xác vị trí dòng chứa chỉ thị server_name trong file, chúng ta có thể dùng sed để in ra các dòng khớp cùng với số dòng. Câu lệnh sau sẽ làm điều đó:
-
-n: không tự động in ra tất cả các dòng. -
'/server_name/': chỉ tìm những dòng có chứa cụmserver_name. -
{=;p}: đối với mỗi dòng khớp, đầu tiên=in số dòng, sau đópin chính dòng đó.
Kết quả ví dụ có thể là:
(có nghĩa là dòng 25 chứa server_name _;). Biết được số dòng cụ thể giúp chúng ta xử lý thay đổi một cách an toàn hơn (chỉ sửa đúng dòng cần thay, tránh thay đổi nhầm sang dòng khác).

4. Thay Thế server_name tại Dòng Xác Định
Giả sử bạn vừa mới mua một tên miền example.com và muốn cấu hình NGINX dùng tên miền này. Nếu theo kết quả bước trước chỉ ra nó nằm ở dòng 25, ta có thể sửa đúng dòng đó bằng sed như sau:
Ở đây:
-
25s/.../.../: chỉ áp dụng phép thay thế trên dòng thứ 25. -
server_name\s\+_/: khớp phầnserver_name _;. -
example.com;: là giá trị mới.
Bằng cách chỉ thay trên một dòng xác định, ta tránh được việc vô tình thay nhầm những dòng server_name khác trong file. Sau lệnh trên, bạn có thể kiểm tra lại dòng đó bằng lệnh:
để thấy nội dung đã thay đổi.

5. In Nội Dung Trong Khoảng Dòng X–Y
Đôi khi bạn chỉ muốn xem nhanh một khối nội dung trong file, chẳng hạn từ dòng 20 đến 40 để kiểm tra kết quả sửa đổi. Thao tác này cực kỳ đơn giản với sed. Ví dụ:
-
20,40p: in (print) các dòng từ 20 đến 40. -
Kết quả là màn hình sẽ hiển thị chỉ các dòng trong khoảng đó.
Đây là cách nhanh gọn để xác minh các thay đổi mà bạn vừa thực hiện, tương tự như lệnh head hay tail nhưng linh hoạt và mạnh mẽ hơn.

6. Chèn Dòng Sau Một Mẫu
Giả sử bạn muốn thêm cấu hình mới ngay sau mở đầu mỗi khối server { ... }, ví dụ tắt ghi log truy cập của NGINX: access_log off;. Với sed, bạn dùng lệnh a\ (append) để chèn dòng sau dòng chứa mẫu. Ví dụ:
Chạy lệnh trên sẽ in ra nội dung file với dòng access_log off; được thêm vào ngay bên dưới mỗi dòng server {. Lưu ý nếu chưa dùng tùy chọn -i, file gốc vẫn không thay đổi, chỉ in kết quả ra màn hình. Nếu bạn muốn ghi nội dung vào file luôn, thì thêm -i như sau:
Giải thích:
-
'/server {/a\... ': tìm dòng chứaserver {, sau đó chèn thêm (a\) dòng phía sau. -
Dòng thêm ở đây là
access_log off;(với 4 dấu cách ở đầu để đúng định dạng lồng).
Lệnh này đặc biệt hữu ích khi bạn cần áp dụng cùng một cấu hình cho tất cả khối server { ... } trong file.
7. Chèn Dòng Trước Một Mẫu
Tương tự, để chèn trước một mẫu, ta dùng lệnh i\. Ví dụ nếu muốn thêm comment chú thích ngay trước mỗi server {, bạn làm như sau:
Kết quả lệnh trên sẽ in ra nội dung với dòng # NGINX server block được chèn ngay phía trên mỗi dòng server {. Tương tự như trên, nếu cần ghi thay đổi vào file, thêm -i.
Giải thích:
-
'/server {/i\... ': tìm dòng chứaserver {, chèn trước đó dòng comment. -
# NGINX server blocklà dòng thêm vào (bạn có thể sửa thành bất kỳ chú thích nào mà bạn muốn).
Thao tác này tiện dùng để thêm ghi chú hoặc comment hướng dẫn ngay trước các khối cấu hình quan trọng, giúp tài liệu hóa file cấu hình.
8. Thêm Một Block Toàn Bộ Theo Mẫu
Giả sử bạn muốn tự động thêm một block cấu hình (ví dụ một khối location) vào tất cả các khối server trong file. Bạn có thể kết hợp lệnh a\ với nhiều dòng, sử dụng dấu \ để xuống dòng trong lệnh sed. Ví dụ:
Lệnh này sẽ thêm ngay sau mỗi server { một đoạn:
Giải thích: dấu \ cuối mỗi dòng trong lệnh cho phép sed hiểu đây là một khối lệnh nhiều dòng. Phần -i đã được thêm để viết trực tiếp vào file. Cuối cùng bạn có thể xem lại phần vừa thêm bằng cách in một đoạn dòng quanh đó:
Đoạn lệnh này nhanh chóng bổ sung các quy tắc bảo mật (chỉ cho phép localhost và các clients trong mạng nội bộ truy cập vào NGINX Web Server ) vào tất cả các server block.

9. Xóa Block location (Rollback Nhanh)
Nếu sau khi thêm một khối location / { ... } mà bạn muốn hoàn tác nhanh, sed cho phép xóa toàn bộ block này chỉ với một lệnh. Ví dụ, để xóa tất cả từ dòng bắt đầu location / { cho tới dấu } đóng đầu tiên, ta dùng:
Giải thích:
-
'/location \/': khớp dòng bắt đầu chứalocation / {. -
/}/: khớp dấu}đầu tiên (đóng block). -
d: xóa mọi dòng trong khoảng từ mẫu đầu đến mẫu sau, bao gồm cả hai.
Kết quả là cả khối location / { ... } sẽ bị xóa. Lệnh này rất hữu ích khi bạn muốn rollback nhanh các thay đổi trong file. Lưu ý: luôn đảm bảo bạn có bản backup file trước khi dùng lệnh xóa (-i), nhất là trên môi trường production.

10. In Các location Block Sử Dụng Hold Buffer
Nếu bạn chỉ muốn liệt kê nhanh các cấu hình location block mà không xóa chúng, có thể sử dụng bộ đệm “hold” của sed. Ý tưởng là tìm dòng chứa location, rồi in thêm dòng ngay trước nó (mà chúng ta đã lưu vào hold). Ví dụ lệnh sau:

Giải thích chi tiết:
-
h: Tùy chọnh(hold) sẽ lưu dòng hiện tại vào bộ đệm hold ở mỗi vòng lặp (trên mỗi dòng đầu vào). -
'/location/{g;p}': khi gặp dòng chứalocation, lệnhglấy nội dung bộ đệm hold (tức là dòng trước đó) về pattern space, rồipin nó ra. -
Kết hợp với
-n, toàn bộ qúa trình đảm bảo chỉ in các dòng mà chúng ta muốn (cụ thể là dòng liền trước mỗi dònglocationchứa pattern).
Ví dụ, nếu file có nội dung:
Lệnh trên sẽ in ra dòng index index.html; (dòng ngay trước location /). Đây là minh họa rằng sed không chỉ dùng để thay thế, mà còn có khả năng logic dòng rất linh hoạt nhờ hai bộ đệm pattern và hold.
Ghi chú: Bộ đệm hold (
hold buffer) củasedđược dùng để lưu tạm dòng hiện tại để dùng sau; Tùy chọnhchuyển dòng vào hold,gđưa hold trở lại pattern.
Kết Luận
Trên đây là 10 ví dụ thiết thực cho việc sử dụng công cụ dòng lệnh sed để tự động chỉnh sửa file cấu hình NGINX mà không cần mở trình soạn thảo. Mỗi ví dụ đều có thể kết hợp để xây dựng các tập lệnh (script) thao tác hàng loạt hoặc làm nhanh việc quản trị trên nhiều server. Đặc biệt, khi làm việc trên môi trường sản xuất, bạn nên luôn sao lưu file cấu hình trước khi chạy sed -i, để có thể khôi phục khi cần.
Các lệnh sed này sẽ giúp tiết kiệm rất nhiều thời gian (như tôi đã chia sẻ, chúng có thể “tiết kiệm hàng giờ” làm việc) mà vẫn giữ cấu hình gọn gàng, an toàn. Nếu thấy bài viết hữu ích, hy vọng bạn sẽ áp dụng được trong công việc của mình. Chúc bạn thành công và hẹn gặp lại trong các bài viết tiếp theo!
#LinuxTips#SedCommands#NGINXConfiguration#LinuxSysAdmin#CommandLineMagic#DevOpsTools#ShellScripting#LinuxAutomation#ServerConfiguration#NGINXAdmin#CauHinhNGINX#QuanTriHeThongLinux#LenhSedHuuIch#QuanLyServer#HuongDanDevOps


