我有一个需要每天增加的配置文件。
例如
report.lookback.days.to.retrieve.data=60
该文件包含多个条目,例如上面包含不同值的条目。我需要打开属性文件搜索此特定条目,并每天将值增加 +1,总共 30 天。
例如
report.lookback.days.to.retrieve.data=61
report.lookback.days.to.retrieve.data=62
report.lookback.days.to.retrieve.data=63
我是脚本编写新手,我不确定什么方法可以完成这项任务。
我应该使用 awk、sed、实现计数器还是方法的组合?
答案1
如果您只想编辑看起来像您发布的内容的文件,请使用类似
perl -i -pe 's/report.lookback.days.to.retrieve.data=\K\d+/$&+1/e' file
解释
启用-i
就地编辑,因此更改将保存到原始文件中,-p
意味着“执行 -e 给出的任何脚本后打印每一行”/
是s///
替换运算符,其工作方式类似于s/source/replacement
。
report.lookback.days.to.retrieve.data=
使用的正则表达式是查找后跟一个或多个数字的字符串( \d+
)。丢弃\K
之前匹配的任何内容,允许$&
(这是一个特殊变量,保存刚刚匹配的内容)单独指向数字。
最后,我们将其替换为$&+1
,匹配的值加一。这(评估s///
运算符内的某些内容)是由s///e
. 末尾的标志激活的s///e
。
答案2
如果您只想每天就地编辑文件(您可能不想这样做),您可以执行以下操作:
$ echo 'report.lookback.days.to.retrieve.data=61' \
| awk -F= '
/report.lookback.days.to.retrieve.data/{
printf("%s=%d\n", $1, $2+1)
}
'
report.lookback.days.to.retrieve.data=62
但这需要保存到临时文件,然后每次都替换原始文件。如前所述devnull
,最好将值替换为$vars
并使用参数调用脚本。
答案3
使用 执行此操作非常简单awk
,但是标准方法是输出到临时文件,然后替换原始文件,使用 Linuxmktemp
您可以执行以下操作:
tempfile=$(mktemp --tmpdir=.)
awk -F= '{
if($1=="report.lookback.days.to.retrieve.data")
print $1"="$2+1
else
print
}' in_file >"$tempfile"
mv "$tempfile" in_file
某些版本awk
具有-i
(就地)选项,这意味着您可以执行以下操作:
awk -iF= '{
if($1=="report.lookback.days.to.retrieve.data")
print $1"="$2+1
else
print
}' in_file
或者如果sponge
实用程序(部分更多实用程序)可用:
awk -F= '{
if($1=="report.lookback.days.to.retrieve.data")
print $1"="$2+1
else
print
}' in_file |
sponge in_file
当然,如果输入文件除了您想要增加的行之外不包含任何其他行(或者如果包含并且您只想删除它们),则awk
可以简化该部分。