Text-Processing
如何將 named.conf 的區域塊重新格式化為單行?
由於我不會在這裡討論的原因,我需要製作一個舊 CentOS 5.10 伺服器的 named.conf 文件的副本,並對副本執行一些文本操作。最終結果應該將每個區域的資訊合併到一個單獨的行中。另外,我需要編寫腳本,以便它可以作為 cron 作業執行。這是我開始的一個例子:
區“。” { 類型提示; 文件“named.root”; }; 區域“somedomain.com”{ 類型大師; 文件“somedomain.net”; 允許轉移{ 11.11.11.11; 22.22.22.22; 共同允許轉移; }; }; 區域“otherdomain.com”{ 類型大師; 文件“otherdomain.com”; 允許轉移{ 33.33.33.33; 44.44.44.44; 55.55.55.55; 共同允許轉移; }; };
這是一個應該出現在編輯文件中的範例:
區“。” {類型提示;文件“named.root”;}; 區域“somedomain.com”{類型主;文件“somedomain.net”;允許轉移 { 11.11.11.11; 22.22.22.22;共同允許轉移;}; }; 區域“otherdomain.com”{類型主;文件“otherdomain.com”;允許轉移 { 33.33.33.33; 44.44.44.44;55.55.55.55;共同允許轉移;}; };
我和我的 CIO 未能成功搜尋將 named.conf 轉換為每區域一行格式的現有腳本。使用 tr 和 sed,我設法 1) 將所有製表符轉換為空格,2) 將多個連續空格壓縮為一個空格。結果更接近我的需要,但我仍然無法刪除不需要的換行符同時保留所需的換行符。這是接近正確的範例輸出:
區“。” { 類型提示; 文件“named.root”; }; 區域“somedomain.com”{ 類型大師; 文件“somedomain.net”; 允許轉移{ 11.11.11.11; 22.22.22.22; 共同允許轉移; }; }; 區域“otherdomain.com”{ 類型大師; 文件“otherdomain.com”; 允許轉移{ 33.33.33.33; 44.44.44.44; 55.55.55.55; 共同允許轉移; }; };
測試了一些建議的 sed、awk 和 tr 表達式來解決換行問題,但沒有一個表達式給出所需的輸出。您有任何建議——甚至是像“用 sed 和 x,y,z 進行實驗”這樣的大方向——將不勝感激。謝謝!
在 Vim(或只是)中打開文件
vi
並輸入::g/^zone/.,/^}/j
瞧,你完成了。
這將
g
在以 開頭的每一行上局部執行zone
,命令:.,/^}/j
這意味著,從目前行 (
.
) 到以右大括號開頭的下一行,將j
所有這些行放在一起。如果您需要編寫腳本,請使用
vi
的腳本形式,ex
:printf '%s\n' 'g/^zone/.,/^}/j' x | ex file.txt
試試這個:
sed -n ' /^zone/,/^};/ H # append current line to hold space in this range /^};/ { # at the end of the range: s/.*// # erase the current line x # exchange pattern space with hold space s/\n// # remove first newline (before "zone") s/[[:space:]]\+/ /g # condense all other whitespace including newlines p # and print this zone record } ' named.conf
結果
zone "." { type hint; file "named.root"; }; zone "somedomain.com" { type master; file "somedomain.net"; allow-transfer { 11.11.11.11; 22.22.22.22; common-allow-transfer; }; }; zone "otherdomain.com" { type master; file "otherdomain.com"; allow-transfer { 33.33.33.33; 44.44.44.44; 55.55.55.55; common-allow-transfer; }; };