Вывод на печать сценария Bash дважды - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующий скрипт, который запускает команды для каждого файла в каталоге, чтобы соответствовать определенному шаблону. Затем он печатает соответствующий вывод в .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;

Пример ввода: ожидаемый результат - выделение текста жирным шрифтом

Фильтры
Новые фильтры
Модифицированные фильтры (логические изменения)
Модифицированный
Фильтры (только изменения метаданных)
Удаленные фильтры

Фильтры
Новые фильтры:
29722: HTTP: черный ход стрекозы. Good Go Go Implant CnC Beacon 1

Модифицированные фильтры (логические изменения):
Текст, который я не хочу

Модифицированные фильтры (только изменения метаданных):
Текст, который я не хочу

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Мы не можем сказать, в чем ваша проблема, без примера ввода / вывода, так что это не ответ на этот вопрос, но вот как действительно сделать то, что вы пытаетесь сделать с этим сценарием:

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"

Обратите внимание, что петли оболочки не требуется. См. почему используется цикл оболочки к тексту процесса, который считается плохой практикой .

Каждый раз, когда вы используете несколько команд (в частности, несколько seds и / или greps) и каналы для манипулирования текстом, попробуйте вместо этого использовать awk.

0 голосов
/ 06 июля 2018

если вам нужно:

  • извлечь что-нибудь между
    • Новый фильтр ... Модифицированные фильтры
  • но исключить
    • 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
0 голосов
/ 04 июля 2018

Вы запускаете скрипт дважды? Он добавляется с >> NewFile.csv без усечения файла в начале, поэтому при повторном запуске CSV-файл приведет к повторному выводу. Вы можете добавить > NewFile.csv в начале, чтобы очистить выходной файл.

Или, возможно, у вас есть дубликаты входных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...