Вопрос или проблема
Привет, у меня есть переменная, например
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: Пояснение работы скрипта
-
Инициализация массива: При помощи
split()
мы разбиваем строку с IP-адресами на массивipList
. Здесь мы используем пробел в качестве разделителя. -
Создание ассоциативного массива: Для каждого IP-адреса мы добавляем его в ассоциативный массив
ipSet
. Это позволяет нам проверять наличие IP-адресов за константное время. -
Проверка совпадений: Для каждой строки файла
/tmp/newip.txt
мы проверяем, находятся ли оба IP-адреса в массивеipSet
. Если находят, строка печатается.
Заключение
Таким образом, с помощью awk
и правильного подхода к передаче переменных вы сможете эффективно решать задачу проверки соответствия значений из файла заданной переменной master
. Этот метод не только оптимален, но и очень читабелен, что делает его идеальным для использования в скриптах.
Если у вас есть дополнительные вопросы или возникли сложности в процессе, пожалуйста, не стесняйтесь обращаться за помощью.