Получение только раздела команды производится

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

Например, если мой сценарий:

#!/bin/bash

ifconfig

Я мог сохранить целый вывод как переменное использование

OUTPUT="$(ifconfig)"

Но я только хочу свой скопированный IP-адрес, который является после inet [IP ADDRESS]

Как я пошел бы о выполнении этого?

Править: IP-адрес просто используется здесь в качестве примера, поскольку я не могу упомянуть команду на здесь из соображений безопасности, это - на самом деле 'фраза: [пятизначное число]' в среди другого текста и мне просто нужно то пятизначное число. Извините за любой беспорядок

5
задан 23 July 2016 в 04:57

4 ответа

Используя grep

ifconfig | grep -oP '(?<=inet addr:)[\d.]+'

Это использует регулярные выражения стиля Perl grep для выбора IP-адреса, который следует за строкой inet.

Так, для сохранения этого в переменной просто вставьте обе команды $():

output=$(ifconfig | grep -oP '(?<=inet addr:)[\d.]+')

Вышеупомянутое сохранит IP-адреса для всех активных интерфейсов в Вашей системе. Если Вы просто хотите сохранить вывод для одного интерфейса, сказать eth0, затем использование:

output=$(ifconfig eth0 | grep -oP '(?<=inet addr:)[\d.]+')

Используя awk

ifconfig eth0 | awk -F'[ :]+' '/inet /{print $3}'

/inet / выбирает строки, которые содержат inet. На тех строках печатается третье поле, где разделитель полей является y комбинацией пробелов или двоеточий.

Используя sed

ifconfig eth0 | sed -En 's/.*inet addr:([[:digit:].]+).*/\1/p'

Альтернатива ifconfig

Существует другая версия ifconfig который производит вывод как inet 1.2.3.4 вместо inet addr:1.2.3.4. Для той версии попробуйте:

ifconfig | grep -oP '(?<=inet )[\d.]+'

Или:

ifconfig eth0 | awk '/inet /{print $2}'

Или, используйте эту команду sed, которая работает с любой версией ifconfig:

ifconfig eth0 | sed -En 's/.*inet (addr:)?([[:digit:].]+).*/\2/p'
9
ответ дан 23 November 2019 в 08:42

Используя facter:

facter ipaddress
1
ответ дан 23 November 2019 в 08:42

Простой способ распечатать только IP-адрес независимо от использования интерфейса Grep; так как это было вопросом

ifconfig |grep -o -P '(?<=addr:).*(?= Bcast:)'

addr: начальная цепочка

, Bcast является строкой конца

Что-либо промежуточное, те две строки получают печатное использование.*

1
ответ дан 23 November 2019 в 08:42

ifconfig мог бы исчезнуть в будущем, он удерживается от использования в некотором Linux (возможно, некоторые версии человечности, но продолжайте читать).

IP от iproute2 пакета (должен быть установлен по умолчанию) дает

ip addr list

и может быть сокращен до

ip a

и объединенный с

ip a | grep -o -P '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(?=/)'

для фильтрации на всем IPv4 выглядят подобными числа со следующей наклонной чертой маски CIDR. Если Вы не возражаете о широковещательной передаче, она даже работает в-E режиме grep, просто оставьте последние скобки от RegEx.

Если Вы обычно хотите сократить cli объем производства и не хотеть передавать его по каналу посредством сокращения... (как в этом примере для получения первого поля)

IPS=$(ip a | grep -o -E '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | cut -d\  -f1 - )

Вы могли использовать обработку строк удара (как в следующем примере):

echo ${SSH_CONNECTION%% *}

Это должно дать Вам несколько ключа к разгадке, где и как запустить.

4
ответ дан 23 November 2019 в 08:42

Другие вопросы по тегам:

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