поиск указанного столбца в файле

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

Привет, у меня есть переменная, например

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 & grep, не могли бы вы помочь? Спасибо

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' всегда вернёт true, если первый столбец не пустой: вам нужен оператор, такой как ~, или функция, такая как index(). В любом случае, сопоставление текста, содержащего специальный символ ., нецелесообразно. index() это обычный текстовый поиск.

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

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

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

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

Чтобы проверить, совпадают ли первые две колонки в файле с заданной переменной master, содержащей список IP-адресов, вы можете использовать утилиту awk. Ваша задача заключается в том, чтобы убедиться, что оба IP-адреса из первой и второй колонки файла присутствуют в переменной master.

Вот пошаговая инструкция по решению этой задачи:

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

Сначала вам нужно определить переменную master в вашем скрипте. Она будет содержать список IP-адресов:

master="172.21.154.37 172.21.250.94 172.21.251.93 172.21.250.94"

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

Теперь мы разберем, как написать скрипт awk, который будет проверять каждую строку в файле и сопоставлять значения в первой (т.е. $1) и второй колонках (т.е. $2) с IP-адресами из переменной master.

Шаг 3: Использование awk с помощью передачи переменных

Правильный способ передачи значений переменных в awk — использовать параметр -v. Сначала создадим массив для хранения IP-адресов из master, а затем проверим соответствие:

#!/bin/bash

master="172.21.154.37 172.21.250.94 172.21.251.93 172.21.250.94"

# Превращаем строку `master` в массив в awk
awk -v master="${master}" '
BEGIN {
    split(master, ipList, " ");  # Разбиваем строку на массив
    for (i in ipList) {
        ipSet[ipList[i]];  # Создаем ассоциативный массив для быстрого поиска
    }
}
{
    if (($1 in ipSet) && ($2 in ipSet)) {
        print $0;  # Выводим строку, если оба IP присутствуют в `master`
    }
}' /tmp/newip.txt

Шаг 4: Пояснение работы скрипта

  1. Инициализация массива: При помощи split() мы разбиваем строку с IP-адресами на массив ipList. Здесь мы используем пробел в качестве разделителя.

  2. Создание ассоциативного массива: Для каждого IP-адреса мы добавляем его в ассоциативный массив ipSet. Это позволяет нам проверять наличие IP-адресов за константное время.

  3. Проверка совпадений: Для каждой строки файла /tmp/newip.txt мы проверяем, находятся ли оба IP-адреса в массиве ipSet. Если находят, строка печатается.

Заключение

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

Если у вас есть дополнительные вопросы или возникли сложности в процессе, пожалуйста, не стесняйтесь обращаться за помощью.

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

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