stringhe - script bash parametri input




Mettere l'indirizzo IP nella variabile bash. Esiste un modo migliore (12)

"Eth3" è facoltativo (utile per più schede di rete)

ipaddress=`ip addr show eth3 | grep 'inet ' | awk '{ print $2}' | cut -d'/' -f1`

Sto cercando di trovare un modo breve e robusto per inserire il mio indirizzo IP in una variabile bash ed ero curioso di sapere se c'era un modo più semplice per farlo. Questo è come lo sto facendo attualmente:

ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`

È possibile ottenere solo awk per eseguire tutte le analisi di ifconfig:

ip=$(ifconfig | gawk '
    /^[a-z]/ {interface = $1}
    interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) {
        print a[1]
        exit
    }
')

Ho lottato anche con questo fino a quando non ho scoperto che c'è un semplice comando per questo scopo

hostname -i

È così semplice!


I seguenti lavori su Mac OS (dove non sono presenti opzioni ip commnand o hostname):

#!/bin/bash

#get interface used for defalt route (usually en0)
IF=$(route get default |grep 'interface' |awk -F: '{print $2}');

#get the IP address for inteface IF
#does ifconfig, greps for interface plus 5 lines, greps for line with 'inet '
IP=$(ifconfig |grep -A5 $IF | grep 'inet ' | cut -d: -f2 |awk '{print $2}');
#get the gateway for the default route
GW=$(route get default | awk '/gateway:/ {print $2}');

Nel mio caso avevo altre interfacce in elenco prima di eth0 . Con questo comando è possibile ottenere l'indirizzo IP4 per qualsiasi interfaccia. Per questo è necessario cambiare eth0 all'interfaccia di cui hai bisogno.

/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'

Nel mio script avevo bisogno solo della parte di rete dell'IP, quindi l'ho fatto in quel modo

local=$(hostname -I | awk '{print $2}' | cut -f1,2,3 -d".")

Dove il taglio -f1,2,3 -d "." può essere letto come "ottenere le prime 3 parti separate da virgole" Per cambiare le interfacce basta cambiare $ 2 al numero dell'interfaccia, per ottenere un'intera rimozione di IP.


Non molto più breve o più semplice, ma funziona per me:

ip=$(ip addr show eth0 | grep -o 'inet [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o [0-9].*)

Penso che la risposta più affidabile sia:

ifconfig  | grep 'inet addr:' | grep -v '127.0.0.1' | awk -F: '{print $2}' | awk '{print $1}' | head -1

E

hostname  -I | awk -F" " '{print $1}'

perché quando non usi la head -1 mostra tutti gli IP ....


la mia versione breve Utile quando hai più interfacce e vuoi solo l'ip principale.

host `hostname` | awk '{print $4}'

sto usando

IFACE='eth0'
IP=$(ip -4 address show $IFACE | grep 'inet' | sed 's/.*inet \([0-9\.]\+\).*/\1/')

Il vantaggio di questo modo è di specificare l'interfaccia (variabile IFACE nell'esempio) nel caso in cui si stiano utilizzando diverse interfacce sul proprio host.

Inoltre, è possibile modificare il comando ip per adattare lo snippet alla propria convenienza (indirizzo IPv6, ecc.).


ip è lo strumento giusto da usare come ifconfig è stato deprecato per qualche tempo. Ecco un comando awk / sed / grep-free che è significativamente più veloce di tutti gli altri postati qui !:

ip=$(ip -f inet -o addr show eth0|cut -d\  -f 7 | cut -d/ -f 1)

(sì, questo è uno spazio fuoriuscito dopo il primo -d )


ifconfig | grep -oP "(?<=inet addr:).*?(?=  Bcast)"

Quando si usa grep per estrarre una porzione di una linea (come fanno altre risposte), le affermazioni di perl look-ahead e look-behind sono i tuoi amici.

La spiegazione rapida è che la prima parentesi (?<=inet addr:) e l'ultima (?= Bcast) contengono pattern che devono essere abbinati, ma i caratteri che corrispondono a quelli non verranno restituiti da grep, solo i caratteri che sono tra i due modelli e abbinare il modello .*? che si trova tra i gruppi di parentesi, vengono restituiti.

Esempio di output di ifconfig:

eth0      Link encap:Ethernet  HWaddr d0:67:e5:3f:b7:d3  
          inet addr:10.0.0.114  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1392392 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1197193 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1294730881 (1.2 GB)  TX bytes:167208753 (167.2 MB)
          Interrupt:18

Questo estrarrà il tuo indirizzo IP dall'output di ifconfig:

ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)"

Per assegnarlo a una variabile, usa questo:

ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)")

Una spiegazione leggermente più approfondita:

Dall'uomo grep:

-o Stampa solo le parti corrispondenti (non vuote) delle linee corrispondenti, con ciascuna di tali parti su una linea di uscita separata.

-P Interpreta il modello come un'espressione regolare Perl. Questo è altamente sperimentale e 'grep -P' potrebbe avvisare di funzionalità non implementate.

Da permonks.org :

(?<=pattern) è un'affermazione positiva del guardare indietro

(?=pattern) è un'affermazione positiva di previsione

-o Dice a grep di restituire solo la parte della linea che corrisponde al modello. I look-behind / ahead non sono considerati da grep come parte del pattern che viene restituito. Il ? dopo .* è importante dal momento che vogliamo che guardi per il prossimo look-ahead dopo che il pattern. * è stato abbinato, e non cercare l'ultima corrispondenza look-ahead. (Questo non è necessario se abbiamo aggiunto una espressione regolare per l'indirizzo IP anziché. *, Ma, leggibilità).





bash