Если бы я должен был ввести определенную команду, то она дала бы мне долгий вывод в терминале. Мне только нужны несколько символов этого вывода. Как делают я, в сценарии удара, сохраняю только определенные символы от терминального вывода как переменная?
Например, если мой сценарий:
#!/bin/bash
ifconfig
Я мог сохранить целый вывод как переменное использование
OUTPUT="$(ifconfig)"
Но я только хочу свой скопированный IP-адрес, который является после inet [IP ADDRESS]
Как я пошел бы о выполнении этого?
Править: IP-адрес просто используется здесь в качестве примера, поскольку я не могу упомянуть команду на здесь из соображений безопасности, это - на самом деле 'фраза: [пятизначное число]' в среди другого текста и мне просто нужно то пятизначное число. Извините за любой беспорядок
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'
Используя facter
:
facter ipaddress
Простой способ распечатать только IP-адрес независимо от использования интерфейса Grep; так как это было вопросом
ifconfig |grep -o -P '(?<=addr:).*(?= Bcast:)'
addr: начальная цепочка
, Bcast является строкой конца
Что-либо промежуточное, те две строки получают печатное использование.*
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%% *}
Это должно дать Вам несколько ключа к разгадке, где и как запустить.