Bash脚本打印输出两次

时间:2018-07-04 11:41:49

标签: bash shell unix

我有以下脚本,该脚本在目录中的每个文件上运行命令以匹配特定的模式。然后将匹配的输出打印到.csv。我具有所需的格式,但是我匹配的每个模式都被打印两次。像这样:

Match1
Match2
Match1
Match2

使用uniq并排序到此脚本中无法解决问题,因此我怀疑我的语法已关闭。到目前为止,我还无法通过Google或其他答案找到解决方案。感谢您的任何帮助,谢谢!

#!/usr/bin/env bash
FILES=/Users/User1/Desktop/Folder/"*"
for f in $FILES
do
  echo "Processing $f file..."
  # take action on each file. $f store current file name

    sed -n /"New Filters"/,/"Modified Filters"/p "$f" | grep -v -e 'Bugtraq ID:' 
  -e 'Common Vulnerabilities and Exposures:' -e 'Android' | grep -E '(^|[^0-9]) 
  [0-9]{5}($|[^0-9])'| sed 's/:/,/1' >> NewFile.csv

   echo "Complete. Check NewFile.csv"
 done;

示例输入:预期结果是提取粗体文本

  

过滤器
  新过滤器
  修改的过滤器(逻辑更改)
  修改后的
  过滤器(仅元数据更改)
  删除的过滤器

     

过滤器
  新过滤器:
   2972​​2:HTTP:蜻蜓后门。GoodorGo植入CnC信标1

     

修改的过滤器(逻辑更改):
  我不想要的文字

     

修改的过滤器(仅元数据更改):
  我不想要的文字

3 个答案:

答案 0 :(得分:2)

没有示例输入/输出,我们无法分辨出您的问题所在,所以这不是答案,但这是如何真正使用该脚本执行操作的方法:

awk '
FNR==1 { printf "Processing %s file...\n", FILENAME | "cat>&2" }
/"New Filters"/ { inBlock=1 }
inBlock {
    if ( !/Bugtraq ID:|Common Vulnerabilities and Exposures:|Android/ &&
             /(^|[^0-9])[0-9]{5}($|[^0-9])/ ) {
        sub(/:/,",")
        print
    }
}
/"Modified Filters"/ { inBlock=0 }
' /Users/User1/Desktop/Folder/"*" > "NewFile.csv"
echo "Complete. Check NewFile.csv"

请注意,不需要shell循环。参见why-is-using-a-shell-loop-to-process-text-considered-bad-practice

每当您发现使用多个命令(特别是多个sed和/或greps)和管道来操纵文本时,请考虑仅使用awk。

答案 1 :(得分:1)

您是否两次运行脚本?它会附加>> NewFile.csv而不在开始时截断文件,因此,如果运行两次,则CSV文件最终将重复输出。您可以在开头添加> NewFile.csv,以清空输出文件。

或者,也许您有重复的输入文件。

答案 2 :(得分:0)

如果需要:

  • 提取之间的任何内容
    • 新过滤器 ... 修改后的过滤器
  • 但排除
    • Bugtraq ID:
    • 常见漏洞和披露:
    • Android
  • 也匹配
    • 5位数字,最多1位数字
    • 将第一个:替换为,

然后您可以尝试

perl -lne 'BEGIN{$/=undef} push @r,$& while /(?<=New Filters).*?(?=Modified Filters)/gs; @r2=grep(!/Bugtraq ID:|Common Vulnerabilities and Exposures:|Android/g,@r); /\d{5}[^\n]+\d/g && ($_=$&) && s/:/,/ && print for @r2' file  

此示例输入文件

dified Filters (logic changes)   
Modified  
Filters (metadata changes only)   
Removed Filters  

Filters     
New Filters:  
29722: HTTP: Dragonfly Backdoor.Goodor Go Implant CnC Beacon 1  

Modified Filters (logic changes):   
Text I don't want  

Modified Filters (metadata changes only):   
Text I don't want  


New Filters:  
Bugtraq ID:

Modified Filters (logic changes):   


New Filters:  
Common Vulnerabilities and Exposures:


Modified Filters (logic changes):   


New Filters:  
Android
Modified Filters (logic changes):   


New Filters:  

29723: HTTP: Dragonfly Backdoor.Goodor Go Implant CnC Beacon 1  
Modified Filters (logic changes):   


New Filters:  

29724: HTTP: Dragonfly Backdoor.Goodor Go Implant CnC Beacon 1  

Modified Filters (logic changes):   

输出将是:

29722, HTTP: Dragonfly Backdoor.Goodor Go Implant CnC Beacon 1
29723, HTTP: Dragonfly Backdoor.Goodor Go Implant CnC Beacon 1
29724, HTTP: Dragonfly Backdoor.Goodor Go Implant CnC Beacon 1