Have inputs.conf files in multiple directories that needs to match and parse each stanza and modify the index= to index=secure. This are files type in inputs.conf and also do run the script to locate the inputs file in this dir (_GWAS_pr_linux_t1/local/inputs.conf) to modify the index
In the file
[WinEventLog://Application]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index =
[WinEventLog://Security]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index =
[WinEventLog://System]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index =
[WinEventLog://ForwardedEvents]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index =
[WinEventLog://Setup]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index =
I tried with the command
sed -i -e 's/.*(?s)((\[WinEventLog:\/\/Application|Security|System|ForwardedEvents|Setup\]).*?)(?:(?:\r\n){2}) /index=window inputs.conf
to change to `index=window` for the `Application`, `Security`, `System`, `ForwardedEvents` and `Setup` entry.
In the file
[monitor:///var/log/cron]
index=
sourcetype=linux_secure
[monitor:///var/log/secure]
index=
sourcetype=linux_secure
[monitor:///var/log/messages]
index=
sourcetype=linux
[monitor:///var/log/spooler]
index =
sourcetype=syslog
[monitor:///var/log/audit/audit.log]
sourcetype=syslog
index=
[monitor:///var/log//maillog]
index=
sourcetype=syslog
I tried command
sed -i -e 's/.*(?s)((\[monitor\:\/\/\/var\/log\/messages|secure\]).*?)(?:(?:\r*\n){2})' /index=secure *linux*/local/inputs.conf
to change the `index=` line to `index=secure` for the `messages` and `secure` log.
i) Work like a charm but the only issues I'm having right now is that, the
script cannot pass through the apps directory and update the index name and
most of the apps directory name is in this form.
_EBPD_pr_linux_w1/local/inputs.conf,
_EBPD_np_linux_w1/local/inputs.conf,
_FBPV_pr_liux_e1/local/inputs.conf,
_FBPV_np_liux_e1/local/inputs.conf,
_FBPV_np_windows_e1/local/inputs.conf,
_FBPV_np_windows_e1/ocal/inputs.conf
ii) Secondly, the most important thing is that, if the app has `np` or `pr` that is how the index name will be updated. For example `index=secure_pr` or `scure_np` or `windows_pr` or `windows_np`.
iii) Another issue is that if there is an existing index name, it does not remove and update to the new index name it just adds to it. For example `index=power` is updated to `index=powersecure` instead of `index=secure`.
iv) I try these but it says "No such file or directory"
perl -00lpe '$_.="secure_np" if m,/(messages|secure|cron|maillog|spooler|audit/audit\.log)\],' *linux*/local/inputs.conf
perl -00lpe '$_.="secure_pr" if m,/(messages|secure|cron|maillog|spooler|audit/audit\.log)],' *linux*/local/inputs.conf
perl -00lpe '$_ .= "windows_pr" if m,/(Application|Security|System|ForwardedEvents|Setup)\],' *window*/local/inputs.conf
perl -00lpe '$_ .= "windows_nr" if m,/(Application|Security|System|ForwardedEvents|Setup)],' *window*/local/inputs.conf
答え1
Perlでは、これははるかに簡単です。実行可能ファイルにはperl
「ショートモード」()という機能があります。ここで、「行」は-00
2つの連続した文字(空白行など)として定義されます。これにより、行の代わりに段落を使用\n
できます。perl
したがって、簡単に次のようにすることができます。
$ perl -00pe 'if(m,^\[WinEventLog://(Application|Security|System|ForwardedEvents|Setup)\],){s/(index\s*=)\s*[^\n]*/$1 window inputs.conf\n\n/}' file1
[WinEventLog://Application]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://Security]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://System]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://ForwardedEvents]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://Setup]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
そして:
$ perl -00pe 'if(m,^\[monitor:///var/log/(messages|secure)\],){s/(index\s*=)\s*[^\n]*/$1 secure\n\n/}' file2
[monitor:///var/log/cron]
sourcetype=linux_secure
index=
[monitor:///var/log/secure]
sourcetype=linux_secure
index= secure
[monitor:///var/log/messages]
sourcetype=linux
index= secure
[monitor:///var/log/spooler]
sourcetype=syslog
index =
[monitor:///var/log/audit/audit.log]
sourcetype=syslog
index=
[monitor:///var/log//maillog]
sourcetype=syslog
index=
ただし、ファイル形式がかなり安定しているように見えるため、次のように単純化できます。
$ perl -00lpe '$_ .= "window inputs.conf" if m,//(Application|Security|System|ForwardedEvents|Setup)\],;' file1
[WinEventLog://Application]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://Security]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://System]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://ForwardedEvents]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
[WinEventLog://Setup]
checkpointInterval = 5
current_only = 0
disabled =0
start_from = oldest
index = window inputs.conf
そして:
$ perl -00lpe '$_.="secure" if m,/(messages|secure)\],' file2
[monitor:///var/log/cron]
sourcetype=linux_secure
index=
[monitor:///var/log/secure]
sourcetype=linux_secure
index=secure
[monitor:///var/log/messages]
sourcetype=linux
index=secure
[monitor:///var/log/spooler]
sourcetype=syslog
index =
[monitor:///var/log/audit/audit.log]
sourcetype=syslog
index=
[monitor:///var/log//maillog]
sourcetype=syslog
index=
答え2
1)スラッシュの多いパターンの場合は、コマンドをs
読みやすくするために別の区切り文字を使用する必要があります(スラッシュをエスケープする必要はありません)。
2)拡張正規表現を使用しているように見えるので、-E
オプションを次のように設定する必要があります。sed
3)パターンの一部に代替文字列を使用する場合は、()
次の文字列で囲む必要があります。(messages|secure)
4)置換部分(/index=window
)はパラメータのように分離せず、スクリプトの一部として含める必要があります。
5) また、s
コマンドに閉じる区切り文字はありません。
6) (?s) and
(?:)` は正規表現ではなく Perl 拡張なので、ここでは使用しないでください。ここでコロンには特別な意味がないので、エスケープする必要はありません。 (ありがとう、@Stéphane Chazelas)
7)sed
行単位で作業するため、\n
行を結合するまで一致しません。
それでは、あなたがしたいことを推測してみましょう。 forとmessages
logで、secure
次の行をindex=
に変更しますindex=secure
。正しいですか?
したがって、あなたの命令はですs/index=/index=secure/
。ただし、特定のグループにのみ適用しようとしています。これには、sed
フィルタに一致する行(または行グループ)にのみコマンドを適用するフィルタオプションがあります。一致させるパターンを指定する方法です。複数行のアドレスを指定するには、カンマで区切られた2つのアドレス(開始と終了)を指定してください。
sed -E '\_\[WinEventLog://(Application|Security|System|ForwardedEvents|Setup)\]_,/index *=/s/index =/index = window/' inputs.conf
2番目のコマンドは、コマンドをさらに簡素化する方法を示しています。s
コマンドから一致するパターンを削除できます。これは、フィルタ範囲の2番目のアドレスである最後のパターンを再利用することを意味するので、繰り返す必要はありません。
交換時にパターンを繰り返す代わりに、次のように書くことができます。&
これにより、完全一致が挿入されます。
sed -i -E '\_\[monitor:///var/log/(messages|secure)\]_,/index=/s//&secure/' *linux*/local/inputs.conf
-i
最後のヒント:結果が満たされるまでこのオプションを使用しないでください。これにより、特にツールの使用経験がない場合は、ファイルを簡単に混乱させることができます。
修正する
index=foo
更新された質問を見ると、すでに交換する必要がある設定がいくつかあるようです。代替項目を変更します。
sed -E '/(Application|Security|System|ForwardedEvents|Setup)]/,/index *=.*/s//index = window/' inputs.conf
そして
sed -i -E '/messages]|secure]/,/index *=.*/s//index=secure/' *linux*/local/inputs.conf
(terdonが提案したパターンをさらに簡素化)