首页 > 解决方案 > 文本替换 - 字符串和空格

问题描述

我的公司部署了 Splunk 来收集日志并报告系统更改。Splunk 使用两个文件 - inputs.conf 和 server.conf 来跟踪现有主机名并将其报告给 Splunk 控制。

如果主机名更改(在我们的环境中很常见),系统会报告“Broken Host Sanity check”,要求我们登录每个系统并用新主机名替换旧主机名。

对于现场有 1000 个系统,这很困难。

我想自动化这个过程,但我编写的脚本有问题(见下文)。

输入和服务器都对 .conf 文件使用这种格式(.conf 只是一个带有 .conf 扩展名的 txt 文件)。

主机 = 系统名 

下面的脚本当前将读取文本文件,而不是替换“systemname”,而是将更改附加到现有值的末尾。IE。而不是hostname1hostname2它确实Hostname2Hostname1

$InputsOLD = "host = *"
$InputsNEW = "host = $Env:COMPUTERNAME"
Get-Content "C:\Program Files\SplunkUniversalForwarder\etc\system\local\inputs.conf" |
    Foreach-Object {$_ -replace "$InputsOLD","$InputsNEW"} |
    Set-Content "C:\Program Files\SplunkUniversalForwarder\etc\system\local\inputs_1.conf"

$ServerOLD = "serverName = *"
$ServerNew = "serverName = $Env:COMPUTERNAME"
Get-Content "C:\Program Files\SplunkUniversalForwarder\etc\system\local\server.conf" |
    Foreach-Object {$_ -replace "$ServerOLD","$ServerNew"} |
    Set-Content "C:\Program Files\SplunkUniversalForwarder\etc\system\local\server_1.conf"

标签: stringpowershelltextreplace

解决方案


-replace运算符基于正则表达式进行匹配。所以你的匹配表达式:

"host = *"

将在匹配第一个“host =”(不包括主机名)后结束匹配,这就是被替换的内容,之后所有内容都完好无损。要在匹配表达式中包含主机名,请使用以下正则表达式:

"host = .*"

推荐阅读