次の入力を含むファイルがあります。
----------
ID: alternatives_create_editor
Function: alternatives.install
Name: editor
Result: None
Comment: Alternative will be set for editor to /usr/bin/vim.basic with priority 100
Started: 10:45:49.115459
Duration: 0.78 ms
Changes:
----------
ID: hosts_1
Function: host.present
Name: ip6-allnodes
Result: None
Comment: Host ip6-allnodes (ff02::1) already present
Started: 10:45:49.127667
Duration: 1.117 ms
Changes:
----------
ID: sfrsyslog_fix_logrotate
Function: file.managed
Name: /etc/logrotate.d/rsyslog
Result: None
Comment: The file /etc/logrotate.d/rsyslog is set to be changed
Started: 10:45:50.771278
Duration: 12.751 ms
Changes:
----------
私の目標は、すでに存在するComment:includeセクション全体を削除することです。
私は努力したgrep -B 5 -A 4 'already present' FILE1 > FILE2
。
次に、
diff -y FILE1 FILE2 | grep '<' | sed 's/
この出力では以下のような結果が得られます。
ID: alternatives_create_editor
Function: alternatives.install
Name: editor
Result: None
Comment: Alternative will be set for editor to /usr/bin/
Started: 10:45:49.115459
Duration: 0.78 ms
Changes:
----------
ID: sfrsyslog_fix_logrotate
Function: file.managed
Name: /etc/logrotate.d/rsyslog
Result: None
Comment: The file /etc/logrotate.d/rsyslog is set to be
Started: 10:45:50.771278
Duration: 12.751 ms
Changes:
----------
問題は、Comment: section
完全な行が提供されないことです。助けてください。ありがとう
答え1
より簡単な方法は、単一のGNU awkコマンドを使用することです。
awk 'BEGIN{RS=ORS="----------\n"};!/Comment:[^\n]*already present/' file
レコード区切り記号を10のダッシュに設定し、ダッシュがComment:[^\n]*already present
含まれている場合はレコードを抑制します。[^\n]*
「改行ではありません」を意味するため、レコードにalready present
inがChanges:
含まれているがinを含まない場合、そのレコードは表示されませんComment:
。
出力:
----------
ID: alternatives_create_editor
Function: alternatives.install
Name: editor
Result: None
Comment: Alternative will be set for editor to /usr/bin/vim.basic with priority 100
Started: 10:45:49.115459
Duration: 0.78 ms
Changes:
----------
ID: sfrsyslog_fix_logrotate
Function: file.managed
Name: /etc/logrotate.d/rsyslog
Result: None
Comment: The file /etc/logrotate.d/rsyslog is set to be changed
Started: 10:45:50.771278
Duration: 12.751 ms
Changes:
----------
GNU awk がない場合、POSIX はマルチキャラクタレコード区切り文字の動作を定義しないため、上記の内容が機能しない可能性があります。だから私は次のポータブル代替品を残しました。
awk '/Comment:.*already present/{p=1}
/^-{10}$/{
if(p!=1){printf "%s",lines}
p=0
lines=""
}
{lines=lines $0 RS}
' file
答え2
別のawk
解決策:
awk 'BEGIN{RS=ORS="----------\n"} $0 !~ /already present/' file