Heim >php教程 >PHP开发 >Detaillierte Erklärung des awk-Befehls

Detaillierte Erklärung des awk-Befehls

高洛峰
高洛峰Original
2016-12-15 10:36:231355Durchsuche

Detaillierte Erklärung des Befehls awk

Einfache Verwendung:

awk: Operationen für jede Zeile einer Datei ausführen.

awk -F: '{print $1,$4}': Verwenden Sie ':', um diese Zeile zu teilen und das erste und vierte Feld dieser Zeile auszudrucken.

Detaillierte Einführung:

AWK-Befehlseinführung

Die grundlegendste Funktion der AWK-Sprache ist Durchsuchen und Extrahieren von Informationen basierend auf angegebenen Regeln in Dateien oder Zeichenfolgen. Erst nachdem awk Informationen extrahiert hat, können andere Textoperationen normalerweise zum Formatieren von Informationen in Textdateien verwendet werden

1. Rufen Sie awk auf:

Die erste Befehlszeilenmethode, wie zum Beispiel:

awk [-Field-separator] 'commands' input- Datei(en)

Die Befehle hier sind die echten awk-Befehle, [-F Domänentrennzeichen] ist optional, awk verwendet standardmäßig Leerzeichen zur Trennung, wenn Sie also durchsuchen möchten, gibt es sie Leerzeichen zwischen Domänen Es ist nicht notwendig, diese Option anzugeben, aber wenn Sie eine Datei wie passwd durchsuchen und jedes Feld dieser Datei einen Doppelpunkt als Trennzeichen verwendet, müssen Sie die Option -F verwenden: awk -F : 'commands' Eingabedatei

Zweitens fügen Sie alle awk-Befehle in eine Datei ein, machen das awk-Programm ausführbar und verwenden dann den awk-Befehlsinterpreter als erste Zeile des Skripts, damit Sie ihn aufrufen können Geben Sie dazu den Skriptnamen

ein. Drittens fügen Sie alle awk-Befehle in eine separate Datei ein und rufen dann Folgendes auf:

awk -f awk-script-file input-file

-f Option gibt das awk-Skript in der Datei awk-script-file an, input-file ist der Dateiname, der mit awk

2. awk-Skript:

Das awk-Skript besteht aus verschiedenen Operationen und Modi. Der Standardwert ist ein Leerzeichen . Der gelesene Inhalt wird der Reihe nach in das entsprechende Feld eingefügt. Lesen Sie den Datensatz bis zum Ende der Datei auf

2.1

Jede awk-Anweisung besteht aus Modi und Aktionen. In einem awk-Skript können viele Anweisungen enthalten sein. Der Modusteil bestimmt, wann Aktionsanweisungen ausgelöst werden und Ereignisse auslösen. Aktionen sind Operationen an Daten. Wenn der Musterteil weggelassen wird, bleibt die Aktion jederzeit in Ausführung.

Das Muster kann eine beliebige bedingte Anweisung oder zusammengesetzte Anweisung oder ein regulärer Ausdruck sein enthält zwei spezielle Felder BEGIN und END. Verwenden Sie die BEGIN-Anweisung, um die Anzahl und den Druckkopf festzulegen. Die BEGIN-Anweisung wird vor jeder Text-Browsing-Aktion verwendet, und dann wird die Text-Browsing-Aktion basierend auf der END-Anweisung ausgeführt Um die Gesamtzahl der Texte auszudrucken, nachdem awk die Aktion zum Durchsuchen von Texten abgeschlossen hat, müssen die Aktionen in {} eingeschlossen werden.

Die tatsächliche Aktion wird in geschweiften Klammern {} angegeben. Dies wird häufig zum Drucken von Aktionen verwendet, es gibt jedoch auch längere Codes wie if- und Schleifenanweisungen und Schleifenausgänge usw. Wenn Sie nicht angeben, welche Aktion ausgeführt werden soll, druckt awk standardmäßig alle durchsuchten Datensätze aus

2.2. Domänen und Datensätze:

Wenn awk ausgeführt wird, sind seine Browsing-Tags $1, $2...$n. Diese Methode wird als Domänen-Tagging bezeichnet. Verwenden Sie $1 und $3, um auf das erste und dritte Feld zu verweisen. Beachten Sie, dass Kommas zur Trennung der Felder verwendet werden und $0 bedeutet, dass alle Felder verwendet werden. Zum Beispiel:

awk '{print $0}' temp.txt > sav.txt

bedeutet, dass alle Felder gedruckt und die Ergebnisse umgeleitet werden Gehen Sie zu sav.txt

awk '{print $0}' temp.txt|tee sav.txt

Ähnlich wie im obigen Beispiel: aber anders wird auf dem Bildschirm angezeigt

awk '{print $1,$4}' temp.txt

Nur den 1. und ausdrucken Domäne 4

awk 'BEGIN {print "NAME GRADEn----"} {print $1"t"$4}' temp.txt

bedeutet, einen Nachrichtenkopf einzugeben, d. h. „NAME GRADEn-------------“ vor der ersten Zeile des Eingabeinhalts hinzuzufügen und den Inhalt durch Tabulatoren zu trennen

awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp

Kopfzeile und Trailer gleichzeitig drucken

2.3. Bedingte Operatoren:

=, ~ entspricht regulären Ausdrücken ,!~ Entspricht nicht dem regulären Ausdruck

Entspricht: awk '{if ($4~/ASIMA/) print $0}' temp bedeutet, wenn das vierte Feld ASIMA enthält, wird das Ganze gedruckt Zeile

Genaue Übereinstimmung: awk '$3=="48" {print $0}' temp Nur Datensätze drucken, deren drittes Feld gleich „48“ ist

Nicht übereinstimmend: awk '$0 !~ /ASIMA/' temp Druckt den gesamten Datensatz aus, der ASIMA nicht enthält

Nicht gleich: awk '$1 != "asima"' Temperatur

Kleiner als: awk '{if ($1

Set case: awk '/[Gg]reen/' temp Drucken Sie den gesamten Datensatz, der Grün enthält, oder Grün

Beliebiges Zeichen: awk '$1 ~/^...a/' temp Drucken Sie das vierte Zeichen im ersten Feld aus, das ein Datensatz ist Das Symbol „^“ steht für den Zeilenanfang und „.“ für ein beliebiges Zeichen

oder eine relationale Übereinstimmung: awk '$0~/(abc)|(efg)/' temp Verwendung |. Wann muss die Anweisung in Klammern eingeschlossen werden

AND-Beziehung: awk '{if ( $1=="a" && $2=="b" ) print $0}' temp

ODER: awk '{if ($1=="a" || $1=="b") print $0}' temp

2.4 . Integrierte awk-Variablen:

Detaillierte Erklärung des awk-Befehls

Beispiel: awk 'END {print NR}' temp Gibt die Anzahl der gelesenen Datensätze am Ende aus

awk '{print NF, NR, $0} END {print FILENAME}' temp

awk '{if (NR>0 && $4~/Brown/) print $0}' temp Mindestens ein Datensatz existiert und enthält Brown

Eine andere Verwendung von NF: echo $PWD -F/ '{print $NF}' Zeigt den aktuellen Verzeichnisnamen an

2.5. awk-Operatoren:

Mithilfe von Operatoren in awk können grundlegende Ausdrücke in numerische Typen, Zeichenfolgentypen, Variablentypen und Felder unterteilt werden und arrays Element

setzt das Eingabefeld auf den Variablennamen:

awk '{name=$1;six=$3; if (six =="man ") print name " is " six}' temp

Domänenwert-Vergleichsoperation:

awk 'BEGIN {BASE= "27"} {if ($4

Ändern Sie den Wert des numerischen Felds: (die ursprüngliche Eingabedatei wird nicht geändert)

awk '{if ($1=="asima") $6=$6-1;print $1, $6, $7}' temp

Text ändern field:

awk '{if ($1=="asima) ($1=="desc");print $1}' temp

Nur Änderungsdatensätze anzeigen:( Nur das anzeigen, was benötigt wird, abweichend vom vorherigen Befehl, Hinweis {})

awk '{if ($1=="asima) {$1== "desc";print$1}} ' temp

Erstellen Sie ein neues Ausgabefeld:

awk '{$4=$3-$2; print $4}' temp

Statistische Spaltenwerte:

awk '(tot+=$3);END {print tot}' temp zeigt die an Inhalt jeder Spalte

awk '{(tot+=$3)};END {print tot}' temp Nur das Endergebnis anzeigen

Fügen Sie die Dateilängen hinzu:

ls -l|awk '/^[^d]/ {print $9"t"$5} {tot+=$5} END{print "totKB:" tot}'

Nur Dateinamen auflisten:

ls -l|awk '{print $9}' Normalerweise ist der Dateiname der 9 domain

2.6. Integrierte String-Funktion von awk:

gsub(r, s) Ersetzen Sie r durch s im gesamten $0

awk 'gsub(/name/,"xingming") {print $0}' temp

gsub(r, s, t) Ersetze r mit s im gesamten t

index(s, t) Gibt die erste Position der Zeichenfolge t in s zurück

awk 'BEGIN {print index("Sunny", "ny ")}' temp Gibt 4 zurück

length(s) Gibt die Länge von s zurück

match( s, r) Testet, ob s eine passende r-Zeichenfolge enthält

awk '$1=="J.Lulu" {print match($1, "u")}' temp Return 4

split(s, a, fs) Teile s in Sequenz a auf fs

awk 'BEGIN {print split("12#345# 6789",myarray,"# ")"'

Gib 3 zurück, während myarray[1]="12", myarray[2]="345", myarray[3]="6789"

sprint(fmt, exp ) Gibt den fmt-formatierten exp-Match-String zurück)

substr(s, p) Gibt den Suffixteil ab p in String s zurück

substr(s, p , n) Gibt den Suffixteil zurück, der bei p beginnt und die Länge n in der Zeichenfolge s hat

2.7 Verwendung der printf-Funktion:

Zeichenkonvertierung: echo "65" |awk '{printf "%cn",$0}' Ausgabe A

awk 'BEGIN {printf "%fn",999}' Ausgabe 999,000000

Formatierte Ausgabe: awk '{printf "%-15s %sn", $1, $3}' temp zeigt alle ersten Felder linksbündig an

2.8. Andere awk-Verwendungen:

Übergabe von Werten an eine Zeile von awk-Befehlen:

awk '{if ($5

who |. awk '{if ($1==user) print $1 " sind in " $2 ' user=$LOGNAME Verwenden von Umgebungsvariablen

awk-Skriptbefehl:

Verwenden Sie !/bin/awk -f am Anfang von

Ohne diesen Satz das Selbst -enthaltenes Skript wird nicht ausgeführt '#'

# Name: student_tot.awk

# anzurufen: student_tot.awk grade.txt

# druckt die Gesamt- und Durchschnittszahl der Club-Studentenpunkte aus

# druckt zuerst eine Kopfzeile aus

BEGIN

{

Drucken Sie „Studentendatum, Mitgliedsnummer, Note, Alter, maximale Punktezahl“

Drucken Sie „Name beigetreten, gewonnene Punkte verfügbar.“ „

drucken“================================== ============= =========="

}

# Addieren wir die erzielten Punkte

(tot+=$6);

# abgeschlossene Verarbeitung Jetzt drucken wir die Gesamt- und Durchschnittspunktzahl aus

ENDE

{

print „Gesamtpunktzahl der Clubstudenten:“ tot

print „Durchschnittliche Club-Studentenpunkte:“ tot/N

}

2.9 awk array:

awk-Schleife Grundstruktur

Für (Element im Array) print array[element]

awk 'BEGIN {record="123#456#789" ;split(record, myarray, "#")}

END { for (i in myarray) {print myarray[i] } }

3.0 Benutzerdefinierte Anweisungen in awk

1. Bedingte Urteilsaussage (wenn)

if (Ausdruck) #if (Variable im Array)

Anweisung 1

else

Anweisung 2

Im Format kann „Anweisung 1“ aus mehreren Anweisungen bestehen, wenn Sie dies vereinfachen möchten Wenn Sie Unix awk beurteilen und Ihre eigene Lektüre erleichtern möchten, sollten Sie mehrere Anweisungen mit {} einschließen. Die Unix-awk-Zweigstruktur ermöglicht eine Verschachtelung und ihr Format ist:

if(expression)

{Statement 1}

else if (expression)

{ Statement 2}
else
{Statement 3}

[chengmo@localhost nginx]# awk 'BEGIN{

test=100;

if(test>90)

{

print „sehr gut“;

}

else if(test>60)

{
print „good“;
}
else

{

Print " kein bestanden";
}
}'

sehr gut



Jede Befehlsanweisung kann mit einem „;“-Zeichen beendet werden.



2. Schleifenanweisungen (while, for, do)

1. while-Anweisung

Format:

while (Ausdruck Formel)

{Anweisung}

Beispiel:

[chengmo@localhost nginx]# awk 'BEGIN{

test=100;

total=0;

while(i{

total+=i;

i++;

}

print total;

}'

5050

2.for-Schleife

Die for-Schleife hat zwei Formate:

Format 1:

for (Variable im Array)

{Anweisung}

Beispiel:

[chengmo@localhost nginx]# awk 'BEGIN{

for(k in ENVIRON)

{

print k"="ENVIRON[k];

}

}'

AWKPATH=.:/usr/share/awk

OLDPWD=/home/web97

SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass

SELINUX_LEVEL_REQUESTED=

SELINUX_ROLE_REQUESTED=

LANG=zh_CN.GB2312

. . . . . .

Erklärung: ENVIRON ist eine awk-Konstante und ein subtypisches Array.

Format 2:

für (Variable; Bedingung; Ausdruck)

{Anweisung}

Beispiel:

[chengmo@ localhost nginx]# awk 'BEGIN{
total=0;
for(i=0;i{
total+=i;
}
print total ;
}'

5050

3.do-Schleife

Format:

do

{statement}while( Bedingung )

Beispiel:

[chengmo@localhost nginx]# awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(iprint total;
}'
5050

und höher Es handelt sich um die awk-Flusskontrollanweisung. Wie Sie an der Syntax erkennen können, ist sie dieselbe wie die C-Sprache. Mit diesen Anweisungen können viele Shell-Programme tatsächlich an awk übergeben werden, und die Leistung ist sehr schnell.

Detaillierte Erklärung des awk-Befehls


Ausführlichere Artikel zum Thema awk-Befehle finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn