如何将行插入到不存在字符串的特定文件中?

如何将行插入到不存在字符串的特定文件中?

我正在寻求一些有关小脚本的帮助。

我想搜索所有与

/usr/local/directadmin/data/users/*/httpd.conf

对于字符串

centralized.log

如果文件中不存在该字符串,我想在其中插入两行。

目前我有以下脚本:

#!/bin/bash
if ! grep -q centralized.log /usr/local/directadmin/data/users/*/httpd.conf ; then
sed -i '33iCustomLog /var/log/centralized.log combined' /usr/local/directadmin/data/users/*/httpd.conf && sed -i '65iCustomLog /var/log/centralized.log combined' /usr/local/directadmin/data/users/*/httpd.conf
fi

目前,如果在任何文件中都找不到该字符串,则这些行将插入到所有文件中,如果至少在一个文件中找到了该字符串,则不会发生任何事情。我是否可以将这些行添加到所有不存在该字符串的文件中?

答案1

这应该可以解决问题:

#!/bin/bash
for f in /usr/local/directadmin/data/users/*/httpd.conf ; do
  if ! grep -q centralized.log "$f" ; then
    sed -i '33iCustomLog /var/log/centralized.log combined' "$f" ;
    sed -i '65iCustomLog /var/log/centralized.log combined' "$f" ;
  fi ;
done

您可以将两条 sed 线合并起来,但我尽量使其接近您的示例。

答案2

for f in $(grep -l centralized.log /usr/local/directadmin/data/users/*/httpd.conf);
do
  sed -i '33iCustomLog /var/log/centralized.log combined' "$f" && \
  sed -i '65iCustomLog /var/log/centralized.log combined' "$f"
done

这只会遍历 列出的所有文件grep。我认为这样更易读。

编辑:健壮版本

function dofile {
  sed -i '33iCustomLog /var/log/centralized.log combined' "$1" && \
  sed -i '65iCustomLog /var/log/centralized.log combined' "$1"
}
grep -l centralized.log /usr/local/directadmin/data/users/*/httpd.conf | while read -r; do dofile "$REPLY"; done

这个答案以便更好地理解上述内容。

编辑2:希望这能让@alex-stragies满意。保留之前的编辑以供记录。

find /usr/local/directadmin/data/users/ -maxdepth 2 -mindepth 2 -name httpd.conf | \
xargs -L1 -I% sh -c \
"sed -i '33iCustomLog /var/log/centralized.log combined' % && sed -i '65iCustomLog /var/log/centralized.log combined' %"

如果可以用字符来命名用户%,则只需进行相应的更改。

相关内容