web-dev-qa-db-fra.com

Capturer uniquement une partie d'une sortie de commande

Si je devais taper une certaine commande, cela me donnerait une longue sortie dans le terminal. Je n'ai besoin que de quelques caractères de cette sortie. Comment, dans un script bash, enregistrer uniquement certains caractères d'une sortie de terminal sous forme de variable?

Par exemple, si mon script est:

#!/bin/bash

ifconfig

Je pourrais enregistrer la sortie entière sous forme de variable à l'aide de

OUTPUT="$(ifconfig)"

Mais je veux seulement que mon adresse IP soit copiée, ce qui est après inet [IP ADDRESS]

Comment pourrais-je m'y prendre?

Edit: adresse IP est juste utilisé ici à titre d'exemple car je ne peux pas mentionner la commande ici pour des raisons de sécurité. Désolé pour toute confusion

5
Lucas Johnston

Utiliser grep

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

Ceci utilise les expressions régulières de style Perl de grep pour sélectionner l'adresse IP qui suit la chaîne inet.

Donc, pour enregistrer cela dans une variable, il suffit de mettre les deux commandes dans la $():

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

Ce qui précède enregistrera les adresses IP de toutes les interfaces actives de votre système. Si vous voulez juste sauvegarder le résultat pour une interface, dites eth0, puis utilisez:

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

Utiliser awk

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

/inet / sélectionne les lignes contenant inet. Sur ces lignes, le troisième champ est imprimé où un séparateur de champ est une combinaison y d'espaces ou de deux points.

Utiliser sed

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

Autre ifconfig

Il existe une autre version de ifconfig qui produit une sortie telle que inet 1.2.3.4 au lieu de inet addr:1.2.3.4. Pour cette version, essayez:

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

Ou:

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

Ou utilisez cette commande sed qui fonctionne avec l'une ou l'autre version de ifconfig:

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

ifconfig pourrait disparaître dans le futur, il est déconseillé dans certaines versions de Linux (peut-être certaines versions d'ubuntu, mais lisez la suite).

ip du paquet iproute2 (devrait être installé par défaut) donne

ip addr list

et peut être abrégé en

ip a

et combiné avec

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

pour filtrer tous les numéros IPv4 identiques avec un slash de masque CIDR suivant. Si la diffusion ne vous dérange pas, elle fonctionne même en mode -E de grep, laissez les derniers crochets en dehors du RegEx.

Si vous voulez généralement couper la sortie cli, et que vous ne voulez pas la laisser passer par une coupe ... (comme dans cet exemple pour obtenir le premier champ)

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

vous pouvez utiliser la manipulation de chaîne bash (comme dans l'exemple suivant):

echo ${SSH_CONNECTION%% *}

Cela devrait vous donner quelques indices par où commencer.

4
Matthias Š

Un moyen simple d'imprimer uniquement l'adresse IP quelle que soit l'interface utilisant Grep; puisque c'était la question

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

addr: est la chaîne de début

Bcast est la chaîne de fin

Tout ce qui se trouve entre ces deux chaînes est imprimé avec. *

1
user437928

Utiliser facter:

facter ipaddress