2016-11-24 2 views
-1

В языке сценариев оболочки, я должен извлечь из данного файла только строки, начинающиеся с IP-адресаИзвлечение строки, начинающиеся с IP-адреса из файла

пример FileX содержит:

text 
10.0.0.1 host1 
some other text 10.1.1.2 
172.22.0.25 host1 host1.example.com 
12.8 
123 T 
260.1.1.1 

Ожидаемый результат:

10.0.0.1 host1 
172.22.0.25 host1 host1.example.com 
+0

'Grep "^ [0-9] \ + \."' должны это сделать. –

+0

'grep '^ [0-9]' файл' должен также делать это на основе выбранного образца ... – Sundeep

+0

только что проверено и отредактировано. Прости! –

ответ

2

Предполагая, что октеты действительных IP-адресов варьируются от 0 до 255 (некоторые IP-номера защищены, но я не обращаюсь к ним), этот код должен делать то, что вы хотите:

grep -Eh '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /folder/file | awk -F'.' '$1 <=255 && $2 <= 255 && $3 <= 255 && $4 <= 255' > /tmp/result 

Результат сохраняется в/TMP/результат

+0

С меньшим избыточность: ''^([0-9] {1,3} \.) {3} [0-9] {1,3} '' –

+0

Спасибо, но он дает другие нежелательные результаты, например 999.1.1.1, например не является IP-адресом – W4hf

+0

Вы, люди, правы, я забыл, что у IP-номеров есть особые требования (0-255). Я исправил свой ответ. –

1

С perl

$ perl -lane 'if($F[0] =~ /^(\d+\.){3}\d+$/){ $m=1; foreach (split/\./,$F[0]){$m=0 if $_ > 255} print if $m }' fileX 
10.0.0.1 host1 
172.22.0.25 host1 host1.example.com 
  • Split входной линией на пространствах, сохраненной в @F массиве
  • if($F[0] =~ /^(\d+\.){3}\d+$/) проверка, если первое поле имеет четыре набора цифр, разделенных .
    • $m=1 инициализации матч переменная
    • foreach (split/\./,$F[0]) разделить первое поле на . и итерации над ними
    • $m=0 if $_ > 255 ясно переменная матч, если любое значение больше, чем 255
    • print if $m вход для печати линии, если все значения в первом поле меньше чем или равный 255
Смежные вопросы