Разбор неструктурированного текстового файла с помощью grep - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь проанализировать этот файл журнала IDS из MIT, найдено здесь .

Summarized attack: 41.084031
 IDnum    Date       StartTime Duration Destination    Attackname insider? manual? console?success? aDump? oDump iDumpBSM? SysLogs FSListing StealthyNew? Category OS
 41.08403103/29/1999 08:18:35  00:04:07 172.016.112.050ps         out              rem     succ     aDmp   oDmp  iDmp BSM  SysLg   FSLst     Stlth   Old  llU2R 
 41.08403103/29/1999 08:19:37  00:01:56 209.154.098.104ps         out              rem     succ     aDmp   oDmp  iDmp BSM  SysLg   FSLst     Stlth   Old  llU2R 
 41.08403103/29/1999 08:29:27  00:00:43 172.016.112.050ps         out              rem     succ     aDmp   oDmp  iDmp BSM  SysLg   FSLst     Stlth   Old  llU2R 
 41.08403103/29/1999 08:40:14  00:24:26 172.016.112.050ps         out              rem     succ     aDmp   oDmp  iDmp BSM  SysLg   FSLst     Stlth   Old  llU2R 

Я пытаюсь написать команды, которые делают две вещи:

  1. Сначала проанализируйте весь файл и определите количество отдельных «суммарных атак», которые начинаются с 4x.xxxxx. Я сделал это с помощью: grep -o -E "Summarized attack: 4". Он возвращает 80.
  2. Во-вторых, для каждой из «Суммированных атак», обнаруженных с помощью приведенной выше команды, анализирует таблицу и определяет количество IDnum строк и возвращает общее количество строк (т. Е. , атаки) по всем находкам "Суммарная атака". Я мог бы предположить, что это число где-то около 200.

Однако я изо всех сил пытаюсь получить индивидуальное количество идентификаторов, то есть тех, которые находятся в столбце IDnum этого текстового файла.

Поскольку это текстовый файл без технической структуры, как я могу проанализировать этот .txt файл, как если бы он имел табличную структуру, чтобы получить общие записи в столбце IDnum для каждого Summarized attack, который следует за поисковым текстом команды grep выше?

Желаемый результат - это подсчет всех IDnum для Суммированных атак, обнаруженных с помощью указанной выше команды. Я не знаю счетчика, но я могу представить целочисленный вывод, аналогичный возврату 80 для grep -o -E "Summarized attack: 4". Результатом будет <int>, где <int> - количество «атак», как определено строками в столбце IDnum по всем 80 найденным «Суммированным атакам» с помощью указанной выше команды grep.

Если лучше подходит другая команда, кроме grep, это нормально.

Ответы [ 3 ]

2 голосов
/ 21 июня 2020
  1. для подсчета совпадений вы можете использовать grep -c

    grep -cE '(^Summarized.attack:.4[0-9]\.[0-9]+$)'
    
  2. вы можете использовать двоеточие в качестве разделителя для вырезания -d (если вы l oop по результатам, ведущие пробелы не заботятся)

    grep -oE '(^Summarized.attack:.4[0-9]\.[0-9]+$)' | cut -d: -f2
    

пример l oop

   file="path/to/master-listfile-condensed.txt"
   for var in $(grep -oE '(^Summarized.attack:.4[0-9]\.[0-9]+$)' "$file" | cut -d: -f2)
     do
       printf "Summarized attacks: %s: %s\n" $var \
       $(grep -cE "(^.${var}[0-9]+/[0-9]{2}/[0-9]{4})" "$file")
   done

^ начало линия $ конец строки . любой байт (в данном случае одиночный пробел) \. одиночная точка (экранированная) [0-9] одинарный ди git + одно (или несколько) вхождение {4} четыре раза

1 голос
/ 21 июня 2020

Предполагая, что у вас есть более одной «Суммированной атаки:» во входном файле, это может быть то, что вы ищете:

$ cat tst.awk
/^Summarized attack:/ {
    prt()
    atk = ($3 ~ /^4/ ? $3 : 0)
    cnt = 0
}
atk { cnt++ }
END {
    prt()
    print "TOTAL", tot
}

function prt() {
    if ( atk ) {
        cnt -= 2
        print atk, cnt
    }
    tot += cnt
}

.

$ awk -f tst.awk file
0 голосов
/ 21 июня 2020

Для вашей первой части достаточно fgrep -c "Summarized attacks: 4" или fgrep -F "Summarized attacks: 4".

Если я понимаю вашу вторую часть, для каждого из этих блоков вы хотите сложить строки атаки и вывести общую сумму . Вы можете сделать это с помощью

gawk '/^Summarized attack: 4/ { on=1; next} /^ 4[0-9.]*/ { if (on) ++ids; next} /^ IDnum/ {next} /^ */ {next} { on=0} END {print ids;}'< master-listfile-condensed.txt

Первый оператор говорит, ищите (/.../) для каждой строки, которая начинается с (^) «Суммированная атака: 4», и, найдя ее, включите флаг «включено» и go до следующей строки. Второй оператор говорит, что если это запись атаки (т.е. начинается с 4, за которым следует строка [*] цифр), то проверьте флаг; если горит, посчитайте. По сути, мы хотим, чтобы флаг был включен, когда мы находимся в разделе записей об атаке на цель. Следующие два оператора говорят, что для каждой строки, начинающейся с «IDnum» или состоящей из пробелов (иногда вставляются пустые строки), go до следующей строки; это необходимо, чтобы противодействовать следующему оператору, в котором говорится, что если эта строка не соответствует ни одному из предыдущих операторов, выключите флаг «on». Это не позволяет нам считать атаки вне цели. Наконец, END означает, что в конце выведите общую сумму. Я получаю 757, что довольно далеко от вашего диапазона. Но я думаю, что это правильно.

Но гораздо проще, если предположить, что Summarized timestamp всегда повторяется в IDnum по крайней мере до первого значимого di git, было бы использовать

grep -Ec '^ 4' master-listfile-condensed.txt

Это означает, что посчитайте все строки, начинающиеся с пробела-4. В этом случае это дает нам правильный результат.

...