• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Bash: Zeilenumbruch entfernen

SebCon

Newbie
Hallo,
neues Problem:
ich habe nun einen Textabschnitt in eine Variable gespeichert.
Dort sollen jeweils zwei Zeilen zu einer Zeile "zusammen schmelzen", z.B:

Text1
Text2
Text3
Text4

wird zu

Text1 : Text2
Text3 : Text4

mit sed "s/\n//g" funktioniert es leider nicht, dass ich den zeilenumbruch \n entferne, woran liegt das?

mfg sebcon
 
A

Anonymous

Gast
SebCon schrieb:
mit sed "s/\n//g" funktioniert es leider nicht, dass ich den zeilenumbruch \n entferne, woran liegt das?
sed arbeitet strikt Zeilenorientiert, die Zeilenumbrüche sind dort immer das Zeichen den Zeilenbuffer jetzt zu bearbeiten, und sind aus diesem Grunde mit sed alleine nur äußerst umständlich zu entfernen.
Ich persönlich würde für ein so kleines Problem nicht die ganz großen Programme auspacken, (es ließe sich mit vim, awk, perl ...... sicher gut lösen ), ich würde hier mit einer temporären Datei arbeiten.
Code:
robi@Pingu:/tmp> cat test.txt
Text1 
Text2 
Text3 
Text4 
robi@Pingu:/tmp> sed -e '2~2d' test.txt >temp.test.txt
robi@Pingu:/tmp> sed -e '1~2d;s/^/ /' test.txt | paste -d: temp.test.txt -
Text1 : Text2 
Text3 : Text4 
robi@Pingu:/tmp> rm temp.test.txt

Such auch mal gezielt hier im Forum, dieses Problem hatten wir schon öfter einmal. Meist (oft) wurde vorgeschlage die entsprechenden Zeilenumbrüche gezielt mit tr zu entfernen.

robi
 

regexer

Advanced Hacker
perl ist ein gutes Stichwort
Code:
perl -npe 'if ($.%2) { chomp; $_.=" : " }' <Eingabedatei
Sicher geht es auch irgendwie mit sed, aber dazu bin ich im Moment zu faul ;-)
 

regexer

Advanced Hacker
robi schrieb:
sed arbeitet strikt Zeilenorientiert, die Zeilenumbrüche sind dort immer das Zeichen den Zeilenbuffer jetzt zu bearbeiten, und sind aus diesem Grunde mit sed alleine nur äußerst umständlich zu entfernen.
Nach dem Lesen der man-page muss ich robi teilweise widersprechen: Mit sed geht es sogar richtig einfach.
Code:
sed 'N;s/\n/ : /'

Gut, oder? Aber wie gesagt musste ich auch erst die sed-manpage nochmal lesen...
 
A

Anonymous

Gast
notoxp schrieb:
Mit sed geht es sogar richtig einfach.
Code:
sed 'N;s/\n/ : /'

Na schau an, da hat man sich Jahre lang abgemüht und umständlich das Problem umgangen, und dann geht es doch :shock: und auch noch recht einfach. :wink:
Die Option "N" hatte ich schon einige male dringend benötigt und auch schon hin und wieder getestet, doch anscheinend schien sie nichts brauchbares zu machen, :?: Scheinbar hatte ich überhaupt nicht damit gerechnet das das "\n" dabei erst einmal gar nicht verloren geht, sondern erst mal rausgeschnitten werden muss, damit man die Wirkung von "N" überhaupt im Ausdruck erkennt. Na ja, wie auch immer, dank notoxp könnte ich jetzt wohl einige alte Script ganz schön zusammenkürzen.

robi
 

regexer

Advanced Hacker
robi schrieb:
Die Option "N" hatte ich schon einige male dringend benötigt und auch schon hin und wieder getestet,
Streng genommen ist N keine Option sondern ein Befehl. :wink:

robi schrieb:
doch anscheinend schien sie nichts brauchbares zu machen,
Der Schlüssel zum Verständnis von sed ist die Logik mit Hold und Pattern space. Wenn man das erstmal kapiert hat, ist der Rest eigentlich banal.

Na ja, wie auch immer, dank notoxp könnte ich jetzt wohl einige alte Script ganz schön zusammenkürzen.
Man muss aber auch dazusagen: Nicht alles ist mit sed elegant möglich. Zum einen werden nicht alle aktuellen RegExp unterstützt. Zum anderen reicht die Pattern/Hold-Space Logik nicht für wirklich komplexe Fälle.

Zum Beispiel könnte man die obige Aufgabe erweitern und drei statt zwei Zeilen in den pattern space lesen. Das funktioniert aber das ganze schon nicht mehr so gut, wenn die Anzahl der Zeilen insgesamt nicht ein vielfaches von 3 ist.
Code:
prompt> echo -e '1\n2\n3\n4\n5' | sed 'N;N;s/\n/ : /g'
1 : 2 : 3
4
5
prompt> echo -e '1\n2\n3\n4\n5' | sed 'N;s/\n/ : /;N;s/\n/ : /'
1 : 2 : 3
4 : 5
Und schon ist man wieder bei perl :wink:
 

regexer

Advanced Hacker
Und noch etwas: Die verschiedenen sed-Implementierung auf verschiedenen System reagieren unterschiedlich.
Obiges Beispiel auf Solaris 10:
Code:
prompt> echo -e '1\n2\n3\n4\n5' | sed 'N;N;s/\n/ : /g'
1 : 2 : 3
Naja, zum Glück muss man selten Systemübergreifen sed-scripten...
 

dma67

Hacker
Ist etwas alt, aber geil. ;-)

Trotzdem eine Frage in dem Zusammenhang:

wie soll sed angepasst werden, damit ich
Code:
dma@Phenom940:~> grep -A1 md /proc/mdstat |sed 'N;s/\n/ : /'
md4 : active raid10 sdi1[0] sdj1[1] :  [UU]
md3 : active raid10 sdg1[0] sdh1[1]:  [UU]
md2 : active raid10 sdb1[0] sdd1[1] :  [UU]
md1 : active raid10 sda4[0] sdc4[1]:  [UU]
md0 : active raid10 sda3[0] sdc3[1] : [UU]
bekomme

und nicht:

Code:
dma@Phenom940:~> grep -A1 md /proc/mdstat |sed 'N;s/\n/ : /'
md4 : active raid10 sdi1[0] sdj1[1] :       976760672 blocks super 1.0 2 near-copies [2/2] [UU]
-- : md3 : active raid10 sdg1[0] sdh1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU] : --
md2 : active raid10 sdb1[0] sdd1[1] :       625130336 blocks super 1.0 2 near-copies [2/2] [UU]
-- : md1 : active raid10 sda4[0] sdc4[1]
      576781536 blocks super 1.0 2 near-copies [2/2] [UU] : --
md0 : active raid10 sda3[0] sdc3[1] :       46138592 blocks super 1.0 2 near-copies [2/2] [UU]

DANKE!

EDIT
OK, ich habs
Code:
dma@Phenom940:~> grep -A1 md /proc/mdstat |sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D'|awk '//{print $1,$2,$3,$4,$5,$6,$NF}'
md4 : active raid10 sdi1[0] sdj1[1] [UU]
--      --
md3 : active raid10 sdg1[0] sdh1[1] [UU]
--      --
md2 : active raid10 sdb1[0] sdd1[1] [UU]
--      --
md1 : active raid10 sda4[0] sdc4[1] [UU]
--      --
md0 : active raid10 sda3[0] sdc3[1] [UU]
 
A

Anonymous

Gast
Code:
grep -A1 md /proc/mdstat |sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D'|awk '//{print $1,$2,$3,$4,$5,$6,$NF}'
ist ein furchtbarer Code. Alles was grep und sed kann, das kann awk auch. Also warum alle 3 Befehle in Reihe benutzen, wenn es einer doch auch schafft.
Code:
# awk '/^md_*[0-9]* :/{MDR = $0};$(NF)~/\[[uU_]+\]/{print MDR,$(NF),"\n--\t--"}' /proc/mdstat
md4 : active raid10 sdk1[0] sdl1[1] [UU]
--      --
md3 : active raid10 sdi1[0] sdj1[1] [UU]
--      --
md2 : active raid10 sdb1[0] sdd1[1] [UU]
--      --
md1 : active raid10 sda4[0] sdc4[1] [UU]
--      --
md0 : active raid10 sda3[0] sdc3[1] [UU]

Vorsicht! wenn aus irgend einem Grund ein Raid inaktiv, ist fehlt in der 2. Zeile die Statusanzeige, helfen könnte sowas hier.
Code:
# awk '/^md_*[0-9]* :/{MDR = $0; getline; print MDR,($(NF)~/\[[uU_]+\]/)?$(NF):"","\n--\t--"}' /proc/mdstat
md4 : active raid10 sdk1[0] sdl1[1] [UU]
--      --
md3 : active raid10 sdi1[0] sdj1[1] [UU]
--      --
md2 : active raid10 sdb1[0] sdd1[1] [UU]
--      --
md1 : active raid10 sda4[0] sdc4[1] [UU]
--      --
md0 : active raid10 sda3[0] sdc3[1] [UU]
--      --
md7 : inactive hda1[0] hdc1[1]

robi
 

abgdf

Guru
Wow, ich dachte, notoxp ließe sich mal wieder blicken, bis ich sah: 2007. :)

jengelh hatte mal bei einem ganz ähnlichen Thema gesagt, am besten entferne man den Zeilenumbruch, indem man die Daten nicht als zeilenweises Array betrachte (und auch so speichere), sondern als einen einzigen String, in dem sich ein paar "\n" befänden. Die könne man dann mit einer Regex rauslöschen. Das war ein ziemlich schlauer Ansatz, fand ich.
Da muß man erstmal drauf kommen: Den Inhalt z.B. einer umfangreichen Textdatei in einem einzigen String zu speichern.
robi schrieb:
Alles was grep und sed kann, das kann awk auch. Also warum alle 3 Befehle in Reihe benutzen, wenn es einer doch auch schafft.
Weil awk den meisten von uns Schmerzen verursacht. :D

Gruß
 

dma67

Hacker
robi schrieb:
Code:
grep -A1 md /proc/mdstat |sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D'|awk '//{print $1,$2,$3,$4,$5,$6,$NF}'
ist ein furchtbarer Code.
*Ironie-Modus aus*
Deine Kritik ist mir eine Ehre.

Ich bin beeindruckt, wie du die Zeilen aus dem Ärmel schüttelst. So viel Praxis und Erfahrung in diesem Bereich habe ich natürlich nicht und freue mich immer, etwas dazu lernen zu können.
Deswegen gleich Fragen im Anschluß [wenn es zu diesem Thread nicht mehr gehört, gerne verschieben]

1.Was sind Kriterien für furchtbaren Code?
Wenn man die Länge nimmt, ist meine Zeile sogar etwas kürzer als Deine (in der zweiten Version wenigstens)

Das Problem ist auch, dass Deine awk-Zeile in der Konsole genau das produziert, was meine, in Karamba funktioniert dies aber seltsamerweise _NICHT_! (es wird nichts ausgegeben)
Deswegen ist meine kläglich zusammengeflickte Zeile wenigstens hier überlegen ;-) - furchtbar aber fruchtbar

2. Hier
Code:
md7 : inactive hda1[0] hdc1[1]
ist wohl ein Denkfehler oder stehe ich auf dem Schlauch? kann doch nicht md7 am Anfang stehen?
Selbst wenn bei mir eine Platte ausgefallen ist war die Ausgabe so
Code:
 dma@Phenom940:~> cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md2 : active raid10 sdc3[0](F) sde3[1]
      622920236 blocks super 1.0 2 near-copies [2/1] [_U]
      bitmap: 52/298 pages [208KB], 1024KB chunk
 
md1 : active raid10 sdb4[0] sdd4[1]
      576781556 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/276 pages [8KB], 1024KB chunk
 
md0 : active raid10 sdb3[0] sdd3[1]
      46138560 blocks 2 near-copies [2/2] [UU]
 
unused devices: <none>

3. noch zum awk und besonders zu diesen Zeichen
Code:
--      --

Woher kommen die?

zuerst dachte ich an so etwas
Code:
dma@Phenom940:~> grep -A1 md /proc/mdstat |sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D'|awk 'NR%2'
md4 : active raid10 sdi1[0] sdj1[1]      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
md3 : active raid10 sdg1[0] sdh1[1]      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
md2 : active raid10 sdb1[0] sdd1[1]      625130336 blocks super 1.0 2 near-copies [2/2] [UU]
md1 : active raid10 sda4[0] sdc4[1]      576781536 blocks super 1.0 2 near-copies [2/2] [UU]
md0 : active raid10 sda3[0] sdc3[1]      46138592 blocks super 1.0 2 near-copies [2/2] [UU]

dann doch wusste ich nicht, wie ich die Mitte raus schneide. Da sind die Striche nicht dabei. Warum?

(P.S.: http://www.ostc.de/awk.pdf habe ich noch nicht zu ende gelesen.)
 

abgdf

Guru
dariuszmarek schrieb:
1.Was sind Kriterien für furchtbaren Code?
Code sollte möglichst "einfach" sein, so daß er möglichst leicht wieder verstanden wird, wenn man (oder ein anderer in einem Programmierteam!) ihn später noch einmal liest und/oder wartet. Da gibt es bestimmte Konventionen, bekannt ist z.B. die für "meine" Sprache Python

http://www.python.org/dev/peps/pep-0008/

Für Perl gibt es sogar ein ganzes Buch, "Best Practices" (und sogar ein Modul "Perl::Critic" dazu):

http://www.misc-perl-info.com/perl-best-practices.html

Ein netter Spruch aus dem Buch ist:
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
Schnell sollte der Code natürlich auch noch sein. Wenn Du also eine Pipe vermeiden und stattdessen nur einen Befehl verwenden kannst, dann solltest Du das wahrscheinlich tun.

-------------------------

Zu awk ist der Wiki-Artikel (von robi und Grothesk) wohl recht gut:

http://www.linupedia.org/opensuse/Awk

Für Datenverarbeitung innerhalb von Shell-Skripts ist awk sicher gar nicht schlecht. Obwohl die meisten Leute dafür heute wohl Perl-Einzeiler verwenden.

Gruß
 
A

Anonymous

Gast
dariuszmarek schrieb:
robi schrieb:
Code:
grep -A1 md /proc/mdstat |sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D'|awk '//{print $1,$2,$3,$4,$5,$6,$NF}'
1.Was sind Kriterien für furchtbaren Code?
Wenn man die Länge nimmt, ist meine Zeile sogar etwas kürzer als Deine (in der zweiten Version wenigstens)

Das kann man sicher nicht immer nachwiegen und abmessen, alleine die Länge einer Befehlszeile oder der erste Blick ist nicht ausschlaggebend. Der Code muss mit ein wenig Verständnis und Hintergrund jedenfalls wartbar sein und sollte wenn möglich nicht komplizierter als unbedingt notwendig sein.

Das solch (in meinen Augen) furchtbarer Code massenweise produziert wird liegt bei grep , sed und awk einzig daran, das diese Befehle im allgemeinem Verständnis auf jeweils eine Funktion reduziert werden.

grep sucht Zeilen
sed kann Zeilen ändern
und mit awk kann man problemlos Einzelteile einer Zeile anordnen wie man will.

mehr wissen die meisten von diesen Befehlen nicht.

Code:
echo datei.txt | grep "auto"  | sed 's/auto/Auto/'
dazu brauche ich keine 3 Befehle die einzeln als Prozesse gestartet werden und über das Betriebssystem kommunizieren. das kann sed alleine und Resourcenschonender und schneller.
Code:
sed -n 's/auto/Auto/p' datei.txt
Auch wenn es komplizierter wird, kann sed mit den Adressierungenin 99% der Fälle grep voll und besser ersetzen. Macht natürlich kein Mensch, den grep ist für die Zeilenauswahl zuständig und sed verändert die Zeile und basta ;)

Analog awk und grep sowie awk und sed.
awk wurde unter Anderem desshalb entwickelt weil mit sed nicht alles so einfach zu erledigen geht. Darüber hinaus verfügt awk über viele Dinge die weder sed noch grep besitzen. Variablen, Schleifen, Funktionen ........ und mit denen fast genauso problemlos gearbeitet werden kann, wie in jeder anderen Programmiersprache auch. Wenn ich also sowieso awk verwenden will, um meine Anzeige letztlich sauber zu formatieren, dann brauche ich nicht noch sed davorzusetzen mit kryptischen Befehlsoptionen die niemand ohne Handbuch nachvollziehen kann, sondern kann in awk mit Schleifen, Variablen und Funktionen das schneller nachvollziehbar in awk gleich mit rein programmieren. macht aber niemand, denn awk ;) ist nur und ausschließlich dazu gut {print $1, $3 , "\t",$5} alles andere müssen die anderen Befehle und die Bash so umständlich wie nur irgendwie möglich, machen. ;)

3. noch zum awk und besonders zu diesen Zeichen

-- --
Woher kommen die?

robi schrieb:
{print MDR,$(NF),"\n--\t--"}'
Zeilensprung + "--" + TABULATOR + "--"

Warum die awk Zeile bei dir nicht funktioniert, ich habe sie nur rein optisch nach der Ausgabe deiner Befehlszeile nachgebaut, ob dort wirklich alles genau so ist, wie es bei dir in Karamba benötigt wird, ?????

Die Zeile ist etwas länger als deine, vor allem weil "bessere" Reguläre Ausdrücke darin enthalten sind. Genau das macht diese awk Befehl-Zeile auch unübersichtlich. In deiner Befehlkette kommt dagen die Unübersichtlichkeit vor allem von den sed-Befehlen nicht von den Regulären Ausdrücken.

Ich hoffe mal meine Sichtweise für "furchtbaren Code" damit ansatzweise verstanden ;)

robi
 

dma67

Hacker
D A N K E
ich hoffe, verstanden zu haben... Mann, awk ist genial....

Ich habe in einem tollen Karamba-Thema so etwas gefunden, was natürlich nie im Leben funktionieren kann (z.B. Sprachversion von Linux 'addr' wird zu -> 'Adresse')
Beispiel:

ifconfig liefert
Code:
dma@localhost:~> /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:37:0F:50
          inet addr:10.0.20.53  Bcast:10.0.255.255  Mask:255.255.0.0
          inet6 addr: fe80::a00:27ff:fe37:f50/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:119380 errors:13 dropped:0 overruns:0 frame:0
          TX packets:38308 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23482405 (22.3 Mb)  TX bytes:3354045 (3.1 Mb)
          Interrupt:19 Base address:0xd020

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8774 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8774 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:514112 (502.0 Kb)  TX bytes:514112 (502.0 Kb)

gewünscht wird Private IP (in Superkaramba gefunden)
"Monstrum"
Code:
dma@localhost:~> /sbin/ifconfig | grep 'inet addr' | tail -n 1 | cut -d t -f2 | cut -b -19 | cut -b 6-
:127.0.0.1  Ma

Mit awk
Code:
dma@localhost:~> /sbin/ifconfig |awk '/Bcast/{print $2}' |awk -F : '{print $2}'
10.0.20.53

und es funktioniert IMMER - oder geht es NOCH einfacher?
 
A

Anonymous

Gast
dariuszmarek schrieb:
und es funktioniert IMMER - oder geht es NOCH einfacher?
einfacher oder kürzer? ist nicht die Frage, anders oder schöner oder verständlicher ?
Zumindesdens ist doppelt awk in diesem Fall absolut unnötig ;)

Code:
/sbin/ifconfig eth0 | awk '/Bcast/{split($2,a,":");print a[2]}'
192.168.64.139


robi
 

dma67

Hacker
Code:
/sbin/ifconfig eth0 | awk '/Bcast/{split($2,a,":");print a[2]}'
192.168.64.139
Diesmal muss ich Euch widersprechen, Meister ;-)
Code:
dma@Phenom940:~> /sbin/ifconfig |awk '/Bcast/{print $2}' |awk -F : '{print $2}'
192.168.2.2
172.16.239.1
172.16.107.1

Code:
dma@Phenom940:~> /sbin/ifconfig eth0 | awk '/Bcast/{split($2,a,":");print a[2]}'
192.168.2.2

1. Ich muss wissen, wie meine Netzwerkschnittstellen heißen, und das will ich eben bei Superkaramba nicht müssen.
2.Die Lösung so oder so - ist eher unpraktisch wenn ich mehrere Netzwerkschnittstellen habe - ich weiss nicht weleche IP welcher Schnittstelle zugehört.

Deswegen habe ich mir so etwas ausgedacht (selbst ohne Python funktioniert das wunderbar /dynamisch alle schnittstellen abfragen) - meine Begeisterung für awk wächst, jetzt kann ich wenigstens Strukturen erkennen, obwohl ich noch nicht alle Elemente der Struktur kenne -> dann im Handbuch nachschlagen)

Sag lieber, ob das einfacher geht (sicherlich)
Code:
dma@Phenom940:~> /sbin/ifconfig |awk '/(^eth_*[0-9]*|^tun_*[0-9]*|^vmnet_*[0-9]*)/{NETINTERFACES = $1; getline; IP= $2; print NETINTERFACES, IP}'|awk -F : '/:/{print $1,$2}'|awk '{print $1,":",$3}'
eth0 : 192.168.2.2
tun0 : 192.168.200.78
vmnet1 : 172.16.239.1
vmnet8 : 172.16.107.1

Bis dahin geht alles glatt
Code:
dma@Phenom940:~> /sbin/ifconfig |awk '/(^eth_*[0-9]*|^tun_*[0-9]*|^vmnet_*[0-9]*)/{NETINTERFACES = $1; getline; IP= $2; print NETINTERFACES, IP}'
eth0 addr:192.168.2.2                                                                                                                            
tun0 addr:192.168.200.78                                                                                                                         
vmnet1 addr:172.16.239.1                                                                                                                         
vmnet8 addr:172.16.107.1
Und dann konnte ich das 'addr:' nicht loswerden. Von Hand oder nach Stringlänge will ich es nicht, da je nach Sprachversion des BS 'addr ->Adresse' anders heisst.

Was ich versucht habe war, Spalte $2 nach : zu trennen und dann $1": " und $2 ausgeben zu lassen...(wie gesagt, auf 'addr' will ich nicht referenzieren)

doch 'addr' wollte nicht weg, warum???
Code:
dma@Phenom940:~> /sbin/ifconfig |awk '/(^eth_*[0-9]*|^tun_*[0-9]*|^vmnet_*[0-9]*)/{NETINTERFACES = $1; getline; IP= $2; print NETINTERFACES, IP}' |awk -F : '/:/{print $1 $2}' 
eth0 addr192.168.2.2                                                                                                                                                           
tun0 addr192.168.200.78                                                                                                                                                        
vmnet1 addr172.16.239.1                                                                                                                                                        
vmnet8 addr172.16.107.1

Danke für jeden Hinweis.

EDIT
Ich habs!!!!

Code:
dma@Phenom940:~> /sbin/ifconfig |awk '/(^eth_*[0-9]*|^tun_*[0-9]*|^vmnet_*[0-9]*)/{NETINTERFACES = $1; getline; IP= split($2,a,":"); print NETINTERFACES,":", a[IP]}'
eth0 : 192.168.2.2
vmnet1 : 172.16.239.1
vmnet8 : 172.16.107.1

schic schic mit den Arrays. SO jetzt machen wir Schluß an der Stelle! Das macht Spaß! Nochmals vielen Dank!
 
A

Anonymous

Gast
dann versuche mal das hier
Code:
/sbin/ifconfig -a | awk '/^(eth|sit|vmnet|lo|tun)_*[0-9]*/{printf("%s\t",$1);getline;if($2 ~/[0-9]+\.[0-9]/){split($2,a,":");print a[2];}else print"";}'

dann solltest du auch die offline angezeigt bekommen. (hoffe ich mal ;) )
Aber dort wird es auch mit awk schon wieder unübersichtlich in einer Zeile, das sollte dann schon über mehrere Zeilen geschrieben und sauber formatieren werden, das wiederum wird durch die notwendigen Hochkommas und Zeilenumbrüche aber erschwert, Und somit sind wir am Problem der Interpretersprachen in der bash. ;)

rob

PS : @MOD || @ADMIN
Kann den Thread mal jemand mit der entsprechenden Berechtigung irgendwo splitten : Danke
 

framp

Moderator
Teammitglied
Das awk Script ist zwar noch sehr klein und passt noch in eine Zeile. Ich würde das aber so langsam in ein Script stecken.
Code:
/sbin/ifconfig -a | awk '
   /^(eth|sit|vmnet|lo|tun)_*[0-9]*/   {
                                         printf("%s\t",$1);
                                         getline;
                                         if($2 ~/[0-9]+\.[0-9]/) {
                                               split($2,a,":");
                                               print a[2]; 
                                         }
                                         else 
                                              print"";
                                        }'
liest sich doch wesentlich einfacher :roll: Vor allen Dingen versteht man es auch noch nach 4 Wochen und kann es u.U. erweitern/ändern.
 
Oben