Проверьте, соответствует ли строка - PullRequest
0 голосов
/ 16 мая 2019

Как узнать, сколько раз был зарегистрирован IP-адрес?

Что я думаю, это

  • 192.168.1.254

  • 192.168.1.254

  • 192.168.1.254

  • 192.168.1.254

  • 192.168.1.254

  • 10.40.89.79

К этому

  • 192.168.1.254 (5)
  • 10.40.89.79 (1)

syslog_2019-05-15.txt выглядит так

DROP IN = eth0 OUT = MAC = 38: 2c: 4a: cb: e2: 40: 10: e8: 78: aa: 89: ba: 08: 00 SRC = 92.53.90.242 DST = 90.149.222.18 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 243 ID = 37773 PROTO = TCP SPT = 59155 DPT = 1027 SEQ = 1687374236 ACK = 0 WINDOW = 1024 RES = 0x00 SYN URGP = 0
192.168.1.1 14 мая 00:01:44 ядро ​​предупреждения Kern DROP IN = eth0 OUT = MAC = 38: 2c: 4a: cb: e2: 40: 10: e8: 78: aa: 89: ba: 08: 00 SRC = 185.216.140.6 DST = 90.149.222.18 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 248 ID = 54321 PROTO = TCP SPT = 5

Код:

var fs = require('fs');

fs.readFile('C:/Users/sondr/Desktop/koder/Ip_søk_syslog/syslog_2019-05-15.txt', 'utf8', function(err, data) {
  if (err) throw err; {

    //count
    var count = 0;

    //ReEX
    const reg = /\bSRC=([\.0-9]+)\b/g;

    while ((m = reg.exec(data))) {
      console.log("SRC= " + m[1])
      console.log(++count);
    }

    // DEBUG:
    //console.log(data);
  }
});

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Перебирайте IP-адреса и сохраняйте адрес как ключ к объекту. Если вы перебираете уже существующий IP-адрес внутри объекта tracker, вы можете принять его значение и увеличить его на 1 или по умолчанию 1, если он не существует, так как вы впервые встретитесь с этим IP.

const data = [
  '192.168.1.254', 
  '192.168.1.254',
  '192.168.1.254', 
  '192.168.1.254', 
  '192.168.1.254',
  '10.40.89.79'
]

const tracker = {}

data.forEach(d => {
  const count = d in tracker ? ++tracker[d] : 1
  tracker[d] = count
})

Object.keys(tracker).forEach(k => console.log(`${k} (${tracker[k]})`))

Я нашел регулярное выражение IP-адреса, чтобы запустить match для вашего журнала, а затем запустить те же функции для совпадений.

const reg = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g
const str = `DROP IN=eth0 OUT= MAC=38:2c:4a:cb:e2:40:10:e8:78:aa:89:ba:08:00 SRC=92.53.90.242 DST=90.149.222.18 LEN=40 TOS=0x00 PREC=0x00 TTL=243 ID=37773 PROTO=TCP SPT=59155 DPT=1027 SEQ=1687374236 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0
192.168.1.1 May 14 00:01:44 kern warning kernel DROP IN=eth0 OUT= MAC=38:2c:4a:cb:e2:40:10:e8:78:aa:89:ba:08:00 SRC=185.216.140.6 DST=90.149.222.18 LEN=40 TOS=0x00 PREC=0x00 TTL=248 ID=54321 PROTO=TCP SPT=5`

const data = str.match(reg) || []
const tracker = {}

data.forEach(d => {
  const count = d in tracker ? ++tracker[d] : 1
  tracker[d] = count
})

Object.keys(tracker).forEach(k => console.log(`${k} (${tracker[k]})`))

Возможно, вы сможете найти лучшего регулярного выражения в сети, если это так, дайте мне знать!:-) ОБНОВЛЕНИЕ Я видел Regex @Kunal, который выглядит хорошо.

Более подробно остановимся на этом и постройте функцию, которая принимает регулярное выражение и строку и возвращает вхождения этой строки в регулярное выражение.

const GET_OCCURRENCE = (r = /no args/g, str = 'no args') => {
  const data = str.match(r) || []
  const tracker = {}
  let rtnStr = ''
  
  data.forEach(d => {
    const count = d in tracker ? ++tracker[d] : 1
    tracker[d] = count
  })
  
  return [
    Object.keys(tracker).reduce((rtn, k) => rtn+=` \n${k} (${tracker[k]})`, ''),
    tracker
  ]
 
}

const [IPS, IPS_OBJ] = GET_OCCURRENCE(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g, `DROP IN=eth0 OUT= MAC=38:2c:4a:cb:e2:40:10:e8:78:aa:89:ba:08:00 SRC=92.53.90.242 DST=90.149.222.18 LEN=40 TOS=0x00 PREC=0x00 TTL=243 ID=37773 PROTO=TCP SPT=59155 DPT=1027 SEQ=1687374236 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0
192.168.1.1 May 14 00:01:44 kern warning kernel DROP IN=eth0 OUT= MAC=38:2c:4a:cb:e2:40:10:e8:78:aa:89:ba:08:00 SRC=185.216.140.6 DST=90.149.222.18 LEN=40 TOS=0x00 PREC=0x00 TTL=248 ID=54321 PROTO=TCP SPT=5`)
console.log(IPS, IPS_OBJ)


const [LETTERS, LETTERS_OBJ] = GET_OCCURRENCE(/[azi]/g, 'bhfgdakdfjsihjkzzjkdldfaajjii')
console.log(LETTERS, LETTERS_OBJ)
0 голосов
/ 16 мая 2019

Для простых IP-адресов вы можете использовать это регулярное выражение : (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

Распределение регулярного выражения:

  • \d соответствует цифре 0-9, октет IP может иметь длину от 1 до максимум 3.
  • Период . сбрасывается \.
  • Это повторяется 4 раза.

const pattern = /(\d{1,}\.\d{1,}\.\d{1,}\.\d{1,})/gm;
const str = `192.168.1.1 May 14 00:01:44     kern    warning kernel  DROP IN=eth0 OUT= MAC=38:2c:4a:cb:e2:40:10:e8:78:aa:89:ba:08:00 SRC=185.216.140.6 DST=90.149.222.18 LEN=40 TOS=0x00 PREC=0x00 TTL=248 ID=54321 PROTO=TCP SPT=5`;

let matchMap = new Map();

let match;

while ((match = pattern.exec(str))) {

  // Get the first captured group
  let group = match[1];

  // If the map doesn't contain the group set its count to 1
  if (!matchMap.has(group)) {
    matchMap.set(group, 1);
  }

  // Else increment the count
  else {
    matchMap.set(group, matchMap.get(group) + 1);
  }
}

// Iterate over the match map now
for (const [key, val] of matchMap) {
  console.log(key + ' -> ' + val);
}
0 голосов
/ 16 мая 2019

Если я правильно понял, вы хотите получить все ip-адреса из строки и затем сложить их (дубликаты удалены). Итак, это регулярное выражение:

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

Может проверять ip-адреса. Теперь, используя метод replace, мы можем получить все совпадения с регулярным выражением. Затем мы можем просмотреть их и удалить дубликаты. Посмотрите на этот код:

var str = something;
var IPs = [];
str.replace(
    /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/gi,
    function(match) {
        IPs[IPs.length] = match;
        return match;
    }
);
var stackedIPs = {};
for (i = 0; i < IPs.length; i++) {
    if (stackedIPs[IPs[i]] == null) {
        stackedIPs[IPs[i]] = 1;
    } else {
        stackedIPs[IPs[i]] = stackedIPs[IPs[i]] + 1;
    }
}

StackedIPs даст вам объект, который выглядит следующим образом:

{
    192.168.1.1: 3,
    192.168.1.5: 2,
    ...
}

Где номер, назначенный каждому IP-адресу, - это количество раз, которое он был найден.

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