Bash, Konsole, AWK-Ausgabe
Bash, Konsole, AWK-Ausgabe
Hallo liebe Gemeinde,
ich habe vor mir ein bash script zu schreiben. Für Daten aus meiner Zwischenablage habe ich ein grep-Filter angewendet, und mit awk eine formatierte Ausgabe auf der Konsole hergestellt. Bis hierhin funktioniert es bestens:
Kommando-Aufruf sinngemäss:
xclip Zwischenablage | grep Filter | awk '{print $1}'
Ergebnis auf der Konsole:
23717
23716
23715
Worum es jetzt geht: Diese Ausgabe möchte ich so aufbauen, daß
poweron23717
poweron23716
poweron23715
erscheint, d.h. die obige Ausgabe mit dem Wert "poweron" vorgeschaltet. Wie erzeuge ich das bitte ?
Danke für eure Hilfe.
Gruß root2root
ich habe vor mir ein bash script zu schreiben. Für Daten aus meiner Zwischenablage habe ich ein grep-Filter angewendet, und mit awk eine formatierte Ausgabe auf der Konsole hergestellt. Bis hierhin funktioniert es bestens:
Kommando-Aufruf sinngemäss:
xclip Zwischenablage | grep Filter | awk '{print $1}'
Ergebnis auf der Konsole:
23717
23716
23715
Worum es jetzt geht: Diese Ausgabe möchte ich so aufbauen, daß
poweron23717
poweron23716
poweron23715
erscheint, d.h. die obige Ausgabe mit dem Wert "poweron" vorgeschaltet. Wie erzeuge ich das bitte ?
Danke für eure Hilfe.
Gruß root2root
Re: Bash, Konsole, AWK-Ausgabe
Code: Alles auswählen
xclip Zwischenablage | awk '/Filter/ {print "poweron"$1}'
Re: Bash, Konsole, AWK-Ausgabe
@ ThorstenS.
Danke ThorstenS, hat prima geklappt.
@ all:
Ich suche in dem Zusammenhang nach einer Möglichkeit, die Ausgabe zeilenweise zu zählen und das Ergebnis einer Variablen zu-
zuweisen. Diese soll dann für weitere Operationen Etwa so:
Kommando-Aufruf sinngemäss:
AnzZeilen=0 #initialize
AnzZeilen=$(xclip Zwischenablage | grep Filter | * BashFunktion Zeilenzählen * )
Im u.g. Beispiel wäre der Wert Anzzeilen=3.
Dank euch.
Gruß root2root
Danke ThorstenS, hat prima geklappt.
@ all:
Ich suche in dem Zusammenhang nach einer Möglichkeit, die Ausgabe zeilenweise zu zählen und das Ergebnis einer Variablen zu-
zuweisen. Diese soll dann für weitere Operationen Etwa so:
Kommando-Aufruf sinngemäss:
AnzZeilen=0 #initialize
AnzZeilen=$(xclip Zwischenablage | grep Filter | * BashFunktion Zeilenzählen * )
Im u.g. Beispiel wäre der Wert Anzzeilen=3.
Dank euch.
Gruß root2root
Re: Bash, Konsole, AWK-Ausgabe
root2root hat geschrieben:AnzZeilen=$(xclip Zwischenablage | grep Filter | * BashFunktion Zeilenzählen * )
Code: Alles auswählen
blahblah | wc -l
Re: Bash, Konsole, AWK-Ausgabe
grep -c zählt auch, damit sparst du dir den wc Aurfuf.
Re: Bash, Konsole, AWK-Ausgabe
Hallo zusammen,
danke für Eure Tipps. Kann grep oder auch ein anderes bash-programm zeilen löschen ? Ich mochte über ein bash-script anhand einer liste ( datei mit zahlen ), z.B. "liste.tmp" mit Inhalt:
2
5
8
24
33
42
genau diese 7 bestimmten Zeilen aus einer weiteren datei "powerons.tmp" mit ca. 50 einträgen löschen. Sinngemäss Lösche mir aus "powerons.tmp" die zeilen welche in "liste.tmp" aufgeführt sind. Alternativ wäre es natürlich auch möglich, eine weitere datei ohne o.g. zeilen anzulegen, also mit dem Rest aus der "powerons.tmp". Ersteres finde ich aber eleganter.
Dank euch
Gruß root2root
danke für Eure Tipps. Kann grep oder auch ein anderes bash-programm zeilen löschen ? Ich mochte über ein bash-script anhand einer liste ( datei mit zahlen ), z.B. "liste.tmp" mit Inhalt:
2
5
8
24
33
42
genau diese 7 bestimmten Zeilen aus einer weiteren datei "powerons.tmp" mit ca. 50 einträgen löschen. Sinngemäss Lösche mir aus "powerons.tmp" die zeilen welche in "liste.tmp" aufgeführt sind. Alternativ wäre es natürlich auch möglich, eine weitere datei ohne o.g. zeilen anzulegen, also mit dem Rest aus der "powerons.tmp". Ersteres finde ich aber eleganter.
Dank euch
Gruß root2root
Re: Bash, Konsole, AWK-Ausgabe
Könnte man vielleicht in etwa so lösen?
Code: Alles auswählen
duff@work:/tmp$ cat test01
10
11
12
13
14
15
16
17
18
duff@work:/tmp$ cat test02
12
14
16
duff@work:/tmp$ cat delete.bash
#!/bin/bash
for i in $(cat test02)
do
for j in $(cat test01)
do
if [ "$i" = "$j" ]; then
echo "i: $i - j:$j"
sed -i -e "/$j/d" test01
fi
done
done
duff@work:/tmp$ ./delete.bash
i: 12 - j:12
i: 14 - j:14
i: 16 - j:16
duff@work:/tmp$ cat test01
10
11
13
15
17
18
duff@work:/tmp$
Oh, yeah!
Re: Bash, Konsole, AWK-Ausgabe
Dafür ist grep da:
Code: Alles auswählen
$ cat test1
10
11
12
13
14
15
16
17
18
$ cat test2
12
14
16
$ grep -v -f test2 test1
10
11
13
15
17
18
Re: Bash, Konsole, AWK-Ausgabe
Ok. So ist es einfacher und bestimmt auch schneller.
Aber so wird die Datei nicht geändert, sprich, die Zeilen werden nicht aus Datei test01 gelöscht.
Aber so wird die Datei nicht geändert, sprich, die Zeilen werden nicht aus Datei test01 gelöscht.
Oh, yeah!
Re: Bash, Konsole, AWK-Ausgabe
besser?grep -v -f test2 test1 > test1_tmp && mv test1_tmp test1
Re: Bash, Konsole, AWK-Ausgabe
Ich find's gut so. Ist ja auch ein Einzeiler
...muss ich der Threadersteller mal zu Wort melden.
...muss ich der Threadersteller mal zu Wort melden.
Oh, yeah!
Re: Bash, Konsole, AWK-Ausgabe
Yep,
sieht ganz gut aus. Zu dumm daß in meiner poweron.tmp nur ca. 50 mal poweron:XXXXX steht. "XXXXX" ist eine 5stellige Nummer. Es sind also ca 50 verschiedene Zeilen, aber ohne führende Zahlen wie in liste.tmp. Ihr habt ja Dateien gleichen Inhalts verglichen, alle mit Zeilenzahlen.
Bei mir sieht das so aus
# cat liste.tmp
2
5
8
24
33
42
# cat powerons.tmp
poweron:12345
poweron:25879
poweron:25698
poweron:25610
...
...
...
poweron:45697
poweron:45645
Entschuldigt, daß ich mich nicht ganz glasklar ausgedrückt habe (es war irgendwie schon sehr früh am morgen ).Es soll also die zeile 2,5,8,24,33,48 aus powerons.tmp gelöscht werden.
Gruß root2root
sieht ganz gut aus. Zu dumm daß in meiner poweron.tmp nur ca. 50 mal poweron:XXXXX steht. "XXXXX" ist eine 5stellige Nummer. Es sind also ca 50 verschiedene Zeilen, aber ohne führende Zahlen wie in liste.tmp. Ihr habt ja Dateien gleichen Inhalts verglichen, alle mit Zeilenzahlen.
Bei mir sieht das so aus
# cat liste.tmp
2
5
8
24
33
42
# cat powerons.tmp
poweron:12345
poweron:25879
poweron:25698
poweron:25610
...
...
...
poweron:45697
poweron:45645
Entschuldigt, daß ich mich nicht ganz glasklar ausgedrückt habe (es war irgendwie schon sehr früh am morgen ).Es soll also die zeile 2,5,8,24,33,48 aus powerons.tmp gelöscht werden.
Gruß root2root
Re: Bash, Konsole, AWK-Ausgabe
das geht mit sed
Re: Bash, Konsole, AWK-Ausgabe
Genau.ThorstenS hat geschrieben:das geht mit sed
Um z.B. die Zeile 2 und 5 aus einer Datei zu löschen, könntest du sowas machen:
Code: Alles auswählen
sed -e '2d' -e '5d' file
Oh, yeah!
Re: Bash, Konsole, AWK-Ausgabe
Und wenn du nicht alle zu löschenden Zeilen in eine Zeile packst, dann fang hinten an.
Sonst verschieben sie sich ja alle um die schon gelöschte Anzahl an Zeilen.
Sonst verschieben sie sich ja alle um die schon gelöschte Anzahl an Zeilen.
Re: Bash, Konsole, AWK-Ausgabe
Super. Ich werde nun doch eine weitere Datei erzeugen.
Duff, kriegt man die 2 und die 5 aus deinem sed-Einzeiler als Variable unter ? Das könnte ein Löschbefehl
bstr="sed -e"
lstr=""
for i in $( cat liste.tmp ); do
lstr=$lstr & "'$i" &"d''
done
echo $bstr$lstr powerons.tmp >erg.tmp
werden, abhängig von der Anzahhl der enthalten Nummern in liste.tmp . Ob das alles so läuft ? Grübel...
Gruß root2root
***************************************************************************************************************************
Ich habs heute morgen verbessert: als ShellScript
#!/bin/bash
#Muster: sed -e '2d' -e '5d' -e'24d' ...
lstr=""
for i in $( cat liste.tmp ); do
lstr=$(echo $lstr" -e '"$i"d'")
done
mit #echo "sed -e "$lstr
sed -e "2d' -e '5d'...
läuft.
Gruß root2root
Duff, kriegt man die 2 und die 5 aus deinem sed-Einzeiler als Variable unter ? Das könnte ein Löschbefehl
bstr="sed -e"
lstr=""
for i in $( cat liste.tmp ); do
lstr=$lstr & "'$i" &"d''
done
echo $bstr$lstr powerons.tmp >erg.tmp
werden, abhängig von der Anzahhl der enthalten Nummern in liste.tmp . Ob das alles so läuft ? Grübel...
Gruß root2root
***************************************************************************************************************************
Ich habs heute morgen verbessert: als ShellScript
#!/bin/bash
#Muster: sed -e '2d' -e '5d' -e'24d' ...
lstr=""
for i in $( cat liste.tmp ); do
lstr=$(echo $lstr" -e '"$i"d'")
done
mit #echo "sed -e "$lstr
sed -e "2d' -e '5d'...
läuft.
Gruß root2root
Re: Bash, Konsole, AWK-Ausgabe
Das ist doch super. Geht zwar vielleicht auch "einfacher", aber ich finde die Lösung mit dem Zusammensetzen der zu löschenden Zeilen für den sed-String so gut.
Oh, yeah!
Re: Bash, Konsole, AWK-Ausgabe
Bin da zufällig über den Thread gestolpert und hatte grad mal 'n paar Minuten Zeit.
Hier mein AWK-Vorschlag:
Ich lese zu Beginn alle Zeilen von `liste.tmp' (das leider hardgecoded ist) und speichere diese in das Array `todelete'. Dann gebe ich alle Zeilen aus deren Zeilennummer nicht im Array ist.
Ein Aufruf wäre dann:
Hier mein AWK-Vorschlag:
Code: Alles auswählen
#!/usr/bin/awk -f
#
# print all lines unless their line number is in linenumfile
BEGIN {
linenumfile = "liste.tmp"
while ( getline l < linenumfile ) {
todelete[l] = 1;
}
}
!todelete[NR] {
print;
}
Ein Aufruf wäre dann:
Code: Alles auswählen
$ ./dellines.awk powerons.tmp
Use ed once in a while!
Re: Bash, Konsole, AWK-Ausgabe
ja, sehr elegant