我想从
更改/etc/security/limits.conf中的以下行#* soft core 0
到
* soft core unlimited
启用核心转储。
我尝试使用以下sed命令,但它什么也没做:
sed -e "s/^\#\*\([ ]+soft[ ]+core\)[0-9][0-9]*$/\*\1 unlimited/" limits.conf
我哪里做错了?
答案 0 :(得分:4)
sed
存在各种问题:
#
前面的反斜杠,也不需要替换文本中*
前面的反斜杠。他们没有太大的伤害,但他们没有必要。core
和数字之间留出空格。\(…\)
捕获表示法,但这意味着+
没有特殊含义。-i
选项修改文件(在sed
命令正确的情况下没问题。)你应该可以使用(GNU sed
):
sed -r -e "s/^#\*([[:space:]]+soft[[:space:]]+core)[[:space:]]+[0-9][0-9]*[[:space:]]*$/\*\1 unlimited/" limits.conf
[[:space:]]
表示法识别各种空格(包括换行符等);您也可以使用[[:blank:]]
,如果您愿意,只能识别空白和标签。
您也可以使用旧式表示法:
sed -e "s/^#\*\([[:space:]]\{1,\}soft[[:space:]]\{1,\}core\)[[:space:]]\{1,\}[0-9][0-9]*[[:space:]]*$/*\1 unlimited/" limits.conf
如果您想保留core
与数字之间的空白区域,您可以:
sed -e "s/^#\*\([[:space:]]\{1,\}soft[[:space:]]\{1,\}core[[:space:]]\{1,\}\)[0-9][0-9]*[[:space:]]*$/*\1unlimited/" limits.conf
移动捕获的关闭,并且无需在替换字符串中添加空格。
请注意,在确定脚本已准备好修改生产文件时,应该非常小心。我通常创建一个新文件,检查它,然后将旧文件复制到日期/时间戳文件名,并将新文件复制到原始文件上。或者,使用带-i
的后缀,可能再次使用日期/时间。
sed -i .$(date +'%Y%m%d.%H%M%S') -e "s/^#\*\([[:space:]]\{1,\}soft[[:space:]]\{1,\}core[[:space:]]\{1,\}\)[0-9][0-9]*[[:space:]]*$/*\1unlimited/" limits.conf
该格式(基于ISO 8601:2004)的优点是连续文件按日期顺序排序,没有任何特殊的排序选项。如果您愿意,可以将标点符号添加到日期/时间格式中。
无论哪种方式,如果新文件出现问题,您可以获得原件的(副本),以便系统在合理可行的情况下尽快顺利运行。
答案 1 :(得分:1)
此awk
应该:
awk '/^#.*soft.*core/ {sub(/^#/,"");sub(/0$/,"unlimited")}1' file
* soft core unlimited