Nützliche AWK-Einzeiler, um griffbereit zu bleiben

Awk ist ein sehr leistungsfähiges und praktisches Werkzeug, das für die erweiterte Textverarbeitung entwickelt wurde. Es durchsucht und scannt eine Datei Zeile für Zeile, teilt jede Eingabezeile in Felder auf, vergleicht die Eingabezeile oder -felder mit dem Muster und führt eine Aktion bei übereinstimmenden Zeilen aus. Im Allgemeinen wird es verwendet, um Datendateien umzuwandeln und formatierte Berichte zu erstellen.

In diesem Tutorial zeigen wir einige fortgeschrittene und praktische awk-Einzeiler-Beispiele, die für die Durchführung des täglichen Betriebs nützlich sind.

Textkonvertierung

In diesem Abschnitt erfahren Sie, wie Sie die Funktion sub und gsub mit dem Befehl awk verwenden, um Tabulatoren und Leerzeichen in der Datei zu löschen.

Als Eingabedatei für alle Beispiele in diesem Artikel verwenden wir folgende Textdatei:

cat > contents.txt

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Alle leeren Zeilen aus einer Datei löschen

Sie können den Befehl awk mit spezieller NF-Variable verwenden, um alle Leerzeilen aus der Datei zu löschen.

Für example, löschen Sie alle leeren Zeilen aus der Datei content.txt und führen Sie den folgenden Befehl aus:

awk NF contents.txt

Sie sollten die folgende Ausgabe sehen:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Sie können dasselbe auch mit dem folgenden Befehl ausführen:

awk '/./' /contents.txt

Löschen Sie führende Leerzeichen und Tabulatoren am Anfang jeder Zeile

Sie können den Befehl awk verwenden, um ein oder mehrere Leerzeichen oder Tabulatoren am Anfang der Datei zu finden und sie zu löschen.

Führen Sie den folgenden Befehl aus, um führende Leerzeichen aus der Datei namens content.txt zu löschen

awk '{ sub(/^[ t]+/, ""); print }' contents.txt

Sie sollten die folgende Ausgabe sehen:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Löschen Sie nachgestellte Leerzeichen und Tabulatoren am Ende jeder Zeile

Sie können am Ende jeder Zeile in der Datei ein oder mehrere Leerzeichen oder Tabulatoren finden und diese löschen.

Führen Sie den folgenden Befehl aus, um das Leerzeichen und den Tabulator am Ende jeder Zeile in der Datei content.txt zu löschen

awk '{ sub(/[ t]+$/, ""); print }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Löschen Sie sowohl führende als auch nachgestellte Leerzeichen aus jeder Zeile

Sie können auch führende und nachgestellte Leerzeichen aus jeder Zeile löschen, indem Sie den einzelnen Befehl verwenden, wie unten gezeigt:

awk '{ gsub(/^[ t]+|[ t]+$/, ""); print }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Umgekehrte Reihenfolge der Zeilen

Dies ist ein sehr beliebter und sehr nützlicher Einzeiler, der alle Zeilen in einem Array aufzeichnet und in umgekehrter Reihenfolge anordnet.

Führen Sie diesen awk-Einzeiler aus, um alle Zeilen in der Datei content.txt in umgekehrter Reihenfolge anzuordnen:

awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

deep clerk sales 20000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
bhavesh engineer sales 30000

vyom manager purchase 20000
jayesh director account 25000
hitesh engineer sales 30000

Umgekehrte Reihenfolge der Felder in jeder Zeile

Sie können den Befehl awk mit der Variablen NF verwenden, um jedes Feld in jeder Zeile in umgekehrter Reihenfolge anzuordnen.

awk '{ for (i=NF; i>0; i--) printf("%s ", $i); printf ("n") }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

30000 sales engineer hitesh
25000 account director jayesh
20000 purchase manager vyom

30000 sales engineer bhavesh
40000 sales directory rajesh
20000 account clerk niraj
23000 purchase peon jay
20000 sales clerk deep

Aufeinanderfolgende doppelte Zeilen entfernen

Führen Sie den folgenden Befehl aus, um aufeinanderfolgende doppelte Zeilen aus der Datei zu entfernen:

awk 'a != $0; { a = $0 }' contents.txt

Nicht aufeinanderfolgende doppelte Zeilen entfernen

Führen Sie den folgenden Befehl aus, um nicht aufeinanderfolgende doppelte Zeilen aus der Datei zu entfernen:

awk '!a[$0]++' contents.txt

Nummerierung und Berechnungen

In diesem Abschnitt erfahren Sie, wie Sie FN- und NR-Variablen mit dem Befehl awk verwenden. Es wird für die Verarbeitung und Berichte verwendet, z. B. Anzahl Datensätze, Anzahl Felder.

Alle Zeilen in einer Datei nummerieren

Sie können alle Zeilen in einer bestimmten Datei mit dem folgenden Befehl nummerieren:

awk '{ print NR "t" $0 }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4
5 bhavesh engineer sales 30000
6 rajesh directory sales 40000
7 niraj clerk account 20000
8 jay peon purchase 23000
9 deep clerk sales 20000

Zahlenlinien auf schicke Weise

Um alle Zeilen in einer bestimmten Datei in einem ausgefallenen Format zu nummerieren, führen Sie den folgenden Befehl aus:

awk '{ printf("%5d : %sn", NR, $0) }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

1 : hitesh engineer sales 30000
2 : jayesh director account 25000
3 : vyom manager purchase 20000
4 :
5 : bhavesh engineer sales 30000
6 : rajesh directory sales 40000
7 : niraj clerk account 20000
8 : jay peon purchase 23000
9 : deep clerk sales 20000

Nur nicht leere Zeilen in Dateien nummerieren

Mit dem folgenden Befehl können Sie nur nicht leere Zeilen nummerieren:

awk 'NF { $0=++a " :" $0 }; { print }' contents.txt

Sie sollten die folgende Ausgabe erhalten:

1 : hitesh engineer sales 30000
2 :jayesh director account 25000
3 :vyom manager purchase 20000

4 :bhavesh engineer sales 30000
5 : rajesh directory sales 40000
6 :niraj clerk account 20000
7 :jay peon purchase 23000
8 :deep clerk sales 20000

Anzahl der Zeilen drucken, die eine bestimmte Zeichenfolge enthalten

Sie können die Gesamtzahl der Zeilen mit dem Wort Engineer mit dem folgenden Befehl drucken:

awk '/engineer/{n++}; END {print n+0}' contents.txt

Sie sollten die folgende Ausgabe erhalten:

2

Reguläre Ausdrücke

In diesem Abschnitt zeigen wir Ihnen, wie Sie reguläre Ausdrücke mit dem Befehl awk verwenden, um Text oder Zeichenfolgen in Dateien zu filtern.

Zeilen ausgeben, die der angegebenen Zeichenfolge entsprechen

Führen Sie den folgenden Befehl aus, um alle Zeilen zu drucken, die dem String Engineer in der Datei content.txt entsprechen:

awk '/engineer/' contents.txt

Sie sollten die folgende Ausgabe erhalten:

hitesh engineer sales 30000
bhavesh engineer sales 30000

Zeilen drucken, die nicht mit der angegebenen Zeichenfolge übereinstimmen

Um alle Zeilen zu drucken, die nicht mit der Zeichenfolge ‘jayesh’ in der Datei content.txt übereinstimmen, führen Sie den folgenden Befehl aus:

awk '!/jayesh/' contents.txt

Sie sollten die folgende Ausgabe erhalten:

hitesh engineer sales 30000
vyom manager purchase 20000

bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Zeile vor der passenden Zeichenfolge drucken

Um die Zeile vor der passenden Zeichenfolge ‘rajesh’ zu drucken, führen Sie den folgenden Befehl aus:

awk '/rajesh/{print x};{x=$0}' contents.txt

Sie sollten die folgende Ausgabe erhalten:

bhavesh engineer sales 30000

Zeile nach der übereinstimmenden Zeichenfolge drucken

Um die Zeile nach der übereinstimmenden Zeichenfolge ‘rajesh’ zu drucken, führen Sie den folgenden Befehl aus:

awk '/account/{getline; print}' contents.txt

Sie sollten die folgende Ausgabe erhalten:

vyom manager purchase 20000
jay peon purchase 23000

Auswechslung

In diesem Abschnitt zeigen wir Ihnen, wie Sie den Befehl awk verwenden, um eine Datei nach einer bestimmten Zeichenfolge zu durchsuchen und sie durch die gewünschte Zeichenfolge zu ersetzen.

String durch Andere ersetzen

Um eine Zeichenfolge ‘engineer’ durch ‘doctor’ in der content.txt zu ersetzen, führen Sie den folgenden Befehl aus:

awk '{gsub(/engineer/, "doctor")};{print}' contents.txt

Sie sollten die folgende Ausgabe erhalten:

hitesh doctor sales 30000
jayesh director account 25000
vyom manager purchase 20000

bhavesh doctor sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Suchen Sie die Zeichenfolge ‘jayesh’, ‘hitesh’ oder ‘bhavesh’ und ersetzen Sie sie durch die Zeichenfolge ‘mahesh’, führen Sie den folgenden Befehl aus:

awk '{gsub(/jayesh|hitesh|bhavesh/,"mahesh");print}' contents.txt

Sie sollten die folgende Ausgabe erhalten:

mahesh engineer sales 30000
mahesh director account 25000
vyom manager purchase 20000

mahesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

Finden Sie freien Speicherplatz mit dem Gerätenamen

Sie können den Befehl awk mit df verwenden, um nur den Gerätenamen und den von jedem Gerät belegten Speicherplatz zu suchen und anzuzeigen.

Führen Sie dazu den folgenden Befehl aus:

df -h | awk '{print $1, $4}'

Sie sollten die folgende Ausgabe erhalten:

Filesystem Avail
/dev/sda1 235G
none 4.0K
udev 1.9G
tmpfs 377M
none 5.0M
none 1.5G
none 100M
/dev/sda5 135G
/dev/loop0 0
/dev/loop1 0
/dev/loop2 0
/dev/loop4 0

Finden Sie die Anzahl der offenen Verbindungen pro IP

Dieser awk One-Liner ist sehr nützlich, wenn Sie glauben, dass Ihr Server angegriffen wird. Es druckt eine Liste der offenen Verbindungen zu Ihrem Server aus und sortiert sie nach Anzahl.

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Sie sollten die Liste aller offenen Verbindungen zu Ihrem Server nach Anzahl erhalten:

18 103.132.192.30
12 104.18.12.5
11 104.18.5.23
9 104.244.42.3
1 104.244.42.5
1 127.0.0.1

Fazit

Wie Sie sehen, haben wir das Einzeiler-Kommando awk anhand praktischer Beispiele kennengelernt. Ich hoffe, dies hilft Ihnen, Ihre täglichen Aufgaben zu erfüllen.