根据标准错误输出重写配置文件

时间:2014-06-18 13:37:36

标签: python bash sed

我是Linux的新手,并为一堂课安装了Fedora 20。我们使用默认的开箱即用配置安装了Tripwire,我想从安装中获取标准错误来修复配置文件。

收集错误:

tripwire -m i -c tw.cfg 2> errors

清理错误文件以进行处理:

cat errors.txt | grep "/" | cut -d " " -f 3 > fixederrors

这给了我一个很好的干净文件,每行有一个路径,即:

  • / bin / ash
  • /bin/ash.static
  • /root/.Xresources

我想通过将fixederrors中的数据与配置文件进行比较并将匹配的字符串添加到'#'来自动执行此过程。

我尝试了sed,但它注释掉了整个配置文件!

sed 's/^/#/g' fixederrors > commentederrors

或者,我考虑比较配置文件和fixederrors并创建第三个文件。有没有办法获取两个文件,比较它们,并删除重复的数据?

感谢任何帮助。我试过bash和python,但是我不太了解并且在这个兔子洞里走了下来。同样,这是为了我的成长,而不是在生产环境中。

1 个答案:

答案 0 :(得分:0)

我们假设您的输入文件名为fixederrors " clean"

/bin/ash  
/bin/ash.static  
/root/.Xresources  

此输入作为名为config.original

的配置文件
use /bin/ash
use /bin/bash
do stuff with /bin/ash.static and friends
/root/.Xresources
do other stuff... 

将此脚本放在bash

#!/bin/bash
Input_Conf_File="config.original"  # Original configuration file
Output_Conf_File="config.new"      # New configuration file
Input_Error_File="fixederrors"     # File of cleaned error

rm -f $Output_Conf_File            # Let's we create a new file erasing old 
while read -r line ; do            # meanwhile there are line in config file
  AddingChar=""                    # No Char to add # 
  while IFS= read -r line2 ; do    # For each line of Error file, 
    # here you can add specific rules for your match e.g
    # line2=${line2}" "   # if it has always a space after...       
    [[ $line == *$line2* ]] && AddingChar="#"  # If found --> Change prefix "#"
  done < $Input_Error_File
  echo "${AddingChar}${line}" >> $Output_Conf_File # Print in new file
done < $Input_Conf_File
cat  $Output_Conf_File         # You can avoid this it's only to check results 
exit 0

您将拥有此输出

#use /bin/ash
use /bin/bash
#do stuff with /bin/ash.static and friends
#/root/.Xresources
do other stuff...

注意:

  • IFS=删除了阅读
  • 中的尾随空格
  • 明智地使用,例如匹配/bin/ash将捕获/bin/ash.EVERYTHING行;因此,如果配置输入文件中存在一行,则 /bin/ash.dynamic 也会被注释。如果不事先了解配置文件,则无法设置特定规则,但您可以从此处开始。