Вопрос или проблема
У меня есть переменная, такая как
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
Пояснения к коду
-
Переменная
m
: Мы передаем переменнуюmaster
вawk
с помощью опции-v
. -
Секция
BEGIN
:- Мы используем функцию
split()
для разделения строкиm
на массивtmp
по пробелам. - Затем мы проходим по этому массиву и создаем хеш-таблицу
targets
, где ключами являются IP-адреса. Это делает поиск по IP-адресу более эффективным.
- Мы используем функцию
-
Основной код
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
позволяет быстро определять, содержатся ли нужные элементы, что значительно ускоряет обработку больших файлов. Этот подход не только упрощает код, но и делает его более читабельным и производительным.