извлечь указанную переменную из файла

Вопрос или проблема

У меня есть переменная, такая как

master=”172.21.154.37 172.21.250.94 172.21.251.93 172.21.250.94″,
и мне нужно проверить, соответствуют ли первый и второй столбцы в файле переменной. Привожу пример, во второй строке 172.21.154.37 можно найти в переменной $master, а 172.21.250.94 также можно найти в $master

172.21.154.40 172.21.254.25

172.21.154.37 172.21.250.94

172.21.250.93 172.21.254.24

awk '$1 /'$master'/ {print $0 }' /tmp/newip.txt, но есть проблема с экранированием

awk ‘$1 /172.21.154.37’ 172.21.250.94 172.21.251.93 ‘172.21.250.94/ {print $0 }’ /tmp/newip.txt

проблема решена, спасибо

Ваш синтаксис для сравнения неверен, независимо от проблемы с экранированием. awk '$1 /172.21.154.37' всегда будет истинным, если первое поле не пустое: вам нужен оператор, как ~, или функция, как index(). В любом случае, сравнивать текст, содержащий специальный символ ., неразумно. index() — это поиск по обычному тексту.

Правильный метод для внедрения переменных оболочки в скрипты awk — передать значение с помощью опции -v.

awk -v master="${master}" '$1 ~ master'

Разделение списка IP-адресов на массив awk и использование оператора in обычно чище, чем поиск по шаблону. Ваше двойное условие будет выглядеть так: ($1 in List) && ($2 in List).

Смотрите как использовать переменные оболочки в скрипте awk, чтобы узнать, как передать значение переменной оболочки в скрипт awk.

Как упоминает @Paul_Pedant в ответе, создание массива awk (targets[] ниже) из вашей переменной оболочки master, а затем использование in для выполнения хэш-lookup каждого IP-адреса является самым эффективным и надежным способом сделать это, например. Используя любой awk:

$ awk -v m="$master" '
    BEGIN {
        split(m, tmp)
        for ( i in tmp ) {
            targets[tmp[i]]
        }
    }
    ($1 in targets) && ($2 in targets)
' file
172.21.154.37 172.21.250.94

.

Ответ или решение

Чтобы проверить, содержатся ли значения из переменной master в первых двух столбцах файла, вы можете использовать команду awk. Давайте рассмотрим шаги для правильной реализации этого решения, включая обработку переменной master и проверку ее значений.

Шаг 1: Определение переменной master

Предположим, у вас есть переменная master, которая содержит список IP-адресов. Например:

master="172.21.154.37 172.21.250.94 172.21.251.93"

Шаг 2: Подготовка скрипта awk

Для проверки первого и второго столбца у нас есть несколько вариантов. Однако, наилучший подход – это создать массив в awk, который будет хранить ваши IP-адреса, и выполнять проверку с использованием оператора in.

Вот пример кода, который демонстрирует это:

awk -v m="$master" '
    BEGIN {
        split(m, tmp)
        for (i in tmp) {
            targets[tmp[i]] = 1  # Используем хеш-таблицу для оптимизации поиска
        }
    }
    ($1 in targets) && ($2 in targets) {
        print $0  # Напечатаем строки, удовлетворяющие условиям
    }
' /tmp/newip.txt

Пояснения к коду

  1. Переменная m: Мы передаем переменную master в awk с помощью опции -v.

  2. Секция BEGIN:

    • Мы используем функцию split() для разделения строки m на массив tmp по пробелам.
    • Затем мы проходим по этому массиву и создаем хеш-таблицу targets, где ключами являются IP-адреса. Это делает поиск по IP-адресу более эффективным.
  3. Основной код awk:

    • В проверочной логике мы используем выражение ($1 in targets) && ($2 in targets), чтобы проверить, содержатся ли оба IP-адреса из первых двух столбцов в нашей хеш-таблице targets.
    • Если оба условия выполняются, мы выводим строку с помощью print $0.

Примеры использования

Если вы примените приведенный выше код к файлу /tmp/newip.txt, содержащему, например:

172.21.154.40 172.21.254.25
172.21.154.37 172.21.250.94
172.21.250.93 172.21.254.24

Вы получите следующий вывод:

172.21.154.37 172.21.250.94

Заключение

Использование awk для проверки значений переменной против столбцов файла — это мощный и эффективный способ выполнения такой задачи в командной строке. Создание хеш-таблицы в awk позволяет быстро определять, содержатся ли нужные элементы, что значительно ускоряет обработку больших файлов. Этот подход не только упрощает код, но и делает его более читабельным и производительным.

Оцените материал
Добавить комментарий

Капча загружается...