Как извлечь часть IP-адреса из строки в Bash - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь получить 2 последних октета с IP-адреса из разных строк. Некоторые из них будут иметь синтаксис, такой как:

ABCD_192.192.111.123 or
ABCD_EFG_192.111.123.192

как я могу универсальным образом grep только первая часть строки + 2 последних октета от IP? например:

ABCD_111.123 or
ABCD_EFG_123.192

теперь я могу получить только IP

Более того, мне нужно избегать использования временных файлов.

Ответы [ 4 ]

0 голосов
/ 07 июня 2019

Использование Bash для разделения строк:

string="ABCD_192.192.111.123"
IFS=_. read -r prefix octet1 octet2 octet3 octet4 <<< "$string"
printf '%s_%s.%s\n' "$prefix" "$octet3" "$octet4"

Используйте эту двухшаговую версию. Может иметь дело с префиксами с одним или несколькими подчеркиваниями:

string="ABCD_EFG_192.192.111.123"
IFS=. read -r prefix_octet1 octet2 octet3 octet4 <<< "$string"
prefix=${prefix_octet1%_*}
printf '%s_%s.%s\n' "$prefix" "$octet3" "$octet4"
0 голосов
/ 06 июня 2019

Итак, я не уверен насчет ваших данных, но этот

$ echo '*"ABCD_192.192.111.123"
*"ABCD_EFG_192.111.123.192"' \|
grep -o '\*\"\([A-Z]*_\)*\([0-9]*.\)\{2\}'

производит эти выходные данные, и теперь, если вам нужно, вы можете передать sed, чтобы заменить последнюю точку на ".

*"ABCD_192.192.
*"ABCD_EFG_192.111.

sed 's/\.$/\"/'.

Так что вы можете попробовать:

grep -o '\*\"\([A-Z]*_\)*\([0-9]*.\)\{2\}' | sed 's/\.$/\"/'
0 голосов
/ 06 июня 2019
perl -n -e 'while(/^([^0-9]+).*\.([0-9]+\.[0-9]+)/g) {print "$1$2\n"}'
0 голосов
/ 06 июня 2019

Если вы в порядке с awk, не могли бы вы попробовать следующее.

awk '{sub(/[0-9]+\.[0-9]+\./,"")} 1'  Input_file
...