Awk: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 15: Zeile 15:
  awk [Optionen] -f Skriptdatei var=wert Datei(en
  awk [Optionen] -f Skriptdatei var=wert Datei(en


Im Terminal könnt Ihr direkt ein Skript angeben oder solch ein Skript in einer Skriptdatei speichern und mit der Option ''-f'' angeben. Auch mehrere ''-f-Skripten'' sind erlaubt. Werte können auch auf der Kommandozeile einer Variablen zugewiesen werden. Das kann ein String- oder numerische Konstante, eine Shellvariable ($''Name'') oder eine Befehlsersetzung ("Befehl") sein - er steht aber erst nach der Ausführung der Anweisung BEGIN zur Verfügung. awk behandelt mehrere Datei(en). Wenn keine angegeben werden/wird, liest awk von der Standardeingabe.
=== Muster und Prozeduren ===
 
''awk''-Skripten bestehen aus Muster und Prozeduren:
Folgende Optionen werden erkannt:
/''Muster''/ { ''Prozedur'' }
'''awk -F'''''fs''  
Beide sind optional. Sollte ''Muster'' fehlen, wird { ''Prozedur'' } auf alle Zeilen angewendet. Fehlt { ''Prozedur'' }, wird die gefundene Zeile ausgegeben. Ein Datensatz bezieht sich auf eine einzelne Zeile einer Datei und Datenfeld auf ein einzelnes Wort bzw. String.  
 
  Muster fehlt:
Setzt das Feldtrennzeichen auf ''fs''. Dies entspricht der awk-internen Variablen FS. Jede Eingabezeile bzw. jeder Datensatz wird durch Whitespace (Leerzeichen oder Tabulatoren) oder ein anderes benutzerdefiniertes Trennzeichen in Felder unterteilt. Die einzelnen Felder werden über die Variablen $1, $2,..., $n angesprochen. $0 bezieht sich auf den gesamten Datensatz.
  awk -F: '{ print $1 }' /etc/passwd
   
Alle Zeilen der Datei werden durchlaufen und das erste Feld (der Username) jeder Zeile ausgegeben.
  '''awk -v''' ''var=Wert''  
 
Der Wert wird der Variablen ''var'' zugewiesen. Dies ermöglicht eine Zuweisung, bevor die Ausführung des Scripts beginnt.


Prozedur fehlt:
awk -F: '/systemd/' /etc/passwd
Alle Zeilen in denen ''systemd'' vorkommt, werden komplett ausgegeben.


=== Beispiel ===
  zusammen:
Um z.B. die ersten drei (durch einen Doppelpunkt getrennten) Felder aller Datensätze jeweils auf einer eigenen Zeile auszugeben, benutzt den folgenden Befehl (als Beispiel):
  awk -F: '/systemd/ { print $1 }' /etc/passwd
  ''fs'' = :
Von allen Zeilen, in denen systemd vorkommt, wird das erste Feld, bzw. String, ausgegeben.
  awk '''-F:''' '{ print $1, $2, $3 }' /etc/passwd
ergibt:
root
x
0
bin
x
1
.
.
.


Die Ausgabe kann natürlich auch in eine Datei umgelenkt werden:
''-F'' ist eine Option von awk mit dem ein ''Feldtrenner'' angeben kann. In den Beispielen war das der Doppelpunkt. awk liest im letzten Fall, bis zum ersten Doppelpunkt und gibt das aus:
awk -F: '{ print $1 }' /etc/passwd > passwd.txt
  systemd-journal-remote
oder mittels Pipe, |, an ein anderes Programm oder aufs Netz weitergegeben werden:
systemd-network
  awk -F: '{ print $1 }' /etc/passwd | sort
systemd-resolve
gibt das Ergebnis sortiert auf der Standardausgabe aus. Oder auch sortiert in eine Datei:
systemd-timesync
  awk -F: '{ print $1 }' /etc/passwd | sort > passwd.txt
  systemd-coredump


 
''awk -F' ' '' würde bis zum ersten Leerzeichen lesen und das ausgeben:
=== Muster und Prozeduren ===
systemd-journal-remote:x:982:982:systemd
''awk''-Skripten bestehen aus Muster und Prozeduren:
systemd-network:x:981:981:systemd
  ''Muster'' { ''Prozedur'' }
systemd-resolve:x:980:980:systemd
Beide sind optional. Sollte ''Muster'' fehlen, wird { ''Prozedur'' } auf alle Zeilen angewendet. Fehlt { ''Prozedur'' }, wird die gefundene Zeile ausgegeben.
  systemd-timesync:x:979:979:systemd
systemd-coredump:x:978:978:systemd


==== Muster ====
==== Muster ====
Zeile 63: Zeile 53:
  END
  END
* ''Ausdrücke'' können Strings (in Anführungszeichen) Zahlen, Operatoren, Funktionen, benutzerdefinierte oder vordefinierte Variablen sein.  
* ''Ausdrücke'' können Strings (in Anführungszeichen) Zahlen, Operatoren, Funktionen, benutzerdefinierte oder vordefinierte Variablen sein.  
* ''Reguläre Ausdrücke'' (englisch regular expression - regex) verwenden u.a. den erweiterten Satz von ''Metazeichen''.
* ''Reguläre Ausdrücke'' (englisch regular expression - regex) verwenden u.a. den erweiterten Satz von ''Metazeichen''.  
* ^ und $ beziehen sich auf den Anfang und das Ende eines Strings und '''nicht''' auf Anfang und Ende einer Zeile. Diese Metazeichen finden nicht einen Zeilenvorschub mitten in einem String.
* Mit dem Muster BEGIN können Prozeduren angegeben werden, die vor der Bearbeitung der ersten Eingabezeile ausgheführt werden
* Mit dem Muster BEGIN können Prozeduren angegeben werden, die vor der Bearbeitung der ersten Eingabezeile ausgheführt werden
* Mit dem Muster END könnt ihr Prozeduren angeben, die nach der Bearbeituing der letzten Eingabezeile ausgeführt werden.
* Mit dem Muster END könnt ihr Prozeduren angeben, die nach der Bearbeituing der letzten Eingabezeile ausgeführt werden.
BEGIN und END können in ''gawk'' mehrfach auftreten.
BEGIN und END können in awk mehrfach auftreten.


==== Prozeduren ====
==== Prozeduren ====
Zeile 76: Zeile 65:
* Steuerflußbefehle
* Steuerflußbefehle
* benutzerdefinierte Funktionen
* benutzerdefinierte Funktionen
Im Terminal könnt Ihr direkt ein Skript angeben oder solch ein Skript in einer Skriptdatei speichern und mit der Option ''-f'' angeben. Auch mehrere ''-f-Skripten'' sind erlaubt. Werte können auch auf der Kommandozeile einer Variablen zugewiesen werden. Das kann ein String- oder numerische Konstante, eine Shellvariable ($''Name'') oder eine Befehlsersetzung ("Befehl") sein - er steht aber erst nach der Ausführung der Anweisung BEGIN zur Verfügung. awk behandelt mehrere Datei(en). Wenn keine angegeben werden/wird, liest awk von der Standardeingabe.
Folgende Optionen werden erkannt:
'''awk -F'''''fs''
Setzt das Feldtrennzeichen auf ''fs''. Dies entspricht der awk-internen Variablen FS. Jede Eingabezeile bzw. jeder Datensatz wird durch Whitespace (Leerzeichen oder Tabulatoren) oder ein anderes benutzerdefiniertes Trennzeichen in Felder unterteilt. Die einzelnen Felder werden über die Variablen $1, $2,..., $n angesprochen. $0 bezieht sich auf den gesamten Datensatz.
'''awk -v''' ''var=Wert''
Der Wert wird der Variablen ''var'' zugewiesen. Dies ermöglicht eine Zuweisung, bevor die Ausführung des Scripts beginnt.
Um z.B. die ersten drei (durch einen Doppelpunkt getrennten) Felder aller Datensätze jeweils auf einer eigenen Zeile auszugeben, benutzt den folgenden Befehl (als Beispiel):
''fs'' = :
awk '''-F:''' '{ print $1 " " $2 " " $3 }' /etc/passwd
ergibt:
root x 0
bin x 1
daemon x 2
mail x 8
etc.
Die Ausgabe kann natürlich auch in eine Datei umgelenkt werden:
awk -F: '{ print $1 }' /etc/passwd > passwd.txt
oder mittels Pipe, |, an ein anderes Programm oder aufs Netz weitergegeben werden:
awk -F: '{ print $1 }' /etc/passwd | sort
gibt das Ergebnis sortiert auf der Standardausgabe aus. Oder auch sortiert in eine Datei:
awk -F: '{ print $1 }' /etc/passwd | sort > passwd.txt


=== Ein paar einfache Beispiele ===
=== Ein paar einfache Beispiele ===
Zeile 92: Zeile 110:
Gibt alle Zeilen aus, die das Muster enthalten:
Gibt alle Zeilen aus, die das Muster enthalten:
  /TABLE/
  /TABLE/
  awk /TABLE/ /pfad-zu/sql-datei
  awk /TABLE/ /pfad_zu/sql_datei
Ausgabe:
Ausgabe:
  DROP TABLE IF EXISTS `cae1_action_logs`;
  DROP TABLE IF EXISTS `cae1_action_logs`;
Zeile 102: Zeile 120:
Gibt das erste Feld aller Zeilen aus, die das Muster enthalten:
Gibt das erste Feld aller Zeilen aus, die das Muster enthalten:
  /sum/ { print $1 }
  /sum/ { print $1 }
  awk '/sum/ { print $1 }' /pfad-zu/quelldatei.c
  awk '/sum/ { print $1 }' /pfad_zu/quelldatei.c
Ausgabe:  
Ausgabe:  
  unsigned
  unsigned
Zeile 113: Zeile 131:
Sucht alle Datensätze, die mehr als n Felder haben:
Sucht alle Datensätze, die mehr als n Felder haben:
  NF > n
  NF > n
  awk 'NF > 7' /pfad-zu/quelldatei.c
  awk 'NF > 7' /pfad_zu/quelldatei.c
Ausgabe:
Ausgabe:
  unsigned long sum = 0, innen = 0, aussen = 0, von = 0, bis = 0;
  unsigned long sum = 0, innen = 0, aussen = 0, von = 0, bis = 0;
Zeile 122: Zeile 140:
Interpretiert die Datensätze als eine Gruppe von Zeilen bis zu einer Leerzeile. Jede Zeile wird so zu einem einzigen Feld:
Interpretiert die Datensätze als eine Gruppe von Zeilen bis zu einer Leerzeile. Jede Zeile wird so zu einem einzigen Feld:
  BEGIN { FS = "\n"; RS = "" }
  BEGIN { FS = "\n"; RS = "" }
  awk 'BEGIN { FS = "\n"; RS = "" } { print $1 }' /pfad-zu/quelldatei.c
  awk 'BEGIN { FS = "\n"; RS = "" } { print $1 }' /pfad_zu/quelldatei.c
Ausgabe:
Ausgabe:
  #include <stdio.h>
  #include <stdio.h>
Zeile 133: Zeile 151:
Gibt die Felder zwei und drei aus, wenn erstes Feld mit dem String int übereinstimmt:
Gibt die Felder zwei und drei aus, wenn erstes Feld mit dem String int übereinstimmt:
  $1 ~ /int/ { print $2, $3 }
  $1 ~ /int/ { print $2, $3 }
  awk '$1 ~ /int/ { print $2, $3 }' /pfad-zu/quelldatei.c
  awk '$1 ~ /int/ { print $2, $3 }' /pfad_zu/quelldatei.c
Ausgabe:
Ausgabe:
  main(char **argv,
  main(char **argv,
Zeile 144: Zeile 162:


Und jetzt das ganze umgekehrt - zuerst $3 dann $2:
Und jetzt das ganze umgekehrt - zuerst $3 dann $2:
  awk '$1 ~ /int/ { print $3, $2 }' /pfad-zu/quelldatei.c
  awk '$1 ~ /int/ { print $3, $2 }' /pfad_zu/quelldatei.c
Ausgabe:
Ausgabe:
  **argv, main(char
  **argv, main(char
Zeile 159: Zeile 177:
   
   
  awk '/print/ { ++x }
  awk '/print/ { ++x }
  END { print x }' /pfad-zu/quelldatei.c
  END { print x }' /pfad_zu/quelldatei.c
Ausgabe:
Ausgabe:
  6
  6
Und noch ein letztes Beispiel - gibt die Felder aller Datensätze/Zeilen in umgekehrter Reihenfolge aus, pro Zeile:
Gibt die Felder aller Datensätze/Zeilen in umgekehrter Reihenfolge aus, pro Zeile:
  {
  {
   for (i = NF; i >= 1; i--)
   for (i = NF; i >= 1; i--)
Zeile 171: Zeile 189:
   for (i = NF; i >= 1; i--)
   for (i = NF; i >= 1; i--)
       print $i
       print $i
  }' /pfad-zu/quelldatei.c
  }' /pfad_zu/quelldatei.c
Ausgabe:
Ausgabe:
  <stdio.h>
  <stdio.h>
Zeile 183: Zeile 201:
  0;
  0;
  etc.
  etc.
Es wird quasi jede Zeile auseinandergenommen.
Diese for-Schleife kann auch in eine Scriptdatei gepackt werden, die dann mit der oben genannten Option -f angeben und ausgeführt wird:
awk -f scriptdatei /pad_zu/quelldatei.c
 
Die Bash hat eine History-Funktion. Das heißt, alles was eingegeben wird, wird in einer Datei namens .bash_history gespeichert. Durch drücken der Cursor-Tasten kommt man zu den vorherigen eingegebenen Befehlen. Mittels des Behfehls history kann man sich die komplette bash_history ausgeben lassen. Vielleicht möchte der ein oder andere ja mal rein aus Spass wissen, welche die am häufigsten benutzten Befehle sind:
history | awk '{ print $2 }' | sort | uniq -c | sort -rn | head
Die Ausgabe von '''history''' wird an '''awk''' geleitet. Der zweite Eintrag der Datei ist der in .bash_history gelistete Befehl. Die Ausgabe von awk wird anschließend mittels '''sort''' sortiert und '''uniq''' löscht doppelte Einträge. Die Option '''-c''' bewirkt, das vor dem Löschen die Einträge gezählt werden. Danach wird die Ausgabe von uniq wieder an sort weitergeleitet. Die Optionen '''-r''', reverse, sorgt für eine absteigende Ausgabe und '''head''' gibt hier die ersten acht zeilen aus.
    82 sudo
    23 ll
    12 sed
    12 print
    12 for
    11 uname
    11 startx
    10 lsblk


=== Noch ein paar wichtige Optionen von awk ===
=== Noch ein paar wichtige Optionen von awk ===

Version vom 21. Februar 2021, 02:07 Uhr

„Awk“ wurde von Knoppi (Diskussion) als in Bearbeitung markiert. Um Bearbeitungskonflikte zu vermeiden, kontaktiere Knoppi (Diskussion) bitte, bevor du den Artikel bearbeitest.


awk ist eine Programmiersprache, bzw. Programm, zur Dateibearbeitung, Analyse und Auswertung von Texten auf der Grundlage von Mustererkennung, regular expressions (regex). Es bearbeitet hauptsächlich Zeichenketten, Strings. Dafür besteht in awk die Möglichkeit z.B. Verzweigungen und Schleifen, auch in selbstdefinierten Funktionen zu programmieren. Der Name ist aus den Anfangsbuchstaben der Nachnamen der drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernigham zusammengesetzt.

Awk gibt es seit Unix Version 3 - 1977. 1984 wurde von den selben Autoren eine neuere Version, nawk, herausgebracht. Die Version hier auf Archlinux basiert auf gawk von GNU, 1989.

Installation

Das Programm ist als awk in core verfügbar, und kann von dort mittels Pacman installiert werden.

pacman -S awk

Da awk im core-Paket ist, sollte es direkt zur Verfügung stehen, so dass es nicht mehr explizit installiert werden muss.

Verwendung

Die Syntax zum Starten von awk hat zwei Formen:

awk [Optionen] 'Skript' var=wert Datei(en)
awk [Optionen] -f Skriptdatei var=wert Datei(en

Muster und Prozeduren

awk-Skripten bestehen aus Muster und Prozeduren:

/Muster/ { Prozedur }

Beide sind optional. Sollte Muster fehlen, wird { Prozedur } auf alle Zeilen angewendet. Fehlt { Prozedur }, wird die gefundene Zeile ausgegeben. Ein Datensatz bezieht sich auf eine einzelne Zeile einer Datei und Datenfeld auf ein einzelnes Wort bzw. String.

Muster fehlt:
awk -F: '{ print $1 }' /etc/passwd

Alle Zeilen der Datei werden durchlaufen und das erste Feld (der Username) jeder Zeile ausgegeben.

Prozedur fehlt:
awk -F: '/systemd/' /etc/passwd

Alle Zeilen in denen systemd vorkommt, werden komplett ausgegeben.

zusammen:
awk -F: '/systemd/ { print $1 }' /etc/passwd

Von allen Zeilen, in denen systemd vorkommt, wird das erste Feld, bzw. String, ausgegeben.

-F ist eine Option von awk mit dem ein Feldtrenner angeben kann. In den Beispielen war das der Doppelpunkt. awk liest im letzten Fall, bis zum ersten Doppelpunkt und gibt das aus:

systemd-journal-remote
systemd-network
systemd-resolve
systemd-timesync
systemd-coredump

awk -F' ' würde bis zum ersten Leerzeichen lesen und das ausgeben:

systemd-journal-remote:x:982:982:systemd
systemd-network:x:981:981:systemd
systemd-resolve:x:980:980:systemd
systemd-timesync:x:979:979:systemd
systemd-coredump:x:978:978:systemd

Muster

Folgende Formen können Muster sein:

/regulärer Ausdruck/
Ausdruck für einen Vergleich
Ausdruck zur Mustererkennung
BEGIN
END
  • Ausdrücke können Strings (in Anführungszeichen) Zahlen, Operatoren, Funktionen, benutzerdefinierte oder vordefinierte Variablen sein.
  • Reguläre Ausdrücke (englisch regular expression - regex) verwenden u.a. den erweiterten Satz von Metazeichen.
  • Mit dem Muster BEGIN können Prozeduren angegeben werden, die vor der Bearbeitung der ersten Eingabezeile ausgheführt werden
  • Mit dem Muster END könnt ihr Prozeduren angeben, die nach der Bearbeituing der letzten Eingabezeile ausgeführt werden.

BEGIN und END können in awk mehrfach auftreten.

Prozeduren

Prozeduren bestehen aus einem oder mehreren Befehlen, Funktionen oder Variablenanweisungen. Sie werden durch Zeilenumbrüche oder Semikola voneinander getrennt und in geschweiften Klammern eingeschlossen. Es gibt fünf verschiedene Gruppen der Befehle:

  • Variablen- oder Arrayanweisungen
  • Ein- und Ausgabebefehle
  • integrierte Funktionen
  • Steuerflußbefehle
  • benutzerdefinierte Funktionen


Im Terminal könnt Ihr direkt ein Skript angeben oder solch ein Skript in einer Skriptdatei speichern und mit der Option -f angeben. Auch mehrere -f-Skripten sind erlaubt. Werte können auch auf der Kommandozeile einer Variablen zugewiesen werden. Das kann ein String- oder numerische Konstante, eine Shellvariable ($Name) oder eine Befehlsersetzung ("Befehl") sein - er steht aber erst nach der Ausführung der Anweisung BEGIN zur Verfügung. awk behandelt mehrere Datei(en). Wenn keine angegeben werden/wird, liest awk von der Standardeingabe.

Folgende Optionen werden erkannt:

awk -Ffs 

Setzt das Feldtrennzeichen auf fs. Dies entspricht der awk-internen Variablen FS. Jede Eingabezeile bzw. jeder Datensatz wird durch Whitespace (Leerzeichen oder Tabulatoren) oder ein anderes benutzerdefiniertes Trennzeichen in Felder unterteilt. Die einzelnen Felder werden über die Variablen $1, $2,..., $n angesprochen. $0 bezieht sich auf den gesamten Datensatz.

awk -v var=Wert 

Der Wert wird der Variablen var zugewiesen. Dies ermöglicht eine Zuweisung, bevor die Ausführung des Scripts beginnt. Um z.B. die ersten drei (durch einen Doppelpunkt getrennten) Felder aller Datensätze jeweils auf einer eigenen Zeile auszugeben, benutzt den folgenden Befehl (als Beispiel):

fs = :
awk -F: '{ print $1 " " $2 " " $3 }' /etc/passwd

ergibt:

root x 0
bin x 1
daemon x 2
mail x 8
etc.

Die Ausgabe kann natürlich auch in eine Datei umgelenkt werden:

awk -F: '{ print $1 }' /etc/passwd > passwd.txt

oder mittels Pipe, |, an ein anderes Programm oder aufs Netz weitergegeben werden:

awk -F: '{ print $1 }' /etc/passwd | sort

gibt das Ergebnis sortiert auf der Standardausgabe aus. Oder auch sortiert in eine Datei:

awk -F: '{ print $1 }' /etc/passwd | sort > passwd.txt

Ein paar einfache Beispiele

Gibt das erste Feld jeder Zeile aus:

{ print $1 }
awk -F: '{ print $1 }' /etc/passwd

Ausgabe:

root
bin
daemon
mail
ftp
http
etc.

Gibt alle Zeilen aus, die das Muster enthalten:

/TABLE/
awk /TABLE/ /pfad_zu/sql_datei

Ausgabe:

DROP TABLE IF EXISTS `cae1_action_logs`;
CREATE TABLE `cae1_action_logs` (
DROP TABLE IF EXISTS `cae1_action_logs_extensions`;
CREATE TABLE `cae1_action_logs_extensions` (
etc.

Gibt das erste Feld aller Zeilen aus, die das Muster enthalten:

/sum/ { print $1 }
awk '/sum/ { print $1 }' /pfad_zu/quelldatei.c

Ausgabe:

unsigned
sum
sum
if(sum
if(sum
printf("%lu\n",

Sucht alle Datensätze, die mehr als n Felder haben:

NF > n
awk 'NF > 7' /pfad_zu/quelldatei.c

Ausgabe:

unsigned long sum = 0, innen = 0, aussen = 0, von = 0, bis = 0;
 printf("\n\n\n\nDie vollkommenen Zahlen von %lu bis %lu sind\n\n", von, bis);
  for(aussen = von; aussen <= bis; aussen++) {
   for(innen = 1; innen <= aussen/2; innen++) {

Interpretiert die Datensätze als eine Gruppe von Zeilen bis zu einer Leerzeile. Jede Zeile wird so zu einem einzigen Feld:

BEGIN { FS = "\n"; RS = "" }
awk 'BEGIN { FS = "\n"; RS = "" } { print $1 }' /pfad_zu/quelldatei.c

Ausgabe:

#include <stdio.h>
int main(char **argv, int argc) {
 printf("\n\n\nErmittlung von vollkommenen Zahlen\n");
 printf("\nVollkommene Zahlen von ? ");
 printf("\n\n\n\nDie vollkommenen Zahlen von %lu bis %lu sind\n\n", von, bis);
  for(aussen = von; aussen <= bis; aussen++) {

Gibt die Felder zwei und drei aus, wenn erstes Feld mit dem String int übereinstimmt:

$1 ~ /int/ { print $2, $3 }
awk '$1 ~ /int/ { print $2, $3 }' /pfad_zu/quelldatei.c

Ausgabe:

main(char **argv,
von vollkommenen
 
Zahlen von
Zahlen bis
vollkommenen Zahlen
sum); 

Und jetzt das ganze umgekehrt - zuerst $3 dann $2:

awk '$1 ~ /int/ { print $3, $2 }' /pfad_zu/quelldatei.c

Ausgabe:

**argv, main(char
vollkommenen von
 
von Zahlen
bis Zahlen
Zahlen vollkommenen
 sum);

Zählt die Anzahl der gefundenen Muster und gibt das Ergebnis aus:

/print/ { ++x }
END { print x }

awk '/print/ { ++x }
END { print x }' /pfad_zu/quelldatei.c

Ausgabe:

6

Gibt die Felder aller Datensätze/Zeilen in umgekehrter Reihenfolge aus, pro Zeile:

{
  for (i = NF; i >= 1; i--)
    print $i
}

awk '{
  for (i = NF; i >= 1; i--)
     print $i
}' /pfad_zu/quelldatei.c

Ausgabe:

<stdio.h>
#include
{
argc)
int
**argv,
main(char
int
0;
etc.

Diese for-Schleife kann auch in eine Scriptdatei gepackt werden, die dann mit der oben genannten Option -f angeben und ausgeführt wird:

awk -f scriptdatei /pad_zu/quelldatei.c

Die Bash hat eine History-Funktion. Das heißt, alles was eingegeben wird, wird in einer Datei namens .bash_history gespeichert. Durch drücken der Cursor-Tasten kommt man zu den vorherigen eingegebenen Befehlen. Mittels des Behfehls history kann man sich die komplette bash_history ausgeben lassen. Vielleicht möchte der ein oder andere ja mal rein aus Spass wissen, welche die am häufigsten benutzten Befehle sind:

history | awk '{ print $2 }' | sort | uniq -c | sort -rn | head

Die Ausgabe von history wird an awk geleitet. Der zweite Eintrag der Datei ist der in .bash_history gelistete Befehl. Die Ausgabe von awk wird anschließend mittels sort sortiert und uniq löscht doppelte Einträge. Die Option -c bewirkt, das vor dem Löschen die Einträge gezählt werden. Danach wird die Ausgabe von uniq wieder an sort weitergeleitet. Die Optionen -r, reverse, sorgt für eine absteigende Ausgabe und head gibt hier die ersten acht zeilen aus.

    82 sudo
    23 ll
    12 sed
    12 print
    12 for
    11 uname
    11 startx
    10 lsblk

Noch ein paar wichtige Optionen von awk

Awk verfügt über eine große Anzahl Optionen. Im folgenden werden ein paar aufgeführt, die öfters benutzt werden.

-d --dump-variable[=Datei]

Nach der Ausführung des Programms wird eine sortierte Liste der Globalen Variablen, ihrer Typen und ihrer letzten Werte in Datei ausgegeben. Wird keine Datei angegeben, ist die Vorgabe awkvars.out.

-g --gen-po

Liest das awk-Programm und gibt alle Strings, die als übersetzbar markiert wurden, in Form einer GNU gettext Portable Object-Datei auf die Standardausgabe aus.

-h --help

Gibt eine Anwenderbeschreibung auf der Konsole aus.

-L --lint[=fatal]

Aktiviert die Prüfung auf nicht portable oder zweifelhafte Konstrukte, sowohl wenn das Programm gelesen wird, als auch während der Ausführung. Mit dem Argument fatal werden die lint-Warnungen fatale Fehler.

-p --profile[=Datei]

awk gibt eine formatierte ("prettyprinted") Version des Programms in die Datei aus. Die Voereinstellung ist awk-prof.out.

-P --posix

Schaltet die strikte POSIX-Portabilität an, bei der weder gebräuchliche noch gawk-spezifische Erweiterungen zulässig sind.

-e  'Programmtext'  --source[= 'Programmtext' ]

Programmtext wird als Quellcode für awk verwendet. Mit der Option -f könnt ihr diese Option einsetzen, um Kommandozeilenprogramme mit awk-Bibliotheken zu mischen.

-c --traditional

Alle gawk-spezifischen Erweiterungen werden abgeschaltet, aber gebräuchliche Erweiterungen erlaubt (z.B. der **-Operator für die Exponentierung)

Weblinks