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
Respuesta1
Esto sería mucho más fácil de hacer en Perl. El perl
ejecutable tiene algo llamado "modo de párrafo" ( -00
) en el que una "línea" está definida por dos \n
caracteres consecutivos (es decir, una línea vacía). Esto permite perl
trabajar con párrafos en lugar de líneas. Entonces simplemente podrías hacer:
$ 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
Y:
$ 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=
Sin embargo, dado que sus archivos parecen tener un formato bastante estable, puede simplificar aún más:
$ 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
Y:
$ 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=
Respuesta2
1) Para un patrón con muchas barras, debe usar un delimitador diferente para el s
comando para hacerlo más legible (entonces no necesita escapar de las barras).
2) Parece que estás usando expresiones regulares extendidas, por lo que debes configurar la -E
opción ensed
3) Si usa cuerdas alternativas para una parte del patrón, debe rodearlas con ()
cuerdas similares.(messages|secure)
4) La parte de reemplazo ( /index=window
) debe ser parte del script en lugar de estar separada como un argumento.
5) Además, el s
comando carece de un delimitador de cierre.
6) (?s) and
(?:)` no son expresiones regulares sino extensiones de Perl, así que no las uses aquí. Y como los dos puntos no tienen un significado especial aquí, no es necesario escapar de ellos (gracias, @Stéphane Chazelas)
7) sed
funciona línea por línea, por lo que \n
nunca coincidirá hasta que unas líneas (lo cual no haces)
Ahora me atrevo a adivinar lo que intentaste hacer: para el registro messages
y secure
, cambia la siguiente index=
línea a index=secure
. ¿Correcto?
Entonces tu comando es s/index=/index=secure/
. Pero sólo deseas aplicarlo a ciertos grupos. Para ello, sed
tiene una opción de filtrado para aplicar comandos solo a líneas (o grupo de líneas) que coincidan con el filtro. Una forma de abordar las líneas es un patrón que debe coincidir. Si desea abordar un rango de líneas, proporcione dos direcciones (dirección inicial y final), separadas por una coma:
sed -E '\_\[WinEventLog://(Application|Security|System|ForwardedEvents|Setup)\]_,/index *=/s/index =/index = window/' inputs.conf
En el segundo comando puedo mostrar cómo simplificar aún más el comando: puede eliminar el patrón coincidente en el s
comando. Esto significa que se vuelve a utilizar el último patrón, que resulta ser la segunda dirección del rango de filtro, por lo que no es necesario repetirlo.
Y en lugar de repetir el patrón en el reemplazo, puedes escribir &
, lo que insertará toda la coincidencia:
sed -i -E '\_\[monitor:///var/log/(messages|secure)\]_,/index=/s//&secure/' *linux*/local/inputs.conf
Un último consejo: no utilices la -i
opción hasta que estés satisfecho con el resultado. Puedes estropear fácilmente tu archivo de esa manera, especialmente si no tienes experiencia con la herramienta.
Actualizar
Con la pregunta actualizada, parece posible que ya exista alguna index=foo
configuración que deba ser reemplazada. Simplemente cambie el reemplazo:
sed -E '/(Application|Security|System|ForwardedEvents|Setup)]/,/index *=.*/s//index = window/' inputs.conf
y
sed -i -E '/messages]|secure]/,/index *=.*/s//index=secure/' *linux*/local/inputs.conf
(mayor simplificación del patrón sugerido por terdon)