Если строка начинается с определенной строки, выведите только IP-адреса, содержащиеся в этой строке, используя awk, по одному на строку - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующий текстовый вывод команды (cmdagent -i), который я анализирую с помощью awk:

Component: McAfee Agent  
AgentMode: 1  
Version: 5.0.6.491  
GUID: f0bcc8de-1aa6-00a4-01b9-00505af06706  
TenantId: N/A  
LogLocation: /var/McAfee/agent/logs  
InstallLocation: /opt/McAfee/agent  
CryptoMode: 0  
DataLocation: /var/McAfee/agent  
EpoServerList: 10.0.25.15|epo1|epo1.example.com|10.0.25.20|epo2|epo2.example.com 
EpoPortList: 443  
EpoServerLastUsed: 10.0.25.15  
LastASCTime: N/A  
LastPolicyUpdateTime: 0  
EpoVersion: 5.3.1  
Component: McAfee Agent

Я бы хотел сопоставить строку, начинающуюся со строки «EpoServerList», и распечатать только IP-адреса, содержащиеся в этой строке, используя только 1 команду awk.

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

Например:

# ./cmdagent -i | awk '/^EpoServerList/' | awk -v RS='([0-9]+\\.){3}[0-9]+' 'RT{print RT}'

Что дает следующий (желаемый) вывод:

10.0.25.15
10.0.25.20

До сих пор я пробовал следующее:

# ./cmdagent -i | awk -v RS='([0-9]+\\.){3}[0-9]+' '$0 ~ /^EpoServerList/ RT{print RT}'

Который не возвращает совпадений

И

./cmdagent -i | awk -v RS='([0-9]+\\.){3}[0-9]+' '$0 ~ /^EpoServerList/; RT{print RT}'

Возвращает номер версии из ненужной строки:

 5.0.6.491
 10.0.25.15
 10.0.25.20

И, похоже, не учитывает "/ ^ EpoServerList /", который я пытаюсь использовать в качестве критерия для исключения строки, содержащей строку версии "5.0.6.491"

Как я могу сопоставить в EpoServerList и при этом использовать разделитель записей с регулярным выражением для сопоставления и печати IP-адресов, используя всего 1 оператор awk?

Это GNU Awk 4.0.2 на RHEL 7 x86_64 с использованием оболочки bash.

Ответы [ 3 ]

0 голосов
/ 18 января 2019
awk -F'[ |]' '/EpoServerList/{print $2"\n"$5}' file
10.0.25.15
10.0.25.20
0 голосов
/ 19 января 2019

Вы также можете попробовать это решение Perl

$ perl -lne ' if(/EpoServerList/) { while(/\d+.\d+.\d+.\d+/g) { print "$&" } } ' chris_smith.txt
10.0.25.15
10.0.25.20

Ввод:

$ cat chris_smith.txt
Component: McAfee Agent
AgentMode: 1
Version: 5.0.6.491
GUID: f0bcc8de-1aa6-00a4-01b9-00505af06706
TenantId: N/A
LogLocation: /var/McAfee/agent/logs
InstallLocation: /opt/McAfee/agent
CryptoMode: 0
DataLocation: /var/McAfee/agent
EpoServerList: 10.0.25.15|epo1|epo1.example.com|10.0.25.20|epo2|epo2.example.com
EpoPortList: 443
EpoServerLastUsed: 10.0.25.15
LastASCTime: N/A
LastPolicyUpdateTime: 0
EpoVersion: 5.3.1
Component: McAfee Agent

$
0 голосов
/ 18 января 2019

Сначала сопоставьте строки, затем переберите поля, соответствующие шаблону IPv4:

awk -F '[|: ]' '/^EpoServerList: / { for (i=1; i<NF; i++) { if (match($i, "([0-9]+\.){3}[0-9]+")) { print $i; } } }'

Использование нескольких разделителей полей позволяет обрабатывать метку как столбец и, следовательно, пропускать ее при сопоставлении для IP-адресов.

Я знаю, что многие здесь скажут, что awk> grep + some-other-tool, но я нахожу, что комбо дает гораздо большую читабельность с первого взгляда:

grep '^EpoServerList: ' | grep -oP '([0-9]+\.){3}[0-9]+'

Обратите внимание, что -o и -p вот расширения GNU, которые я использую из-за вашей зависимости от RHEL.

...