sedраствор:
sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\\.+) *HAS NOT BEEN PATCHED.*/\1 - \3/' reportfile
$ sed -E -n -e '/ HAS NOT BEEN PATCHED/ {
s/^(\[[^]]*\]).*([A-Z]:)/\1 - \2/;
s/ HAS NOT BEEN PATCHED.*//p}' nessus.log
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\WINDOWS\SYSTEM32\BCRYPT.DLL
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE
Для каждой строки, соответствующей HAS NOT BEEN PATCHED
, удалите все, что находится между IP-адресом и первой буквой диска ([A-Z]:
). «IP-адрес» определяется как все, что находится внутри квадратных скобок -в начале строки, кроме закрытой квадратной скобки --([^]]*
). Затем удалите все, начиная с HAS NOT BEEN PATCHED
до конца строки, и напечатайте измененную строку.
Я рекомендую использовать символ табуляции \t
в качестве разделителя полей между IP-адресом и путем вместо-
(пробел, тире, пробел ). Это облегчило бы дальнейшую работу.
Регулярные выражения / HAS NOT BEEN.../
включают пробел в начале, чтобы избежать появления висящего символа пробела на выходе.
sed -rn '/NOT BEEN PATCHED/ {s/(^\[.*\]).*C:(.*) HAS.*$/\1 - \2/p} ' filename
Сконцентрируйтесь на записях с надписью «НЕ БЫЛО ИСПРАВЛЕНО», а затем вытащите нужные нам разделы строки (в скобках ), заменив текст на разделы и два (IP-адреса и имя файла)
Я предполагаю, что здесь IP-адрес всегда будет заключен в квадратные скобки. Если это не так, вам нужно будет сопоставить шаблон для IP-адреса.
Решение Awk:
awk '/HAS NOT BEEN PATCHED/ { match($0,/\[.*\]/);ipadd=substr($0,RSTART,RLENGTH);match($0,/C.* HAS/);fle=substr($0,RSTART,RLENGTH-4);print ipadd" - "fle }' filename
Сопоставление шаблона с «НЕ БЫЛО ИСПРАВЛЕНО», а затем извлечение IP-адреса и имени файла с помощью функции сопоставления awk. Получите подраздел строки, связанный с IP-адресом и именем файла, используя возвращенные переменные RSTART и RLENGTH вместе с функцией substr awk. Распечатайте созданные переменные ipadd и fle.