将多个文件的数据追加到新文件中,以行分隔

将多个文件的数据追加到新文件中,以行分隔

我在文件夹中的离散文件中有针对许多不同客户的一百多个防火墙规则。

假设文件名是:

1.wawa.com_firewall_rule

2.newa.com_firewall_rule

每个文件都包含客户的 IP。我需要的是从文件中提取每个客户的 IP,并将其附加到以下格式的单个新文件中:

wawa.com
192.168.1.1
newa.com
8.8.8.8
9.9.9.9

现在,我已经能够提取 IP 并将它们保存在新文件中。但我需要将所有内容保存在一个文件中。 (作为报告) - 请参阅下面的我的代码

#!/bin/bash
cd /opt/zeus/zxtm/conf/rules/sba_filter/test
for f in *; do 
#echo $f > hosts.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$f" > "$f.txt"
done

答案1

保留您的工作,可能的解决方案可能是:

#!/bin/bash
cd /home/prova
for f in *; do 
  basename $f '_firewall_rule' >> output.txt
  printf "\n" >> output.txt
  grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$f" | while read -r line ; do
    echo $line >> output.txt
    printf "\n" >> output.txt
  done
done

请参阅评论中的优化贡献

答案2

find your_dir -name "*firewall_rule"
-exec basename {} \;
-exec echo \;
-exec grep -P '(\d{1,3}\.){3}\d{1,3}' {} \;
-exec echo \;
> your_output_file

这将(逐行):

  • 查找所有文件你的目录以“firewall_rule”结尾
  • 输出一个空行
  • 输出所有[0-999].[0-999].[0-999].[0-999] IP地址
  • 输出另一个空行
  • 将输出发送到名为的新文件你的输出文件

答案3

如果您没有太多文件可供命令行处理,则可以使用 awk 在单个命令中完成所有操作:

awk --posix 'FNR==1 {f=FILENAME; sub("_firewall_rule", "", f); print f "\n"} /([0-9]{1,3}\.){3}[0-9]{1,3}/ {print $0 "\n"}' *_firewall_rule

对于我的版本,gawk我需要--posix让大括号在正则表达式中正常工作。

怎么运行的

每当一个新文件启动时,FNR都会为 1,因为它是文件中的第一条记录,因此我们将从内置FILENAME变量中获取文件名,去掉该_firewall_rule部分并打印剩下的空行

然后,任何看起来大致像 IPv4 地址的行,我们都会打印该行并在其上添加一个额外的换行符。

如果您不想要所有 IP 和名称之间的额外空白行,您可以删除\n打印部分,并实际简化模式部分,如下所示:

awk --posix 'FNR==1 {f=FILENAME; sub("_firewall_rule", "", f); print f} /([0-9]{1,3}\.){3}[0-9]{1,3}/ ' *_firewall_rule

相关内容