grep ip и порт из файла - PullRequest
       11

grep ip и порт из файла

3 голосов
/ 06 января 2020
cat file.txt


[...]
                <td><script>                            document.write('89.223.92.30')</script></td>
                <td><script>                            document.write('9027')</script></td>
                <td><script>                            document.write('185.204.3.105')</script></td>
                <td><script>                            document.write('1081')</script></td>
                <td><script>                            document.write('91.238.137.108')</script></td>
                <td><script>                            document.write('8975')</script></td>


[...]

Я хочу захватить IP и порт; вот что я делаю:

egrep -oP '([0-9]{1,3}\.){3}[0-9]{1,3} | [0-9]{2,5}' file.txt 

но он не работает (второй шаблон совпадает с первым среди других программ).

он работает только индивидуально.

egrep -oP '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
grep -oP "'[0-9]{2,5}'" file.txt 

-> работает, но не может избавиться от 'в начале и в конце; если я удаляю их в этой модели, он также совпадает с ips, чего я не хочу.

Я также пытался:

sed 's/                    \<td\>\<script\>                            document\.write\(\'//g' file.txt | sed 's/\'\)\<\/script\>\<\/td\>'//g'

идея здесь состоит в том, чтобы обрезать весь мусор до и после ip и порта.

необходим результат:

ip0 port0 (я буду хранить результаты в массиве, который будет использоваться для соединения s sh позже).

ip1 port1

ip2 port2 ...

Ответы [ 3 ]

2 голосов
/ 06 января 2020

Попробуйте этот awk скрипт:

awk -F "(^[^']*')|('[^']*$)" 'NR%2 {v = $2; next;}{print v OFS $2}' input.txt

или

awk -F "(^[^']*')|('[^']*$)" 'NR%2 {v = $2; next;}{print $2 OFS $2}' input.txt

input.txt

        <td><script>                            document.write('89.223.92.30')</script></td>
        <td><script>                            document.write('9027')</script></td>
        <td><script>                            document.write('185.204.3.105')</script></td>
        <td><script>                            document.write('1081')</script></td>
        <td><script>                            document.write('91.238.137.108')</script></td>
        <td><script>                            document.write('8975')</script></td>

вывод:

89.223.92.30 9027
185.204.3.105 1081
91.238.137.108 8975

объяснение:

BEGIN { # pre processig command
    FS = "(^[^']*')|('[^']*$)"; # set field separator to string outside  quote '
    # FS internal variable equivalent to awk argument -F
}
NR % 2 == 1 { # for each odd input line
    v = $2; # save 2nd field in variable v
    next; # skip processing to next line (even input line)
}
{ # for each even input line
    print v OFS $2; # print the saved variable v, right append current 2nd field
}
2 голосов
/ 06 января 2020

Вы можете попробовать что-то вроде этого:

$ cat ipport.txt  | sed 's/.*write('"'"'//g' | sed 's/'"'"').*//g' | while read -r ip && read -r port; do echo "$ip $port"; done
89.223.92.30 9027
185.204.3.105 1081
91.238.137.108 8975

Обратите внимание, однако, что это, как правило, супер подвержен ошибкам. Если ваш порядок строк ip-порта поменяется где-то в последовательности, он все сломается.

Как правило, для разбора HTML файлов вы можете использовать другой язык, более подходящий для этого, например python и BeautifulSoup library

Более простая версия, без одинарных кавычек побег:

cat ipport.txt  | sed "s/.*write('//g" | sed "s/').*//g" | while read -r ip && read -r port; do echo "$ip $port"; done
1 голос
/ 06 января 2020

Допущения:

  • интересует только строки, содержащие document.write (ie, мы не знаем, как выглядят другие строки в файле, но мы можем их игнорировать)
  • каждая пара ip / port находится в последовательных строках 'document.write' в файле
  • каждое значение ip является действительным адресом IPv4
  • нам не нужно беспокоиться о любых других типах данных в строках с document.write и значениями между первым набором одинарных кавычек (')

Наш образец файла данных:

$ cat ip.dat
<td><script>   document.write('89.223.92.30')</script></td>
<td><script>   document.write('9027')</script></td>
<td><script>   document.write('185.204.3.105')</script></td>
<td><script>   document.write('1081')</script></td>
<td><script>   document.write('91.238.137.108')</script></td>
<td><script>   document.write('8975')</script></td>

Мы можем использовать awk для разбора пар ip / port следующим образом:

$ awk -F"'" '
/document.write/ && $2  ~ /[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+/ { ip=$2 ; next }
/document.write/ && $2 !~ /[.]/                               { print ip,$2  }
' ip.dat

Где:

  • -F"'" - использовать одинарные кавычки (') как разделитель нашего поля
  • /document.write/ - нас интересуют только строки со строкой «document.write»; игнорировать все остальные строки
  • $2 ~ /[0-9]+....[0-9]+/ - если второе поле представляет собой 4 набора чисел, разделенных точками ('.'), мы сохраняем $ 2 в качестве текущего ip значения
  • next - как только мы получим значение ip, мы перейдем к следующей строке во входном файле
  • $2 !~ /[.]/ - если второе поле не содержит точку, то мы рассмотрим это номер нашего порта
  • print ip,$2 - вывести значения нашего ip и порта на стандартный вывод

Запуск вышеуказанного сценария awk для нашего файла данных (ip.dat) приводит к:

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