Как связать операторы awk print?
Хорошо, вот быстрый пример; я изолировал IPV4 хоста в три этапа:
ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 DOWN
wlan0 UP 192.168.0.101/24 fe80::9fcd:45fb:1e0f:a1cc/64
ip -br a | awk '/wlan0/ {print $3}'
192.168.0.101/24
ip -br a | awk '/wlan0/ {print $3}' | awk -F '/' '{print $1}'
192.168.0.101
Вместо вызова второго экземпляра awk
(передача вывода одного в следующий); как это можно сделать за один раз?
Просто хотел сказать: вопрос не в разборе вывода ip
, Мне просто нужен был быстрый пример, чтобы проиллюстрировать вопрос; это было первое, что я придумал. Настоящий вопрос обобщен в названии.
Во всяком случае, для чего это стоит (я должен буду проверить это, но я почти уверен); это то, что я сделал в (недавнем) прошлом:
ip -br a s dev wlan0 | awk -F '[ /]*' '{print $3}'
192.168.0.101
5 ответов
Просто измените определение разделителя полей, чтобы включить как пробелы, так и /
:
$ ip -br a | awk -F'[[:blank:]/]+' '/wlan0/{print $3}'
192.168.0.101
Опция -F'[[:blank:]/]+'
говорит awk использовать любую комбинацию пробелов, табуляций или косых черт в качестве разделителя полей при вводе.
Для этого примера самый простой способ сделать это, вероятно, установить несколько разделителей с помощью регулярного выражения:
ip -br a | awk -F '[\t /]*' '/wlan0/ {print$3}'
Это делает разделитель полей любой строкой /
, пробелы или табуляции, а затем печатает третье поле.
Чтобы выполнить любые две произвольные команды, вам нужно выучить полный язык программирования awk. Я бы рекомендовал против этого - я уверен, что у вас есть дела поважнее.
Вы можете использовать gsub для этого как:
ip -br a | awk '/wlan0/ {gsub(/\/.*/, ""); print $3}'
Хотя другие ответы решают основную проблему, на самом деле они не отвечают на вопрос: "Как мне связать операторы awk print?"
Для такого рода проблем ответ: "Вы не делаете". Вы используете оставшуюся часть языка для манипулирования источником, пока не получите желаемый результат - то, что делают два других ответа. Вы используете только print
вывести окончательный результат.
После того, как вы указали начальный шаблон диапазона, такой как /wlan0/
(или же /^wl/
в моем случае, потому что мой WiFi имеет другое имя), ваше действие, код внутри {}
, будет работать только с входными строками, которые содержат эту строку.
Если у вас есть это, вы можете делать все, что вам нужно, с этой строкой ввода.
ip -br a | \
awk '
/^wl/ {
ip1 = $3
gsub(/\/.*/, "", ip1)
print ip1
}
'
Этот код занимает требуемое поле, помещает его в переменную, редактирует содержимое этой переменной и затем печатает его.
Другой ответ делает то же самое более эффективно, но это иллюстрирует более общий случай, когда могут быть добавлены другие шаги. Вы даже можете сохранить результат для последующего использования с чем-то, найденным в другой строке ввода и т. Д.
Для чего-то, что на самом деле больше похоже на "цепочку печати", в awk есть sprintf()
функция, которая может сделать отформатированную печать своего ввода в переменную для дальнейшей обработки.
Или, если вы печатаете более чем одну вещь в строке, ваш код может использовать несколько printf()
операторы без перевода строки до последнего, чтобы построить выходную строку по частям.
Это несколько в духе ответа Стивена Рауха и ответа Джо, но лучше:
awk '/wlan0/ {split($3, a, "/"); print a[1]}'
Это занимает третье поле ($3
) а также split
с помощью /
в качестве разделителя. Компоненты идут в массив a
и количество подполей возвращается.
(В этом фрагменте я игнорирую возвращаемое значение.) a[1]
это первый /
-предельное подполе третьего поля.
Это легче обобщить, чем другие ответы. Например, если ваш ввод
Однажды в полночь тоскливо, пока я размышлял, слабый и усталый, За многими странными и любопытными томами забытых знаний…wlan0 foo/bar / быстрый / коричневый / лиса / прыжки / лени / собака Пока я кивнул, чуть не вздремнув, внезапно раздался стук, Как будто кто-то мягко постучал - постучал в дверь моей комнаты.
тогда команда
awk '/wlan0/ {if (split($3, a, "/") < 4) print "There is no fourth subfield";
else print "The fourth subfield is", a[4]}'
выведет четвертое подполе третьего поля третьей строки (fox
), после проверки возвращаемого значения из split
проверить, что есть (как минимум) четыре подполя. То есть это как
awk '/wlan0/ {print $3}' | awk -F '/' '{print $4}'
в одном awk
команда, с проверкой ошибок.