awk 多行更改

awk 多行更改

我有以下 datadog 文件

########################################
## System Probe Network Configuration ##
########################################

# network_config:
  ## @param enabled - boolean - optional - default: false
  ## Set to true to enable the Network Module of the System Probe
  #
  # enabled: falseee



##########################################
## Security Agent Runtime Configuration ##
##                                      ##
## Settings to sent logs to Datadog are ##
## fetched from section `logs_config`   ##
##########################################

# runtime_security_config:
  ## @param enabled - boolean - optional - default: false
  ## @env DD_RUNTIME_SECURITY_CONFIG_ENABLED - boolean - optional -
default: false
  ## Set to true to enable Cloud Workload Security (CWS).
  #
  # enabled: falseee

我主要想把以下部分转变成..

########################################
## System Probe Network Configuration ##
########################################

# network_config:
  ## @param enabled - boolean - optional - default: false
  ## Set to true to enable the Network Module of the System Probe
  #
  # enabled: falseee

进入这个

########################################
## System Probe Network Configuration ##
########################################

# network_config:
  ## @param enabled - boolean - optional - default: false
  ## Set to true to enable the Network Module of the System Probe
  #
  # enabled: TRUE

由于文件中有多行启用:错误,我正在使用多行 awk 搜索来进行搜索,但我陷入困境,因为我似乎无法实际对整个文件进行更改...

我创建了一个搜索模式

alias start="# network_config:"
alias end="# enabled: falseee"

然后我尝试使用 awk 剪掉我想要的部分来执行以下操作...

main=$(awk "/$start/, /$end/" system.yaml)

然后我真正想切换的部分......

sub_value=$(awk "/$start/, /$end/" system.yaml | awk '{sub(/enabled: falseee/,"enabled: TRUE"); print}')

所以现在我尝试执行以下操作来在整个文件上切换此功能..但它似乎不起作用....

echo $file | awk -v srch="$main" -v repl="$sub_value" '{ sub(srch,repl,$0); print $0 }'

甚至

echo "$(awk 'awk "{sub(/$(awk "/$start/, /$end/" system.yaml)/, $sub_value); print}"' system.yaml)" > newFile

我想使用 awk 执行此操作的原因是因为我们在工作中使用 tanium,并且我不确定如何为我们所有的服务器配置此文件。所以我只想通过 tanium 运行脚本来更改每个服务器的文件块...我想我只是迷失在 awk 的酱汁中..任何人都可以给我一个线索,告诉我我错过了什么并且没有看到什么?

答案1

如果被允许:

perl -00pe 's/(# network_config.*?enabled: )falseee/$1true/s' file

输出

########################################
## System Probe Network Configuration ##
########################################

# network_config:
  ## @param enabled - boolean - optional - default: false
  ## Set to true to enable the Network Module of the System Probe
  #
  # enabled: true

如果你想编辑到位,添加-i开关:

perl -i -00pe .....

答案2

如果您可以依赖确切的初始文本,并且块之间至少有一个空行:

awk '/# network_config:/,NF==0 { sub ("falseee", "TRUE") } { print }'

sub()除了所需的行之外,它将默默地不执行任何操作。

答案3

sed

sed '/^# network_config:/,/enabled: falseee/s/enabled: falseee/enabled: TRUE/'

解释:

  1. /^# network_config:/,/enabled: falseee/- 将使用 中的寻址功能sed,并将搜索以包含 的行开头# network_config:并以包含 的行结尾的部分enabled: falseee
  2. s/enabled: falseee/enabled: TRUE/- 该部分仅在寻址指定的部分内工作,并更改enabled: falseeeenabled: TRUE.

答案4

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk '/# network_config:/{f=1} f && /# enabled/{sub(/falseee/,"TRUE"); f=0} 1' file
########################################
## System Probe Network Configuration ##
########################################

# network_config:
  ## @param enabled - boolean - optional - default: false
  ## Set to true to enable the Network Module of the System Probe
  #
  # enabled: TRUE



##########################################
## Security Agent Runtime Configuration ##
##                                      ##
## Settings to sent logs to Datadog are ##
## fetched from section `logs_config`   ##
##########################################

# runtime_security_config:
  ## @param enabled - boolean - optional - default: false
  ## @env DD_RUNTIME_SECURITY_CONFIG_ENABLED - boolean - optional -
default: false
  ## Set to true to enable Cloud Workload Security (CWS).
  #
  # enabled: falseee

相关内容