Как Вы извлекаете IP-адреса из файлов с помощью regex в оболочке Linux?

Используйте PDO и подготовленные запросы.

($conn - объект PDO)

$stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
60
задан baduker 14 March 2018 в 11:04
поделиться

6 ответов

Вы могли использовать grep для вытаскивания их.

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file.txt
116
ответ дан brien 24 November 2019 в 17:30
поделиться

Я предложил бы жемчуг. (\d +.\d +.\d +.\d +), должен, вероятно, добиться цели.

РЕДАКТИРОВАНИЕ: Только для создания его больше как полная программа Вы могли сделать что-то как следующее (не протестированный):

#!/usr/bin/perl -w
use strict;

while (<>) {
    if (/(\d+\.\d+\.\d+\.\d+)/) {
        print "$1\n";
    }
}

Это обрабатывает один IP на строку. Если у Вас есть больше чем один дюйм/с на строку, необходимо использовать/g опцию. человек perlretut дает Вам более подробное учебное руководство на регулярных выражениях.

0
ответ дан PolyThinker 24 November 2019 в 17:30
поделиться

Вы могли использовать awk, также. Что-то как...

awk '{i=1; если (NF> 0) делают {если ($i ~/regexp/) печатают $i; я ++;}, в то время как (я < = NF);}' файлу

- возможно, понадобится очистка. просто быстрый и грязный ответ для показа в основном, как сделать это с awk

0
ответ дан Allen Ratcliff 24 November 2019 в 17:30
поделиться

Большинство примеров здесь будет соответствовать на 999.999.999.999, который не является технически допустимым IP-адресом.

следующее будет соответствовать только на допустимых IP-адресах (включая сетевые и широковещательные адреса).

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

Опускают-o, если Вы хотите видеть всю строку, которая соответствовала.

41
ответ дан Sarel Botha 24 November 2019 в 17:30
поделиться

Можно использовать sed. Но если Вы знаете жемчуг, который мог бы быть легче, и более полезным для знания в конечном счете:

perl -n '/(\d+\.\d+\.\d+\.\d+)/ && print "$1\n"' < file
2
ответ дан Avi 24 November 2019 в 17:30
поделиться

Я обычно начинаю с grep, разбираться в regexp.

# [multiple failed attempts here]
grep    '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'                 file  # good?
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file  # good enough

Затем я попытался бы преобразовать его в sed отфильтровывать остальную часть строки. (После того, как, читая этот поток, Вы и я не собираемся делать это больше: мы собираемся использовать grep -o вместо этого)

sed -ne 's/.*\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\).*/\1/p  # FAIL

Именно тогда я обычно раздражаюсь из-за sed для того, чтобы не использовать тот же regexes в качестве никого больше. Таким образом, я перемещаюсь в perl.

$ perl -nle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&'

Польза Perl для знания в любом случае. Если у Вас есть крохотный бит установленного CPAN, можно даже сделать его более надежным по невысокой цене:

$ perl -MRegexp::Common=net -nE '/$RE{net}{IPV4}/ and say $&' file(s)
11
ответ дан JB. 24 November 2019 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: