gawk oder was? Spalten aus Liste extrahieren
Wie wandle ich am besten folgende Darstellung um? ls -lA --time-style=iso --quoting-style=escape total 0 lrwxrwxrwx 1 ab users 5 12-27 00:20 b\ 1\ ä -> /boot lrwxrwxrwx 1 ab users 4 12-27 00:20 bin\ bla -> /bin in b\ 1\ ä=/boot bin\ bla=/bin Die 1. Zeile ist also zu ignorieren. Andere ls-Optionen sind natürlich denkbar. Hintergrund: Ich brauche das für mkisofs -path-list Al
Am Samstag, 27. Dezember 2003 00:25 schrieb Al Bogner:
ls -lA --time-style=iso --quoting-style=escape total 0 lrwxrwxrwx 1 ab users 5 12-27 00:20 b\ 1\ ä -> /boot lrwxrwxrwx 1 ab users 4 12-27 00:20 bin\ bla -> /bin
in
b\ 1\ ä=/boot bin\ bla=/bin
Die 1. Zeile ist also zu ignorieren. Andere ls-Optionen sind natürlich denkbar.
ls -lA --time-style=iso --quoting-style=escape|gawk '{if(FNR!=1) {line=substr($0,57);gsub("->","=",line);print line}}' Eine Zeile. Es wird die erste Zeile übersprungen, ab Pos 57 abgeschnitten und dann "->" durch "=" ersetzt. HTH -- Andreas
Am Samstag, 27. Dezember 2003 10:46 schrieb Andreas Winkelmann:
Am Samstag, 27. Dezember 2003 00:25 schrieb Al Bogner:
ls -lA --time-style=iso --quoting-style=escape total 0 lrwxrwxrwx 1 ab users 5 12-27 00:20 b\ 1\ ä -> /boot lrwxrwxrwx 1 ab users 4 12-27 00:20 bin\ bla -> /bin
in
b\ 1\ ä=/boot bin\ bla=/bin
Die 1. Zeile ist also zu ignorieren. Andere ls-Optionen sind natürlich denkbar.
ls -lA --time-style=iso --quoting-style=escape|gawk '{if(FNR!=1) {line=substr($0,57);gsub("->","=",line);print line}}'
Eine Zeile.
Es wird die erste Zeile übersprungen, ab Pos 57 abgeschnitten und dann "->" durch "=" ersetzt.
Danke Andreas, leider ist das für mein mkisofs-Problem wider Erwarten nur ein kleiner Schritt weiter. Dieses mkisofs ist ziemlich bockig :-) BTW mkisofs will mit o.a. Syntax " = " und nicht "=", aber diese Kleinigkeit war schnell rausgefunden. In der Datei darf also vor und nach dem = kein Leerzeichen sein. Ist es möglich deine Pipe noch so zu erweitern, dass bei _keinem_ Link dann rechts neben dem = noch einmal das selbe steht, also zB irgendwas=irgendwas ? Das würde mich einen kleinen Schritt weiter bringen, da ich dann zumindest mal die Lösung für Dateien ohne Leerzeichen hätte. Ich habe mir ursprünglich vorgestellt dies in einer Schleife mit if zu lösen, aber deine Syntax ist da viel effizienter. Der Ansatz "ls --quoting-style=escape" ist für mkisofs nicht wirklich brauchbar. Ein bin\ bla=/bin in einer Datei "graftpointslist.txt" funktioniert zwar mit einer Syntax mkisofs -v -f -allow-lowercase -r -J -l -hide-rr-moved -V test -o /burn/testimage -graft-points -path-list graftpointslist.txt im Gegensatz zu bin bla=/bin aber das Verzeichnis auf der CD nennt sich dann 'bin\ bla' inkl. Backslash. Nach dem = habe ich noch gar keine Verzeichnisse mit Leerzeichen geschafft, auch nicht mit "\ ", mit " gequotet gibt es ebenfalls immer Fehlermeldungen. Irgendwie muß man doch bei mkisofs -graft-points -path-list Dateien bzw. Verzeichnisse mit Leerzeichen quoten können. Die Manpage ist da sehr spartanisch: -graft-points Allow to use graft points for filenames. If this option is used, all filenames are checked for graft points. The filename is divided at the first unescaped equal sign. All occurrences of '\\' and '=' characters must be escaped with '\\' if -graft-points has been specified. Wenn ich das richtig verstehe, geht es hier nur um \ und = als Bestandteil des Dateinamens. Es wird aber nichts darüber ausgesagt, wie Namen mit Leerzeichen zu quoten sind. Man könnte fast glauben, dass gar nicht zu quoten ist. (The filename is divided at the first unescaped equal sign). Ich ende bei Leerzeichen immer bei einer Meldung ähnlich 'Invalid node - /test\ mit\ blank' Al
Am Samstag, 27. Dezember 2003 18:45 schrieb Al Bogner:
ls -lA --time-style=iso --quoting-style=escape|gawk '{if(FNR!=1) {line=substr($0,57);gsub("->","=",line);print line}}'
Eine Zeile.
Es wird die erste Zeile übersprungen, ab Pos 57 abgeschnitten und dann "->" durch "=" ersetzt.
Danke Andreas,
leider ist das für mein mkisofs-Problem wider Erwarten nur ein kleiner Schritt weiter. Dieses mkisofs ist ziemlich bockig :-)
BTW mkisofs will mit o.a. Syntax " = " und nicht "=", aber diese Kleinigkeit war schnell rausgefunden. In der Datei darf also vor und nach dem = kein Leerzeichen sein.
Dann musst Du das "->" durch " -> " ersetzen.
Ist es möglich deine Pipe noch so zu erweitern, dass bei _keinem_ Link dann rechts neben dem = noch einmal das selbe steht, also zB irgendwas=irgendwas ? Das würde mich einen kleinen Schritt weiter bringen, da ich dann zumindest mal die Lösung für Dateien ohne Leerzeichen hätte. Ich habe mir ursprünglich vorgestellt dies in einer Schleife mit if zu lösen, aber deine Syntax ist da viel effizienter.
# ls -lA --time-style=iso --quoting-style=escape|gawk '{if(FNR!=1) {line=substr($0,56);if(0==gsub(" -> ","=",line)){line=line "=" line};print line}}' Check das bitte mal mit der 56 bzw. 57 in Deinen Verzecihnissen.
Der Ansatz "ls --quoting-style=escape" ist für mkisofs nicht wirklich brauchbar. Ein bin\ bla=/bin in einer Datei "graftpointslist.txt" funktioniert zwar mit einer Syntax
mkisofs -v -f -allow-lowercase -r -J -l -hide-rr-moved -V test -o /burn/testimage -graft-points -path-list graftpointslist.txt
im Gegensatz zu bin bla=/bin aber das Verzeichnis auf der CD nennt sich dann 'bin\ bla' inkl. Backslash.
Nach dem = habe ich noch gar keine Verzeichnisse mit Leerzeichen geschafft, auch nicht mit "\ ", mit " gequotet gibt es ebenfalls immer Fehlermeldungen.
Irgendwie muß man doch bei mkisofs -graft-points -path-list Dateien bzw. Verzeichnisse mit Leerzeichen quoten können. Die Manpage ist da sehr spartanisch:
-graft-points Allow to use graft points for filenames. If this option is used, all filenames are checked for graft points. The filename is divided at the first unescaped equal sign. All occurrences of '\\' and '=' characters must be escaped with '\\' if -graft-points has been specified.
Wenn ich das richtig verstehe, geht es hier nur um \ und = als Bestandteil des Dateinamens. Es wird aber nichts darüber ausgesagt, wie Namen mit Leerzeichen zu quoten sind. Man könnte fast glauben, dass gar nicht zu quoten ist. (The filename is divided at the first unescaped equal sign). Ich ende bei Leerzeichen immer bei einer Meldung ähnlich 'Invalid node - /test\ mit\ blank'
Kenne mich mit mkisofs auch nicht aus. Evtl müssen die Dateinamen dann in " " oder ' ' sein? -- Andreas
Am Samstag, 27. Dezember 2003 19:09 schrieb Andreas Winkelmann: Danke Andreas! Ich bin mit dieser mkisofs-Syntax schon langsam am verzweifeln.
BTW mkisofs will mit o.a. Syntax " = " und nicht "=", aber diese Kleinigkeit war schnell rausgefunden. In der Datei darf also vor und nach dem = kein Leerzeichen sein.
Dann musst Du das "->" durch " -> " ersetzen.
Danke, da hatte ich im Mail was verwechselt, genau das meinte ich, dass ich das gemacht hatte.
# ls -lA --time-style=iso --quoting-style=escape|gawk '{if(FNR!=1) {line=substr($0,56);if(0==gsub(" -> ","=",line)){line=line "=" line};print line}}'
Check das bitte mal mit der 56 bzw. 57 in Deinen Verzecihnissen.
Mit 56 hat es gepasst.
Der Ansatz "ls --quoting-style=escape" ist für mkisofs nicht wirklich brauchbar. Ein bin\ bla=/bin in einer Datei "graftpointslist.txt" funktioniert zwar mit einer Syntax
mkisofs -v -f -allow-lowercase -r -J -l -hide-rr-moved -V test -o /burn/testimage -graft-points -path-list graftpointslist.txt
im Gegensatz zu bin bla=/bin aber das Verzeichnis auf der CD nennt sich dann 'bin\ bla' inkl. Backslash.
Nach dem = habe ich noch gar keine Verzeichnisse mit Leerzeichen geschafft, auch nicht mit "\ ", mit " gequotet gibt es ebenfalls immer Fehlermeldungen.
Irgendwie muß man doch bei mkisofs -graft-points -path-list Dateien bzw. Verzeichnisse mit Leerzeichen quoten können. Die Manpage ist da sehr spartanisch:
-graft-points Allow to use graft points for filenames. If this option is used, all filenames are checked for graft points. The filename is divided at the first unescaped equal sign. All occurrences of '\\' and '=' characters must be escaped with '\\' if -graft-points has been specified.
Wenn ich das richtig verstehe, geht es hier nur um \ und = als Bestandteil des Dateinamens. Es wird aber nichts darüber ausgesagt, wie Namen mit Leerzeichen zu quoten sind. Man könnte fast glauben, dass gar nicht zu quoten ist. (The filename is divided at the first unescaped equal sign). Ich ende bei Leerzeichen immer bei einer Meldung ähnlich 'Invalid node - /test\ mit\ blank'
Kenne mich mit mkisofs auch nicht aus. Evtl müssen die Dateinamen dann in " " oder ' ' sein?
Beides schon probiert. Ergebnis ist immer wieder "Invalid node". Die Tücke ist, dass man mkisofs -graft-points -path-list sehr selten _unbedingt_ im konkreten Einzelfall anwenden muß. In einem Script kann man aber schwer vorhersehen, was da so alles an Blanks und Sonderzeichen kommen wird. Welche Möglichkeiten Dateinamen mit Leerzeichen zu quoten gibt es noch? {} habe ich auch schon probiert. Vorgabe ist, dass alle zu brennenden Verzeichnisse bzw. Dateien in einem "Brennverzeichnis" entweder als Link oder als "Originaldatei" vorhanden sind. Mkisofs gerät manchmal in eine Endlosschleife, die man in der Regel mit -graft-points übergeht. Ich hatte zumindest noch nie Probleme mit -graft-points, während ich zb /etc als Link nicht brennen konnte. Nun lassen sich _alle_ Graftpoints nicht in _1_ Variable schreiben, sozusagen die Ausgabe o.a. ls-pipe in 1 Zeile. Das hatte ich schon mit einer Schleife gelöst. Aber vielleicht hast du noch eine Idee wie man das ohne -pathlist lösen könnte. Gegeben ist zb folgendes Verzeichnis zu brennen: ls -lA --time-style=iso | gawk '{if(FNR!=1) {line=substr($0,56);if(0==gsub(" -> ","=",line)){line=line "=" line};print line}}' brennlog.txt=brennlog.txt public_html=/home/ab/public_html test mit Leerzeichen=/test mit blank Anstatt die obigen 3 Zeilen in eine Datei zu schreiben und -pathlist zu verwenden könnte man auch folgendes machen: brenn_name1="brennlog.txt" orginal_name1="brennlog.txt" brenn_name2="public_html" orginal_name2="/home/ab/public_html" brenn_name3="test mit Leerzeichen" orginal_name2="/test mit blank" verkürzt ohne andere Optionen: mkisofs -graft-points "$brenn_name1"="$orginal_name1" \ "$brenn_name2"="$orginal_name2" \ "$brenn_name3"="$orginal_name3" Das funktioniert nicht: GRAFTPOINTS="$brenn_name1=$orginal_name1 $brenn_name2=$orginal_name2 \ $brenn_name3=$orginal_name3" mkisofs -graft-points "$GRAFTPOINTS" inkl. der von mir getesteten Varianten mit unterschiedl. Quoten der Variable. Das = darf nicht in der Variable sein, sondern muß in der Zeile von mkisofs stehen. Da nun im Skript nicht vorhersehbar ist, wieviel Verzeichnisse gerade gerbannt werden sollen und das = nicht in einer Variable stehen darf, sehe ich mich hier in einer Sackgasse. Aber vielleicht hast du noch irgendwelche Ideen. Vielleicht kennt irgendwer noch eine weiter mkisofs-Option. Leider konnte ich im Debugging-Modus von k3b die Datei nicht entdecken, die für -pathlist verwendet wird. Im angegeben Pfad ist sie nicht. Al
Am Samstag, 27. Dezember 2003 20:27 schrieb Al Bogner:
Vorgabe ist, dass alle zu brennenden Verzeichnisse bzw. Dateien in einem "Brennverzeichnis" entweder als Link oder als "Originaldatei" vorhanden sind. Mkisofs gerät manchmal in eine Endlosschleife, die man in der Regel mit -graft-points übergeht. Ich hatte zumindest noch nie Probleme mit -graft-points, während ich zb /etc als Link nicht brennen konnte. Nun lassen sich _alle_ Graftpoints nicht in _1_ Variable schreiben, sozusagen die Ausgabe o.a. ls-pipe in 1 Zeile. Das hatte ich schon mit einer Schleife gelöst.
Aber vielleicht hast du noch eine Idee wie man das ohne -pathlist lösen könnte.
Hmm, diese graft-points basieren auf einzelnen Argumenten, soweit ich das gesehen habe. Also: ... -graft-points "brenn name1=org name1" "brenn name2=org name2"... Wieso eigentlich nicht -pathlist?
Aber vielleicht hast du noch irgendwelche Ideen. Vielleicht kennt irgendwer noch eine weiter mkisofs-Option. Leider konnte ich im Debugging-Modus von k3b die Datei nicht entdecken, die für -pathlist verwendet wird. Im angegeben Pfad ist sie nicht.
Wenn da "-path-list -" steht, gibt es auch keine Datei. Dann kommt die Liste über stdin. -- Andreas
Am Samstag, 27. Dezember 2003 20:55 schrieb Andreas Winkelmann:
Hmm, diese graft-points basieren auf einzelnen Argumenten, soweit ich das gesehen habe. Also: ... -graft-points "brenn name1=org name1" "brenn name2=org name2"...
Also ich würde jeden Lügendedektortest bestehen, dass es vorher AFAIR so nicht ging, wenn ich mich vermutlich auch irgendwo geirrt hatte. Ich hatte gerade unabhängig von dir eine simples echo "---" an einer bestimmten Stelle getestet und das ging nun durch: brennlog.txt=brennlog.txt public_html=/home/ab/public_html test mit Leerzeichen=/test mit blank Ich verstehe es echt nicht, warum ich mich da im Kreis drehte Ich muß auch sagen, dass ich ohne Quoting nicht viel experimentiert hatte, sondern bei den Tests immer irgendwie gequotet hatte und das geht offenbar schief.
Wenn da "-path-list -" steht, gibt es auch keine Datei. Dann kommt die Liste über stdin.
Darüber habe ich auch schon nachgedacht. Ich weiß aber nicht, ob das viel bringt. Jetzt versuche ich mich an der Syntax mkisofs nach cdrecord zu pipen. Ohne -path-list hat das aber schon funktioniert. Also bin ich mal wieder zuversichtlich. Vielen Dank!! Al
Am Samstag, 27. Dezember 2003 21:12 schrieb Al Bogner:
Ich verstehe es echt nicht, warum ich mich da im Kreis drehte
Vermutlich lag mein Problem darin, dass ich mich bei den vielen Tests gerade dann nicht im Brennverzeichnis befand, wenn die Syntax mal richtig war. Bei der in diesem Thread erwähnten ls-pipe muß man ja vorher ins Brennverzeichnis wechseln, sonst können die graft-points nicht gefunden werden. Al
participants (2)
-
Al Bogner
-
Andreas Winkelmann