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
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.]+')
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.
sed
ifconfig eth0 | sed -En 's/.*inet addr:([[:digit:].]+).*/\1/p'
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'
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.
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. *
Utiliser facter
:
facter ipaddress