#!/bin/sh # # Nutzung der mit igawk gelieferten Funktion getopt() zur Auswertung von # Kommandozeilen-Optionen # # 16.7.2006 # Das vorliegende File ist ein Shell-Skript mit der Endung .awk, so dass der # Editor Vim automatisch das Syntax Highlighting für AWK einschaltet. # Hauptbestandteil des Shell-Skriptes ist ein AWK-Programm, das zur Ausführung # an igawk übergeben wird. # Für die als Argumente benannten Files wird eine Zeilenzählung realisiert (wie # bei "wc -l"). # # Optionen: # -v --> Verbose (Ausgabe jeder Zeile des Files) # -o file --> Name der Ausgabe-Datei; Standard: stdout igawk ' # getopt() einbinden @include getopt.awk # Ausführung der Aktionen, die am Ende eines Files nötig sind function end_file() { if (file_name) { # Daten des vorigen Files ausgeben printf(fmt " %s\n", anz, file_name) > out_file # die Gesamtzahl der Zeilen und Files aktualisieren anz_sum += anz anz_files++ } # den neuen Filenamen merken und den Zeilenzähler nullen file_name = FILENAME anz = 0 } BEGIN { out_file = "/dev/stdout" verbose = 0 fmt = "%6d" # über Opterr kann man steuern, ob getopt() eine Fehlermeldung bei ungültigen # Optionen bringen soll oder nicht; wir setzen Opterr auf den Wert der # gleichnamigen Umgebungsvariable Opterr = ENVIRON["Opterr"] # Optopt benennt die aktuelle Option # Optarg benennt das Argument der aktuellen Option while (getopt(ARGC, ARGV, "o:v") != -1) { if (Optopt == "v") { verbose = 1 } else if (Optopt == "o") { out_file = Optarg } else if (! Opterr) { printf("Fehlerhafte Option: %s\n", Optopt) > "/dev/stderr" } } # die Optionen löschen, da sie sonst als Eingabe-Files gewertet würden for (i = 1; i < Optind; i++) { ARGV[i] = "" } } FNR == 1 { # Beginn einer neuen Datei; das Vorgänger-File benötigt also seine # Ende-Behandlung end_file() } # Eingabe-Dateien zeilenweise lesen { if (verbose) { print " ", FILENAME, $0 > out_file } # Zeilen zählen anz++ } END { end_file() # wenn wir mehr als ein File hatten, dann noch eine Zeilen-Summe ausgeben if (anz_files > 1) { printf(fmt " insgesamt\n", anz_sum) > out_file } } ' "$@"