Ich fordere eine Liste von ec2-Snapshots über das ec2-Befehlszeilentool von amazon an:
ec2-describe-snapshots -H --hide-tags > snapshots.csv
Die Daten sehen ungefähr so aus:
SnapshotId VolumeId StartTime OwnerId VolumeSize Description
snap-00b66464 vol-b99a38d0 2012-01-05 5098939 160 my backup
Wie kann ich die Daten abfangen, bevor ich sie umleitung, snapshots.csv
und die folgenden Schritte ausführen:
- Ersetzen Sie "Tabulatoren" durch Kommas
- Werte in Anführungszeichen setzen
- Wenn ein Wert nur aus Zahlen besteht, stellen Sie ihm ein Präfix
=
voran, damit Excel ihn als Text behandelt - zum BeispielOwnerId
sollte er"=5098939
"sein (dieser ist nicht erforderlich, wenn er nicht inline ausgeführt werden kann und stattdessen eine Skriptdatei oder -funktion erfordert).
gewünschte Ausgabe:
"SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description"
"snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"
Antworten:
Angenommen, Sie nennen dies
convert.awk
, können Sie entweder mit beiden anrufenoder (nach dem Hinzufügen von Ausführungsberechtigungen
chmod a+x convert.awk
)Dadurch wird für jede Registerkarte eine neue Spalte erstellt, die die Kommentarspalte zusammenhält (es sei denn, sie enthält Registerkarten), aber leere Spalten hinzufügt (obwohl Ihre Beispielausgabe so aussieht, möchten Sie das vielleicht tatsächlich). Wenn Sie alle Leerzeichen aufteilen möchten (dadurch werden zusätzliche Registerkarten in der Tabelle reduziert, aber jedes Wort in der Beschreibung als neue Spalte eingefügt), entfernen Sie die
FS="\t";
Anweisung.Wenn Sie für zukünftige Generationen kein
"
s oder=
s oder eingebettetes Leerzeichen benötigen , können Sie es zu einem Einzeiler machen:quelle
./convert.sh
chmod + x und leite dann die Eingabe hinein, damit die Ausgabe gedruckt wird? Ich erhalte eine Fehlermeldung :/usr/bin/awk: syntax error at source line 1 context is >>> . <<< /convert.sh
.convert.awk
, dass es sich um einawk
Skript handelt und nicht um ein Skriptbash
. Ich habe den Beitrag mit der vollständigen Befehlszeile aktualisiert und festgestellt, dass ich-f
der ersten Zeile ein Flag hinzugefügt habe, das ich vergessen habe (das besagt, dass die Datei als Befehle interpretiert werden soll).Hier ist eine Perl-Lösung. Dies könnte mit sed / awk möglich sein, aber das Testen des numerischen Teils würde es wahrscheinlich ziemlich hässlich machen.
quelle
Wenn Sie nur faul wie ich sind und alles in einer Befehlszeile ausführen möchten, ohne ein Skript zu schreiben, würde ich das folgendermaßen tun.
Das
^I
wird durch Drücken von ctrl+ gemacht v i.Der erste
sed
tauscht allestabs
gegen","
. Der zweitesed
fügt"
am Anfang jeder Zeile ein ein, und der letzte sed fügt"
am Ende jeder Zeile einen Abschluss ein .quelle
<kbd>text</kbd>
.sed -e 's/^I/","/g' -e 's/.*/"&"/'
oder noch kürzersed -e 's/^I/","/g;s/.*/"&"/'
.Eine weitere Perl-Lösung:
mit aufrufen
ec2-describe-snapshots -H --hide-tags | /var/tmp/script.pl > output.txt
quelle
sed ist das nützlichste Linux-Dienstprogramm, das mir je begegnet ist.
Der erste Befehl ersetzt alle Registerkarten in jeder Zeile durch Kommas und Anführungszeichen. Der zweite Befehl fügt am Anfang und am Ende jeder Zeile Anführungszeichen ein, sodass jeder Wert in Anführungszeichen gesetzt wird, sodass Kommas Teil des Werts sein können.
quelle
Dies könnte für Sie funktionieren:
quelle