sed ifconfig ipv4 adresse filtern

angelsfall

angelsfall

Routinier
Hallo,

ich wollte gerne mit Hilfe von sed meine IPv4-Adresse auf dem eth0-Device aus der Ausgabe von ifconfig filtern lassen. (Ich weiss, das geht auch mit grep und cut, aber darum gehts hier nicht.)
Bisher mache ich es so:
Code:
ifconfig | sed -ne '/^eth0/,/^$/p' | sed -ne 's/\s\+inet\sAdresse:\([^ ]\+\).*/\1/p'

Ich wundere mich grade, ob das nicht auch mit nur einer sed-Instanz geht?

Ich dachte da an sowas (natürlich funkioniert es nicht :))
Code:
ifconfig | sed -ne "s/^eth0.\+\n\s\+inet\sAdresse:\([^ ]\+\).*/\1/p"

Vielleicht hat jemand eine Idee?
 
Code:
ifconfig  | sed -n '/^eth0/{n;s/.*addr:\(.*\)\sBcast.*/\1/;p;q}'
 
Danke, aber das funktioniert bei mir nicht, es gibt die ganze Zeile aus.
 
Zeig mal Ausgabe von ifconfig bei dir bitte, denn bei mir geht es. :)
 
Ok funktioniert. Mein Ubuntu ist echt Deutsch, da wird dann auch Adresse geschrieben und nicht "addr" :)

Kannst du das bitte noch erläutern?
 
Code:
ifconfig  | sed -n '/^eth0/{n;s/.*[Aa]ddr[^:]*:\(.*\)\s[Bb][^:]*cast.*/\1/;p;q}'


Code:
sudo ifconfig  | sed -n '/^eth0/ # Sucht nach eth0 am Anfang
{  # Alle Aktionen werden nur für die getroffene Zeile (eth0 am Anfang) durchgeführt
n # Nächste Zeile einlesen (Zeile die eth0 trifft überspringen)
s/.*[Aa]ddr[^:]*:\(.*\)\s[Bb][^:]*cast.*/\1/ # Substitution durchführen (sollte nun auch mit Addresse und Broadcast gehen
p # Ausgeben der bearbeiteten Zeile
q # Stoppen (sed beenden, da der Rest sowieso uninteressant ist)
}'
 
Zuletzt bearbeitet:
ich finde das immer sehr kompliziert und für anfänger nicht nachvollziehbar ich finde da das besser *gg

Code:
ifconfig | grep Bcast | awk -F: '{print $2}' | awk '{print $1}'
 
Zuletzt bearbeitet:
@smg: Danke für die Erläuterung. Sowas wie das "n" hatte ich gesucht!
Aber wenn du die Substitution nur auf die eine Zeile anwendest, kann man sich das "q" doch sparen, oder ist das aus Performancegründen? Und wieso ist vor dem "p" noch ein ";"?

Aber danke für deine Hilfe. Ich habe es jetzt so:
Code:
ifconfig | sed -n '/^eth0.*/{n;s/.*inet\sAdresse:\([^ ]\+\).*/\1/p}'

p.s.: Ubuntu schreibt "Adresse" ganz aus. Es wird im Deutschen ja auch nur mit einem "d" geschrieben, nicht wie im Englischen mit zweien. Aber das nur am Rande :)

@Ale-x: Danke auch für deinen Hinweis. Bisher hatte ich es immer so (ganz schlimme Variante, nicht kopieren! ;)):
Code:
ifconfig | grep inet | head -n 1 | cut -d : -f 2 | cut -d ' ' -f 1

Aber hey, es geht ja um den Lerneffekt ;)

{edit}
Man kanns natürlich einfacher machen. Aber ich muss mal wieder kompliziert denken ;)
Code:
ifconfig eth0 | sed -n 's/.*inet Adresse:\([^ ]\+\).*/\1/p'
 
Zuletzt bearbeitet:
Stimmt q kann man sich sparen, der mit dem Semikolon vor derm p ist egal. Ich sehe das p lieber als eigenes Kommando als Zusatz vom s/// Operator.

@Ale-x:
Na ja dein Ausdruck ist ziemlich _inperformant_ de facto, obwohl er natürlich immer noch schnell genug ist (insb. die Pipes / Subshells).
 
Hier ist sed eindeutig die bessere Lösung (1 Prozess).
Die grep cut Variante braucht 4 Prozesse.
Im Übrigen ist es durchaus sinnvoll sich mit sed und Perl respektive reguläre Ausdrücken auseinanderzusetzen.

Dann ist das alles nicht so kryptisch wie es scheint.

Gruß Wolfgang
 

Ähnliche Themen

SSD auf einen (geringfügig) kleineren USB-Stick wiederherstellen

Debian 7.6 kein lokales Netz

mittels if abfrage datei nach variabelnwert durchsuchen

Probleme mit sed: im Text eine Zeile in Großbuchstaben ?

Debian Routing Problem

Zurück
Oben