Chỉnh sửa tập tin qua tập lệnh bash


12

Tôi là người mới bắt đầu tập lệnh bash. Tôi muốn tạo tập lệnh bash để cài đặt cài đặt và định cấu hình nội dung trên hộp linux của mình theo cách tự động.

Giả sử tôi muốn chỉnh sửa

/etc/yum.repos.d/epel.repo

bởi kịch bản bash

Những gì tôi muốn làm là như sau

  1. Mở tệp /etc/yum.repos.d/epel.repo
  2. Tìm phần [epel]
  3. Thêm mức ưu tiên dòng = 10 ngay sau khi dòng được bật = 1 trong phần epel

Đối với phần đầu tiên tôi đã thêm

yum install nano
nano /etc/yum.repos.d/epel.repo

Câu hỏi của tôi là làm thế nào để thực hiện phần 2 và 3 với tập lệnh bash bằng cách sử dụng nano (nếu có thể, trong trường hợp không thể thì hãy cho tôi xem với sed)

Ngoài ra tại một số điểm tôi sẽ phải sửa đổi các biến trong tệp Ví dụ:

  1. enable = 0 để kích hoạt = 1
  2. Kiểm tra = "1" để Kiểm tra = "0"
  3. Thêm văn bản trong một dòng. Hàm = to function = "text1", "text2"
  4. Thêm một số văn bản vào một tập tin và lưu nó (với nano)

Tôi biết yêu cầu của nó nhưng tôi cần phải tạo nó cho một người bạn không quản lý máy chủ. Thật không may, tôi không có thời gian để nghiên cứu kịch bản bash từ đầu khi gần đến. Tôi sẽ sử dụng các ví dụ của bạn để viết kịch bản.


Các bạn cảm ơn vì tất cả các câu trả lời tôi đã thực hiện thành công hầu hết các kịch bản bash

Tuy nhiên tôi có một vấn đề khác Giả sử tôi muốn sửa đổi nginx.conf bằng sed Chúng tôi sẽ xử lý worker_ Processes
Bây giờ tôi muốn sử dụng sed để làm như sau 1.Tìm sự xuất hiện đầu tiên của worker_processes conf đó và thay thế văn bản bằngworker_processes 4;

Lưu ý đặc biệt ở đây: Đây chỉ là một ví dụ. Nó có thể xảy ra rằng conf chứa worker_ Processes 1; . Đây là một phần khó khăn. Tôi muốn một lệnh sed tìm trường hợp khớp wHOLE FIRST của từ worker_ Processes , xóa dòng văn bản nơi tìm thấy từ đó và dán vào worker_processes 4;đó rồi lưu tệp. Đây là phương pháp đáng tin cậy nhất tôi mặc dù khi chỉnh sửa tệp (không có nguy cơ phá vỡ bất kỳ conf nào

Một đề nghị cuối cùng tôi đã sử dụng sed -i 's / enable = 0 / enable = 1 / g' /etc/yum.repose.d/remi.repo để thay đổi enable = 0 thành enable = 1 trong phần [remi] trong remi .repo. Tuy nhiên, tôi có cảm giác rằng nó có thể sửa đổi tất cả enable = 0 trong tệp đó, điều này sẽ phá hỏng máy chủ. Ai đó có thể đề xuất một mã tốt hơn.


Một thứ khác tôi không chắc chắn: PI muốn chỉnh sửa một tệp có nội dung này là Kiểm tra văn bản = "0" (Có, nó có dấu ngoặc kép và tôi cần giữ lại) Nó nên được sửa đổi từ Kiểm tra = "0" thành Kiểm tra = " 1 "(có dấu ngoặc kép)

Ngoài ra tôi cần thêm một số văn bản có dấu ngoặc kép ở cuối tệp với sed Giống như "Cảm ơn Quanta" (có trích dẫn) Đối với php, bạn đặt \ với dấu ngoặc kép, không biết cách thực hiện cho bash

Một điều nữa
tôi cần sửa đổi một dòng trong một conf nhưng tôi không nhớ toàn bộ văn bản cần thay thế là gì

Giống như nó lắng nghe = một cái gì đó; , tôi muốn sửa đổi nó để nghe = /tmp/php5-fpm.sock;

Big ngón tay cái lên cho lượng tử

Cảm ơn những người hỗ trợ tuyệt vời

Câu trả lời:


18
sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

Chỉ định tùy chọn chỉnh sửa tại chỗ ( -i) nếu bạn muốn (tạo bản sao lưu có .bakphần mở rộng trước):

sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

Bây giờ tôi muốn sử dụng sed để làm như sau 1.Tìm sự xuất hiện đầu tiên của worker_ Processes trong conf đó và thay thế văn bản bằng worker_ Processes 4;

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf

Một gợi ý cuối cùng tôi đã sử dụng sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repođể thay đổi enabled=0để enabled=1dưới [remi]phần trong remi.repo. Tuy nhiên tôi có cảm giác rằng nó có thể sửa đổi tất cả enabled=0trong tệp đó, điều này sẽ phá hỏng máy chủ. Bất cứ ai cũng đề xuất một mã tốt hơn

Của bạn đây:

sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo

Một thứ khác tôi không chắc chắn: PI muốn chỉnh sửa một tệp có nội dung này là Kiểm tra văn bản = "0" (Có, nó có dấu ngoặc kép và tôi cần giữ lại) Nó nên được sửa đổi từ Kiểm tra = "0" thành Kiểm tra = " 1 "(có dấu ngoặc kép)

sed 's/Testing = "0"/Testing = "1"/g'

Ngoài ra tôi cần thêm một số văn bản có dấu ngoặc kép ở cuối tệp với sed Giống như "Cảm ơn Quanta" (có trích dẫn) Đối với php, bạn đặt \ với dấu ngoặc kép, không biết làm thế nào để bash

sed '$a"Werulz, you are welcome"\'

Một điều nữa tôi cần sửa đổi một dòng trong một conf nhưng tôi không nhớ toàn bộ văn bản cần thay thế là gì

Giống như nó lắng nghe = một cái gì đó; , tôi muốn sửa đổi nó để nghe = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'

'sed' / enable = 1 / a \ ưu tiên = 10 '/etc/yum.repos.d/epel.repo' sẽ chỉnh sửa tệp và lưu các thay đổi
Vui lòng

@Werulz: Chỉ cần kiểm tra với một tệp không quan trọng hoặc sao chép nội dung của epel.repo vào một tệp trong thư mục chính và thử chạy nó ở đó mà không có quyền root / superuser.
Erik I

-ikhông phải là một lựa chọn tiêu chuẩn cho sed. edtuy nhiên, cung cấp một cách tuân thủ tiêu chuẩn để chỉnh sửa các tệp với cú pháp rất giống với sed.
kojiro

Tôi đã cập nhật bài viết đầu tiên của mình để hỏi bạn một đề xuất khác. Cảm ơn rất nhiều về sự hỗ trợ cho đến nay lượng tử.
Werulz

Tôi đã cập nhật bài viết một lần nữa ...... xin lỗi vì đã hỏi rất nhiều câu hỏi. Sẽ chia sẻ kịch bản với bạn trong trường hợp bạn cần
Werulz

12

Giống như ptman đã nói, Augeas có thể cứu bạn khỏi việc sử dụng sed/ awk:

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10

sẽ đặt mức độ ưu tiên của epelkho lưu trữ thành 10. Nếu prioritykhóa đã tồn tại, nó sẽ đặt giá trị của nó, nếu không, nó sẽ thêm một prioritymục sau mục cuối cùng trong phần.

Điều tương tự cũng xảy ra với các giá trị khác mà bạn có thể muốn sửa đổi.

Nếu bạn muốn sửa đổi một số giá trị, bạn thậm chí có thể sử dụng augtoollàm thông dịch viên:

$ cat epel.augtool
#!/usr/bin/augtool -sf

# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
$ chmod +x epel.augtool
$ ./epel.augtool
Saved 1 file(s)

Nếu bạn muốn giữ nó trong tập lệnh bash của mình, bạn có thể chuyển các lệnh thành augtool:

cat <<EOF | augtool
# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
save
EOF

Xem man augtoolđể có thêm lựa chọn.

Có một số avantage để sử dụng Augeas vs. sed/ awk:

  • Augeas có các trình phân tích cú pháp biết về cú pháp tệp (trong trường hợp này là yum.repocú pháp). Bạn sẽ không có nguy cơ phá vỡ cú pháp tệp nếu regex của bạn sai;
  • trình phân tích cú pháp Augeas yum.repo biết về yum.repocác phần, vì vậy bạn biết rằng bạn đang chỉnh sửa phần bên phải;
  • Augeas là bình thường. Nó sẽ chỉ thực hiện thay đổi cho tập tin nếu có thay đổi được thực hiện. Nếu tất cả các giá trị đã được đặt, nó sẽ không sửa đổi tệp;
  • Augeas có nhà cung cấp Puppet, vì vậy bạn có thể dễ dàng tự động hóa việc này trong cơ sở hạ tầng Puppet;
  • nếu tham số chưa tồn tại, Augeas sẽ tạo chúng cho bạn. Nếu phần này chưa tồn tại, Augeas cũng sẽ tạo nó, với cú pháp thích hợp.

Cảm ơn bạn đã trả lời ...... sẽ xem xét chắc chắn .... Bạn có thể đưa ra một ví dụ về cách sử dụng nó với tập lệnh bash của tôi
Werulz

Ok, xem chỉnh sửa của tôi.
ℝaphink

2

Bạn cũng có thể muốn kiểm tra Augeas , công cụ cho các tệp cấu hình sửa đổi theo chương trình. Nó rất mạnh khi kết hợp với Puppet (một hệ thống quản lý cấu hình), nhưng cũng có thể được sử dụng bởi chính nó.


Cái gì vậy lol
Werulz

2
Bạn có thể cải thiện chất lượng của câu trả lời này bằng cách cung cấp một mô tả ngắn gọn về những gì Augeas đang / làm, và cũng bằng cách thêm một hoặc hai ví dụ.
ThatGraemeGuy

Tôi đã thêm một câu hỏi mới
Werulz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.