GNU/Linux >> LINUX-Kenntnisse >  >> Linux

8 leistungsstarke integrierte Awk-Variablen – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

Dieser Artikel ist Teil der fortlaufenden Reihe von Awk-Tutorial-Beispielen. Awk hat mehrere leistungsstarke eingebaute Variablen. Es gibt zwei Arten von eingebauten Variablen in Awk.

  1. Variable, die Werte definiert, die geändert werden können, wie z. B. Feldtrennzeichen und Datensatztrennzeichen.
  2. Variable, die für Verarbeitung und Berichte verwendet werden kann, z. B. Anzahl der Datensätze, Anzahl der Felder.

1. Awk FS Beispiel:Eingabefeld-Trennvariable.

Awk liest und analysiert standardmäßig jede Zeile aus der Eingabe basierend auf Leerzeichen und setzt die Variablen $1, $2 usw. Die Awk FS-Variable wird verwendet, um das Feldtrennzeichen für jeden Datensatz festzulegen. Awk FS kann auf jedes einzelne Zeichen oder jeden regulären Ausdruck gesetzt werden. Sie können das Trennzeichen für Eingabefelder mit einer der beiden folgenden Optionen verwenden:

  1. Mit der Befehlszeilenoption -F.
  2. Awk FS kann wie eine normale Variable gesetzt werden.
Syntax:

$ awk -F 'FS' 'commands' inputfilename

(or)

$ awk 'BEGIN{FS="FS";}'
  • Awk FS ist ein einzelnes Zeichen oder ein regulärer Ausdruck, den Sie als Trennzeichen für Eingabefelder verwenden möchten.
  • Awk FS beliebig oft geändert werden kann, behält es seine Werte, bis es explizit geändert wird. Wenn Sie das Feldtrennzeichen ändern möchten, ist es besser, dies zu ändern, bevor Sie die Zeile lesen. Diese Änderung wirkt sich also auf die Zeile aus, die Sie lesen.

Hier ist ein awk FS-Beispiel zum Lesen der /etc/passwd-Datei mit „:“ als Feldtrennzeichen.

$ cat etc_passwd.awk
BEGIN{
FS=":";
print "Name\tUserID\tGroupID\tHomeDirectory";
}
{
	print $1"\t"$3"\t"$4"\t"$6;
}
END {
	print NR,"Records Processed";
}
$awk -f etc_passwd.awk /etc/passwd
Name    UserID  GroupID        HomeDirectory
gnats	41	41	/var/lib/gnats
libuuid	100	101	/var/lib/libuuid
syslog	101	102	/home/syslog
hplip	103	7	/var/run/hplip
avahi	105	111	/var/run/avahi-daemon
saned	110	116	/home/saned
pulse	111	117	/var/run/pulse
gdm	112	119	/var/lib/gdm
8 Records Processed

2. Awk OFS-Beispiel:Ausgabefeld-Trennvariable

Awk OFS ist ein Ausgabeäquivalent der awk FS-Variablen. Standardmäßig ist awk OFS ein einzelnes Leerzeichen. Es folgt ein awk-OFS-Beispiel.

$ awk -F':' '{print $3,$4;}' /etc/passwd
41 41
100 101
101 102
103 7
105 111
110 116
111 117
112 119

Concatenator in der print-Anweisung „“, verkettet zwei Parameter mit einem Leerzeichen, das standardmäßig der Wert von awk OFS ist. Der Awk OFS-Wert wird also wie unten gezeigt zwischen die Felder in der Ausgabe eingefügt.

$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd
41=41
100=101
101=102
103=7
105=111
110=116
111=117
112=119

3. Awk RS Beispiel:Record Separator-Variable

Awk RS definiert eine Linie. Awk liest standardmäßig Zeile für Zeile.

Nehmen wir an, Schülernoten werden in einer Datei gespeichert, alle Datensätze werden durch doppelte neue Zeilen getrennt, und alle Felder werden durch ein Zeilenumbruchzeichen getrennt.

$cat student.txt
Jones
2143
78
84
77

Gondrol
2321
56
58
45

RinRao
2122
38
37
65

Edwin
2537
78
67
45

Dayan
2415
30
47
20

Jetzt druckt das folgende Awk-Skript den Schülernamen und die Rollnummer aus der obigen Eingabedatei.

$cat student.awk
BEGIN {
	RS="\n\n";
	FS="\n";

}
{
	print $1,$2;
}

$ awk -f student.awk  student.txt
Jones 2143
Gondrol 2321
RinRao 2122
Edwin 2537
Dayan 2415

Im Skript student.awk liest es jedes Schülerdetail als einen einzelnen Datensatz, da awk RS einem doppelten Zeilenumbruchzeichen zugewiesen wurde und jede Zeile in einem Datensatz ein Feld ist, da FS ein Zeilenumbruchzeichen ist.

4. Awk ORS-Beispiel:Datensatztrennvariable ausgeben

Awk ORS ist ein Ausgangsäquivalent von RS. Jeder Datensatz in der Ausgabe wird mit diesem Trennzeichen gedruckt. Es folgt ein awk-ORS-Beispiel:

$  awk 'BEGIN{ORS="=";} {print;}' student-marks
Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=

Im obigen Skript wird jeder Datensatz in der Datei mit den Schülernoten durch das Zeichen „=“ getrennt.

5. Awk NR-Beispiel:Anzahl der Datensätze variabel

Awk NR gibt Ihnen die Gesamtzahl der verarbeiteten Datensätze oder die Zeilennummer an. Im folgenden awk NR-Beispiel hat die NR-Variable die Zeilennummer, im END-Abschnitt gibt awk NR die Gesamtzahl der Datensätze in einer Datei an.

$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks
Processing Record -  1
Processing Record -  2
Processing Record -  3
Processing Record -  4
Processing Record -  5
5 Students Records are processed

6. Awk NF Beispiel:Anzahl der Felder in einem Datensatz

Awk NF gibt Ihnen die Gesamtzahl der Felder in einem Datensatz. Awk NF ist sehr nützlich, um zu überprüfen, ob alle Felder in einem Datensatz vorhanden sind.

Sehen wir uns die Datei mit den Schülernoten an, Test3-Punktzahl fehlt für die Schüler, wie unten gezeigt.

$cat student-marks
Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37
Edwin 2537 78 67 45
Dayan 2415 30 47

Das folgende Awk-Skript gibt die Nummer des Datensatzes (Zeile) und die Anzahl der Felder in diesem Datensatz aus. Es ist also sehr einfach herauszufinden, dass der Test3-Score fehlt.

$ awk '{print NR,"->",NF}' student-marks
1 -> 5
2 -> 5
3 -> 4
4 -> 5
5 -> 4

7. Awk FILENAME Beispiel:Name der aktuellen Eingabedatei

Die Variable FILENAME gibt den Namen der gelesenen Datei an. Awk kann eine Anzahl von zu verarbeitenden Eingabedateien akzeptieren.

$ awk '{print FILENAME}' student-marks
student-marks
student-marks
student-marks
student-marks
student-marks

Im obigen Beispiel wird der DATEINAME, d. h. die Schülernoten, für jeden Datensatz der Eingabedatei ausgegeben.

8. Awk FNR Beispiel:Anzahl der Datensätze relativ zur aktuellen Eingabedatei

Wenn awk aus der Mehrfacheingabedatei liest, gibt die awk NR-Variable die Gesamtzahl der Datensätze relativ zu allen Eingabedateien an. Awk FNR gibt Ihnen die Anzahl der Datensätze für jede Eingabedatei.

$ awk '{print FILENAME, FNR;}' student-marks bookdetails
student-marks 1
student-marks 2
student-marks 3
student-marks 4
student-marks 5
bookdetails 1
bookdetails 2
bookdetails 3
bookdetails 4
bookdetails 5

Wenn Sie im obigen Beispiel anstelle von awk FNR awk NR verwenden, erhalten Sie für die Datei bookdetails 6 bis 10 für jeden Datensatz.

Empfohlene Lektüre

Sed- und Awk-101-Hacks, von Ramesh Natarajan . Ich verbringe mehrere Stunden am Tag in einer UNIX/Linux-Umgebung mit dem Umgang mit Textdateien (Daten-, Konfigurations- und Protokolldateien). Ich verwende Sed und Awk für alle meine Textbearbeitungsarbeiten. Basierend auf meiner Sed- und Awk-Erfahrung habe ich das Sed and Awk 101 Hacks eBook geschrieben, das 101 praktische Beispiele zu verschiedenen erweiterten Funktionen von Sed und Awk enthält, die Ihr UNIX / Linux-Leben verbessern werden. Auch wenn Sie Sed und Awk seit mehreren Jahren verwenden und dieses Buch noch nicht gelesen haben, tun Sie sich bitte einen Gefallen und lesen Sie dieses Buch. Sie werden von den Möglichkeiten der Dienstprogramme Sed und Awk begeistert sein.


Linux
  1. Eine Anleitung für Anfänger zum gawk

  2. Awk-Tutorial:Awk-Variablen verstehen mit 3 praktischen Beispielen

  3. 4 Beispiele für Awk-If-Anweisungen ( if, if else, if else if, :? )

  4. 7 Beispiele für leistungsstarke Awk-Operatoren (Unäre, Binäre, Arithmetische, String-, Zuweisungs-, Bedingungs-, Reg-Ex-Awk-Operatoren)

  5. 9 leistungsstarke integrierte Awk-Funktionen für Zahlen

So zeichnen Sie Screencasts in GNOME 3 auf

AWK-Befehl in Linux mit Beispielen

Awk-Befehl unter Linux

Linux-Umgebungsvariablen

Erklärung zum awk-Befehl mit ORS, NR, FS, RS

Verwenden von grep vs. awk