Dies ist der Befehl runawk, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
runawk – Wrapper für AWK-Interpreter
ZUSAMMENFASSUNG
runawk [Optionen] Programmdatei
runawk -e Programm
MOTIVATION
Nachdem ich AWK jahrelang zum Programmieren verwendet habe, habe ich festgestellt, dass es trotz seiner Einfachheit und
Einschränkungen AWK ist gut genug für die Skripterstellung für eine Vielzahl unterschiedlicher Aufgaben. AWK ist es nicht
genauso mächtig wie ihre größeren Gegenstücke wie Perl, Ruby, TCL und andere, aber es hat seine eigenen
eigene Vorteile wie Kompaktheit, Einfachheit und Verfügbarkeit auf fast allen UNIX-ähnlichen Geräten
Systeme. Mir persönlich gefällt auch der datengesteuerte Charakter und die Token-Ausrichtung, sehr nützlich
Techniken für Textverarbeitungsprogramme.
Leider fehlen den AWK-Dolmetschern einige wichtige Funktionen und sie funktionieren manchmal nicht als solche
so gut sie konnten.
Probleme, die ich sehe (einige davon natürlich)
1.
AWK bietet keine Unterstützung für Module. Auch wenn ich kleine Programme erstelle, möchte ich sie oft verwenden
Funktionen, die zuvor erstellt und bereits in anderen Skripten verwendet wurden. Das heißt, es wäre großartig
Organisieren Sie Funktionen in sogenannten Bibliotheken (Modulen).
2.
Um Argumente an „#!/usr/bin/awk -f“-Skript (nicht für den AWK-Interpreter), ist es
Es ist notwendig, einer Liste von Argumenten ein -- (zwei Minuszeichen) voranzustellen. Meiner Meinung nach ist dies
sieht schlecht aus. Außerdem verstößt ein solches Verhalten gegen die „Utility Syntax Guidelines“ von POSIX/SUS.
Ejemplo:
awk_program:
#!/usr/bin/awk -f
START {
für (i=1; i < ARGC; ++i){
printf „ARGV [%d]=%s\n“, i, ARGV [i]
}
}
Shell-Sitzung:
% awk_program --opt1 --opt2
/usr/bin/awk: unbekannte Option --opt1 ignoriert
/usr/bin/awk: unbekannte Option --opt2 ignoriert
% awk_program -- --opt1 --opt2
ARGV [1]=--opt1
ARGV [2]=--opt2
%
Meiner Meinung nach awk_program Das Skript sollte so funktionieren
% awk_program --opt1 --opt2
ARGV [1]=--opt1
ARGV [2]=--opt2
%
3.
Wann "#!/usr/bin/awk -f“-Skript verarbeitet Argumente (Optionen) und möchte daraus lesen
stdin ist es notwendig, /dev/stdin (oder „-“) explizit als letztes Argument hinzuzufügen.
Ejemplo:
awk_program:
#!/usr/bin/awk -f
START {
if (ARGV [1] == "--flag"){
Flagge = 1
ARGV [1] = „“ # Datei mit dem Namen „--flag“ nicht lesen
}
}
{
Drucken Sie „flag=" flag „ $0=" $0
}
Shell-Sitzung:
% Echotest | awk_program -- --flag
% Echotest | awk_program -- --flag /dev/stdin
flag=1 $0=test
%
Im Idealfall awk_program sollte so funktionieren
% Echotest | awk_program --flag
flag=1 $0=test
%
4.
igawk(1), das mit GNU awk geliefert wird, kann in Shebang nicht verwendet werden. Auf den meisten (allen?)
UNIXes-Skripte beginnend mit
#!/usr/local/bin/igawk -f
wird nicht funktionieren.
runawk wurde geschaffen, um all diese Probleme zu lösen
OPTIONAL
-d Aktivieren Sie einen Debugging-Modus.
-e Programm
Programm angeben. Wenn -e nicht angegeben ist, wird der AWK-Code ausgelesen Programmdatei.
-f awk_module
Mehr erfahren awk_module. Das funktioniert genauso wie
#verwende „awk_module.awk“
Direktive im Code. Mehrere -f Optionen sind erlaubt.
-F fs Setzen Sie das Eingabefeldtrennzeichen FS auf den regulären Ausdruck fs.
-h Hilfeinformationen anzeigen.
-t Wenn diese Option angewendet wird, wird ein temporäres Verzeichnis erstellt runawk und Weg dorthin
wird an übergeben awk untergeordneter Prozess. Unter wird ein temporäres Verzeichnis erstellt
${RUNAWK_TMPDIR} (falls festgelegt) oder ${TMPDIR} (falls festgelegt) oder / Tmp Verzeichnis
Andernfalls. Ob #verwenden „tmpfile.awk“ Wird in einem Programm erkannt, ist diese Option aktiviert
automatisch.
-T Setzen Sie FS auf TAB-Zeichen. Dies entspricht -F'\t'
-V Versionsinformationen anzeigen.
-v jung=Welle
Weisen Sie den Wert zu Welle auf die Variable jung bevor die Ausführung des Programms beginnt.
DETAILS/INTERNES
Standalone Skript
Unter UNIX-ähnlichen Betriebssystemen können Sie verwenden runawk indem Sie Ihr Skript mit beginnen
#!/usr/local/bin/runawk
Zeile oder so ähnlich statt
#!/usr/bin/awk -f
o.ä.
AWK Module
Um Module zu aktivieren, sollten Sie sie wie folgt in das awk-Skript einfügen
#verwende „module1.awk“
#verwende „module2.awk“
Das heißt, die Zeile, die den Modulnamen angibt, wird vom normalen AWK als Kommentarzeile behandelt
Interpreter, wird aber von verarbeitet runawk insbesondere.
Es sei denn, du rennst runawk mit Option -e, #verwenden muss mit Spalte 0 beginnen, das heißt keine Leerzeichen oder
Davor sind Tabulatorsymbole zulässig, dazwischen sind keine Symbole zulässig # und -.
Beachten Sie auch, dass AWK-Module auch andere Module usw. „verwenden“ können. Das sind sie alle
In einer Tiefenreihenfolge gesammelt und jeweils zur Liste der awk-Interpreter hinzugefügt
Argumente mit der Option -f vorangestellt. Das ist #verwenden Direktive ist *NICHT* ähnlich #einschließen
In der Programmiersprache C wird der Modulcode von runawk nicht an der Stelle von eingefügt #verwenden.
Die Module von Runawk ähneln eher Perls „use“-Befehl. Falls ein Modul erwähnt wird
Mehr als einmal wird dafür nur ein -f hinzugefügt, dh Duplikate werden entfernt
automatisch.
Position von #verwenden Die Direktive in einer Quelldatei spielt eine Rolle, d. h. das frühere Modul ist wichtig
erwähnt, wird das frühere -f dafür generiert.
Ejemplo:
Datei prog:
#!/usr/local/bin/runawk
#verwende „A.awk“
#verwende „B.awk“
#verwende „E.awk“
PROG-Code
...
Datei B.awk:
#verwende „A.awk“
#verwende „C.awk“
B-Code
...
Datei C.awk:
#verwende „A.awk“
#verwende „D.awk“
C-Code
...
A.awk und D.awk enthalten keine #use-Anweisung
Wenn du läufst
runawk prog Datei1 Datei2
or
/path/to/prog file1 file2
den folgenden Befehl
awk -f A.awk -f D.awk -f C.awk -f B.awk -f E.awk -f prog -- Datei1 Datei2
wird tatsächlich laufen.
Sie können dies überprüfen, indem Sie ausführen
runawk -d prog Datei1 Datei2
Modul search Strategie
Module werden zunächst in einem Verzeichnis gesucht, in dem sich das Hauptprogramm befindet (oder in einem Modul, in dem #use
Anweisung angegeben ist) platziert wird. Wenn es dort nicht gefunden wird, dann AWKPATH-Umgebung
Variable wird überprüft. AWKPATH führt eine durch Doppelpunkte getrennte Liste der Suchverzeichnisse. Endlich,
Das Modul wird im Runawk-Modulverzeichnis des Systems gesucht, standardmäßig jedoch PREFIX/share/runawk
Dies kann zur Kompilierungszeit geändert werden.
Es kann auch ein absoluter Pfad zum Modul angegeben werden.
Mentessa for Good as an Argument
Wie einige andere Dolmetscher runawk Sie können das Skript über eine Befehlszeile wie diese abrufen
/path/to/runawk -e '
#use „alt_assert.awk“
{
behaupten($1 >= 0 && $1 <= 10, "Ungültiger Wert: " $1)
# Ihr Code unten
...
}'
runawk kann auch zum Schreiben von Onelinern verwendet werden
runawk -f abs.awk -e 'BEGIN {print abs(-1)}'
Auswahl a bevorzugt AWK Dolmetscher
Aus irgendeinem Grund bevorzugen Sie möglicherweise den einen oder anderen AWK-Dolmetscher. Der Grund kann sein
Effizienz für eine bestimmte Aufgabe, nützliche, aber keine Standarderweiterungen oder irgendetwas anderes. Zu
erzählen runawk Welchen AWK-Interpreter man verwenden soll, kann man nutzen #interp Richtlinien
Datei prog:
#!/usr/local/bin/runawk
#verwende „A.awk“
#verwende „B.awk“
#interp „/usr/pkg/bin/nbawk“
# Ihr Code hier
...
Beachten Sie, dass #interp Die Direktive sollte ebenfalls mit Spalte 0 beginnen, davor sind keine Leerzeichen erlaubt
es und dazwischen # und interp.
Manchmal ist es auch sinnvoll, Benutzern die Möglichkeit zu geben, ihr bevorzugtes AWK auszuwählen
Interpreter ohne Änderung des Quellcodes. In runawk es ist möglich, spezielle zu verwenden
Richtlinien #interp-var Dadurch wird ein vom Benutzer zuweisbarer Umgebungsvariablenname festgelegt
gibt einen AWK-Interpreter an. Zum Beispiel das folgende Skript
Datei-Foobar:
#!/usr/bin/env runawk
#interp-var „FOOBAR_AWK“
START {
Drucken Sie „Dies ist eine FooBar-Anwendung“
}
kann ausgeführt werden als
env FOOBAR_AWK=mawk foobar
oder einfach nur
foobar
Im ersteren Fall schleichen wird als AWK-Interpreter verwendet, im letzteren Fall der Standard-AWK
Dolmetscher.
Die richtigen vorhandenen Module einzige
In der UNIX-Welt ist es üblich, Konfigurationsdateien in einer Programmiersprache zu schreiben
der Bewerbung. Das heißt, wenn die Anwendung in der Bourne-Shell geschrieben ist, Konfiguration
Dateien für solche Anwendungen werden oft auch in Bourne geschrieben. Mit RunAWK kann man das machen
das Gleiche gilt für in AWK geschriebene Bewerbungen. Beispielsweise wird der folgende Code verwendet
~/.foobarrc Datei, falls vorhanden, andernfalls wird /etc/foobar.conf verwendet, falls vorhanden.
Datei-Foobar:
#!/usr/bin/env runawk
#safe-use "~/.foobarrc" "/etc/foobar.conf"
START {
drucken foo, bar, baz
}
Datei ~/.foobarrc:
START {
foo = "foo10"
bar = "bar20"
baz = 123
}
Natürlich #sichere Verwendung Die Richtlinie kann auch für andere Zwecke verwendet werden. #sichere Verwendung
Die Direktive akzeptiert so viele Module, wie Sie möchten, aber höchstens eines kann mit awk eingebunden werden
Option -f, andere werden stillschweigend ignoriert, beachten Sie auch, dass Module von links nach analysiert werden
Rechts. Die führende Tilde im Modulnamen wird durch das Home-Verzeichnis des Benutzers ersetzt. Ein anderer
Beispiel:
Datei-Foobar:
#!/usr/bin/env runawk
#use „/usr/share/foobar/default.conf“
#safe-use "~/.foobarrc" "/etc/foobar.conf"
Dein Code ist hier
Hier werden die Standardeinstellungen in /usr/share/foobar/default.conf und Konfiguration festgelegt
Dateien (falls vorhanden) werden zum Überschreiben verwendet.
Rahmen -Umgebung
In einigen Fällen möchten Sie möglicherweise den AWK-Interpreter in einer bestimmten Umgebung ausführen. Für
Beispielsweise ist Ihr Skript möglicherweise darauf ausgerichtet, nur ASCII-Text zu verarbeiten. In diesem Fall können Sie ausführen
AWK mit LC_CTYPE=C-Umgebung und Verwendung von Regexp-Bereichen.
runawk bietet #env Richtlinie hierfür. Eine Zeichenfolge in doppelten Anführungszeichen wird an übergeben
putenv(3) libc-Funktion.
Ejemplo:
Datei prog:
#!/usr/local/bin/runawk
#env "LC_ALL=C"
$1 ~ /^[AZ]+$/ { # AZ ist gültig, wenn LC_CTYPE=C
Drucken Sie 1 $
}
EXIT STATUS
Wenn der AWK-Interpreter normal beendet wird, runawk wird mit seinem Exit-Status beendet. Wenn AWK-Interpreter
wurde durch ein Signal getötet, runawk Ausgänge mit Ausgangsstatus 128+Signal.
AWKPATH
Durch Doppelpunkt getrennte Liste der Verzeichnisse, in denen awk Module werden durchsucht.
RUNAWK_AWKPROG
Legt den Pfad zum AWK-Interpreter fest, der standardmäßig verwendet wird, dh diese Variable überschreibt
die Standardeinstellung zur Kompilierungszeit. Beachten Sie, dass die #interp-Direktive dies überschreibt.
RUNAWK_KEEPTMP
Wenn festgelegt, werden temporäre Dateien nicht gelöscht.
Nutzen Sie runawk online über die Dienste von onworks.net