Ist es möglich, einen iterierten Argumentbereich über die Befehlszeile aus einer CSV-Datei auszudrucken? (siehe Beispiel)

Ist es möglich, einen iterierten Argumentbereich über die Befehlszeile aus einer CSV-Datei auszudrucken? (siehe Beispiel)

Ich habe Hunderte von Protokollen, die über einige Tausend VMs verteilt sind, und ich versuche, einige Skripte zum schnellen Scannen der Protokolle zu erstellen. Ich habe den Großteil der Präsentation herausgefunden und wollte wissen, ob es eine einfache Möglichkeit gibt, etwas wie awk, printf usw. zu verwenden, dessen Verwendung ich kenne, mit dem ich jedoch insbesondere einen iterierten Wertebereich aus den Protokolldateien drucken kann?

Beispiel:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

Ich weiß, wie man die Druckausgabe richtig mit „awk“ bearbeitet, formatiert, trennt usw., dachte aber, es wäre schön, wenn ich einen Bereich von Feldern angeben könnte, die ich ausdrucken möchte.

Ich werde meine Frage aktualisieren, wenn ich herausfinde, wie das mit den vorgeschlagenen ähnlichen Fragen und/oder alleine geht.

Danke!

EDIT: Ich weiß, wie man $1 $2 $3 manuell druckt, habe es aber nicht in mein Beispiel aufgenommen

BEARBEITEN 2: Ich weiß auch, wie man mit awk und NF die Anzahl der Felder zählt, um den Bereich später dynamisch zu gestalten, was mein langfristiges Ziel ist.

Antwort1

Bereiche, die mit dem ersten Feld beginnen

Betrachten wir diese Testdatei:

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

Zumindest mit GNU awk können wir die ersten fünf (oder eine andere Anzahl) Felder wie folgt drucken:

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

Für diejenigen, denen Kürze wichtiger ist als Klarheit, könnten wir äquivalent dazu schreiben:

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

Dynamische Größenanpassung

So lassen Sie die letzten beiden Felder weg, unabhängig davon, wie viele Felder diesen beiden vorangehen:

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

Andere Bereiche

Um mit beliebigen Feldern zu beginnen und zu stoppen, ist eine Schleife erforderlich:

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

So drucken Sie ab dem dritten Feld und lassen die letzten beiden Felder dynamisch aus:

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h

Antwort2

Nur eine kurze Anmerkung: awkist viel flexibler, wenn Sie aber nur einen bestimmten Feldbereich möchten, verwenden Sie cut:

cut -d, -f1-5 huge_log_file.csv

Dies ist viel einfacher als eine awkSchleife, wenn das alles ist, was Sie benötigen.

verwandte Informationen