【问题标题】:Text Replacement - Strings & spaces文本替换 - 字符串和空格
【发布时间】:2019-06-13 00:53:05
【问题描述】:

我的公司已部署 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"

【问题讨论】:

  • -replace 使用正则表达式。您的 $ServerOld 不是正则表达式。使用'servername\s*=.*' 作为-replace 的第一部分

标签: string powershell text replace


【解决方案1】:

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

"host = *"

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

"host = .*"

【讨论】:

【解决方案2】:

我会使用一个使用zero length assertion的正则表达式
匹配关键字后面的任何内容(甚至是文字星号)

此脚本在原地更改,保存时使用相同的文件名。

## Q:\Test\2019\01\18\SO_54259368.ps1

Push-Location "C:\Program Files\SplunkUniversalForwarder\etc\system\local"

$Clie = "inputs.conf"
$Serv = "server.conf"

(Get-Content $Clie) -replace "(?<=^host = ).*$",$Env:COMPUTERNAME | Set-Content $Clie
(Get-Content $Serv) -replace "(?<=^serverName = ).*$",$Env:COMPUTERNAME | Set-Content $Serv

Pop-Location

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多