Bash, Konsole, AWK-Ausgabe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Bash, Konsole, AWK-Ausgabe

Beitrag von root2root » 26.04.2009 07:20:36

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

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 26.04.2009 09:51:02

Code: Alles auswählen

xclip Zwischenablage | awk '/Filter/ {print "poweron"$1}' 

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von root2root » 30.04.2009 05:38:22

@ 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

yeti

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von yeti » 30.04.2009 06:09:56

root2root hat geschrieben:AnzZeilen=$(xclip Zwischenablage | grep Filter | * BashFunktion Zeilenzählen * )

Code: Alles auswählen

blahblah | wc -l
"wc" ist ein externes Programm und keine Bash-Funktion... "xclip" und "grep" ebenfalls, also wird's Dich wohl kaum stören, oder?

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 30.04.2009 15:48:14

grep -c zählt auch, damit sparst du dir den wc Aurfuf.

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von root2root » 08.05.2009 01:33:40

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Duff » 08.05.2009 09:17:19

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!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 08.05.2009 12:57:05

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Duff » 08.05.2009 13:11:52

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.
Oh, yeah!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 08.05.2009 13:56:07

grep -v -f test2 test1 > test1_tmp && mv test1_tmp test1
besser? 8)

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Duff » 08.05.2009 14:35:09

Ich find's gut so. Ist ja auch ein Einzeiler ;-)

...muss ich der Threadersteller mal zu Wort melden.
Oh, yeah!

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von root2root » 08.05.2009 23:35:31

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 :D ).Es soll also die zeile 2,5,8,24,33,48 aus powerons.tmp gelöscht werden.
Gruß root2root

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 09.05.2009 09:46:50

das geht mit sed

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Duff » 09.05.2009 14:03:22

ThorstenS hat geschrieben:das geht mit sed
Genau.

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
In Verbindung mit -i dann auch wirklich in der DAtei ändern.
Oh, yeah!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 09.05.2009 15:54:55

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.

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von root2root » 09.05.2009 22:26:10

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 :o. 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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Duff » 10.05.2009 09:34:35

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!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Meillo » 10.05.2009 22:06:31

Bin da zufällig über den Thread gestolpert und hatte grad mal 'n paar Minuten Zeit. :-D

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;
}
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:

Code: Alles auswählen

$ ./dellines.awk powerons.tmp
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von Duff » 11.05.2009 08:50:40

Mal wieder super in awk gelöst, Meillo. :D
Oh, yeah!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash, Konsole, AWK-Ausgabe

Beitrag von ThorstenS » 11.05.2009 13:15:37

ja, sehr elegant :)

Antworten