我在文件夹中的离散文件中有针对许多不同客户的一百多个防火墙规则。
假设文件名是:
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