Как извлечь IP часть переменной в bash - PullRequest
1 голос
/ 01 февраля 2020

Я написал скрипт bash, который читает текстовый файл, содержащий URL-адреса, и находит его IP-адрес. Каждая строка этого файла содержит URL. Я хочу создать файл .csv в качестве вывода, который имеет 2 столбца, первый столбец для URL и 2-й столбец для его IP. Вот скрипт:

#!/bin/bash
while IFS= read -r line; do
        ip=$(dig +short $line)
        echo "${line}, ${ip}" >> ipfile.csv
done < domains 

Работает нормально. Проблема в том, что иногда, когда я использую dig +short example.com, вместо того, чтобы возвращать только IP-адрес «example.com», он возвращает что-то вроде: example2.com IP. В этом случае 2-й столбец сохраняет example2.com, а соответствующий IP-адрес перемещается в 1-й столбец следующей строки.

Поэтому мой вопрос: «Как я могу игнорировать первую часть (example2.com) и только извлечь и сохранить часть «IP» во втором столбце «?

Я пытался разбить текст на пробелы и символы новой строки, но, к сожалению, у меня это не получилось.

Ответы [ 2 ]

3 голосов
/ 01 февраля 2020

Вы можете извлечь все, что похоже на адрес IPv4, используя следующее выражение grep:

echo 'hello 11.22.33.44 world' | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"

Объяснение:

  • -E: использовать регулярное выражение
  • -o: распечатать только соответствующую часть
  • [0-9]+\.: сопоставить последовательность цифр, за которой следует точка (экранированная, потому что точка в регулярном выражении имеет особое значение)
    • Это повторяется 4 раза, исключая последний период

В этом решении есть несколько ложных срабатываний (9999.0000.1.2 проходит шаблон), но при условии, что dig не выдает что-то серьезно испорченное, это подойдет.

Также он не поддерживает IPv6, что может быть проблемой для вас, но его тривиально изменить для IPv6, поэтому его оставляют читателю в качестве упражнения:)

0 голосов
/ 02 февраля 2020

Предполагая, dig +shirt возвращает только две формы:

IP
name IP

Мы можем использовать этот скрипт:

#!/usr/bin/env bash

while IFS= read -r line; do
        read name ip <<<"$(dig +short $line)" # get name and IP
        echo "${line}, ${ip:-$name}" >> ipfile.csv # If second column is absent, take the first column
done < domains 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...