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

У меня есть следующий текстовый вывод команды (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]+' '[113] ~ /^EpoServerList/ RT{print RT}'
[1112 ] Который не возвращает совпадений

и

./cmdagent -i | awk -v RS='([0-9]+\\.){3}[0-9]+' '[114] ~ /^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.

0
задан Chris Smith 22 January 2019 в 16:52
поделиться

3 ответа

awk -F'[ |]' '/EpoServerList/{print $2"\n"$5}' file
10.0.25.15
10.0.25.20
0
ответ дан Claes Wikner 22 January 2019 в 16:52
поделиться

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

$ perl -lne ' if(/EpoServerList/) { while(/\d+.\d+.\d+.\d+/g) { print "[110]amp;" } } ' 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
ответ дан stack0114106 22 January 2019 в 16:52
поделиться

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

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

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

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

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

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

0
ответ дан bishop 22 January 2019 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: