Verwendung des Befehls awk

awk Befehl

Format

awk [-F Feldtrennzeichen] 'Befehle' Dateiname ist
standardmäßig Leerzeichen oder Tabulator als Trennzeichen

Mit einem Doppelpunkt als Trennzeichen müssen Sie die Option -F angeben, z. B.: Awk -F: Dateiname 'Befehle'

-F fs gibt fs als Trennzeichen der Eingabezeile an. Das Standardtrennzeichen des Befehls awk ist ein Leerzeichen oder eine Registerkarte

-v var = val Bevor Sie den Prozess ausführen, setzen Sie eine Variable var und geben Sie dem Gerät den Anfangswert von val

Das vollständige Format des Befehls awk: awd [-F Feldtrennzeichen] 'Übereinstimmungsregel {Befehl ausführen}' Dateiname

Die gesamten Befehle sind in einfache Anführungszeichen ('') eingeschlossen, und der Ausführungsbefehlsteil muss in geschweiften Klammern ({}) stehen.

Wenn das awk-Programm ausgeführt wird und kein Ausführungsbefehl angegeben ist, wird standardmäßig die übereinstimmende Zeile ausgegeben. Wenn keine übereinstimmende Regel angegeben ist, werden standardmäßig alle Zeilen im Text abgeglichen

Übereinstimmende Regeln

Das reservierte awk-Wort BEGIN wird zu Beginn des awk-Programms und vor dem Lesen von Daten ausgeführt. Die Aktion nach BEGIN wird zu Beginn des Programms nur einmal ausgeführt

Das reservierte awk-Wort END wird ausgeführt, wenn das awk-Programm alle Daten verarbeitet hat und kurz vor dem Ende steht. Die Aktion nach END wird am Ende des Programms nur einmal ausgeführt

Vergleichsoperator> größer als
<kleiner als
> = größer als oder gleich
<= kleiner als oder gleich
== gleich. Wird verwendet, um zu beurteilen, ob zwei Werte gleich sind. Wenn einer Variablen ein Wert zugewiesen werden soll, verwenden Sie "="
! = Nicht gleich dem
Übereinstimmungsausdruck ~ (Übereinstimmungswert) ~ / regexp / Wenn der Wert mit / regexp / übereinstimmt, geben Sie den Wert true
! ~ (Nicht übereinstimmen)! ~ / Regexp / if zurück Wenn der Wert nicht mit / regexp / übereinstimmt, wird true zurückgegeben.
Regulärer Ausdruck / Regulärer Ausdruck / Wenn Zeichen in "//" geschrieben werden können, können auch reguläre Ausdrücke unterstützt werden, z. B .: / Root / bedeutet übereinstimmende Zeilen, die root enthalten.
Logischer Operator && logisches UND
|| logisches ODER

[root@haha ~]# awk -F: '$7~ /bash$/ {print $1}' /etc/passwd
root
haha
##以:为分隔符查看/etc/passwd文件,如果第七列匹配以/bash结尾的字符串,就输出对应行的第一列

Datenfeldvariable

$ 0 repräsentiert die gesamte Textzeile
$ 1 repräsentiert das erste Datenfeld in der
Textzeile $ 2 repräsentiert das zweite Datenfeld in der
Textzeile $ n repräsentiert das n-te Datenfeld in der Textzeile

Zeigen Sie die Informationen des ersten und sechsten Felds in der passwd-Datei
awk -F an: '{print $ 1 "\ t" $ 6}' / etc / passwd

Eine Bestellung ausführen

Der Ausführungsbefehl von awk wird in geschweiften Klammern {} angegeben. Die meisten Aktionen werden zum Drucken verwendet (dh Druckanweisungen).
Aktion:
formatierte Ausgabe (Drucken);
Flusssteuerungsanweisungen (wenn, während, für usw.);

(5) BEGIN und END in
awk awk [Optionen] 'BEGIN {print “start”} übereinstimmende Regeln {Befehle} END {print “end”}' Dateiname

BEGIN: Der
BEGIN-Ausführungszeitpunkt ist "am Anfang des awk-Programms, bevor Daten gelesen werden". Sobald die Aktion nach BEGIN einmal ausgeführt wurde und awk beginnt, Daten aus der Datei zu lesen, gilt die BEGIN-Bedingung nicht mehr, sodass die von BEGIN definierte Aktion nur einmal ausgeführt werden kann. Über den Startblock BEGIN können wir Variablen setzen, den Titel setzen

[root@haha ~]# awk -F: 'BEGIN {print "username and loginshell"} $3>=500 {print $1 "\t" $7}' /etc/passwd
#这里定义了两个动作
   #第一个动作使用BEGIN条件,所以会在读入文件数据前打印"print username and loginshell" (只会执行一次)
   #第二个动作会在条件满足时打印文件的第1个字段和第7个字段

END:
END ist auch ein reserviertes Wort von awk, aber es ist genau das Gegenteil von BEGIN. END wird ausgeführt, wenn das awk-Programm alle Daten verarbeitet hat und kurz vor dem Ende steht. Die Aktionen nach END werden am Ende des Programms nur einmal ausgeführt.

[root@haha ~]# awk -F: 'BEGIN {print "print username and loginshell"} $3>=500 {print $ "\t" $7} END {print "The end"}' /etc/passwd
##输出结尾输入"The End",这并不是文档本身的内容,而且只会执行一次

awk Variablen

awk benutzerdefinierte Variablen

awk -v varname = Wert Variablennamen unterscheiden zwischen Groß- und Kleinschreibung

[root@haha ~]# awk -v var=”统计用户数” -v count=0 -F: ‘BEGIN{
    
    print var} {
    
    count++} END{
    
    print “user count is:,count}/etc/passwd

Direkt im Programm definieren, beim Definieren Semikolons verwenden, Variablen wie bisher drucken, durch Kommas getrennt, keine Dollarzeichen verwenden (in BENGIN definiert)

[root@haha ~]# awk 'BEGIN{name="haha";age="26";sex="man";print name,age,sex}'
haha 26 man

Befehlszeilendefinition

[root@haha ~]# var=“ha ha”
[root@haha ~]# awk -v var1=“$var” ‘BEGIN{
    
    print var1}’
##不在awk中定义,是打印不出来的
haha

Awk integrierte Variablen (vordefinierte Variablen)

$ n Das n-te Feld des aktuellen Datensatzes (aktuelle Zeile). Beispielsweise ist n 1 für das erste Feld und n 2 für das zweite Feld.
$ 0 Diese Variable enthält den Textinhalt der aktuellen Zeile während der Ausführung.
DATEINAME Der Name der aktuellen Eingabedatei
FS-Feldtrennzeichen (Standard ist ein beliebiges Leerzeichen)
NF steht für die Anzahl der Felder, die der aktuellen Anzahl der Felder
während der Ausführung entspricht, und NR für die Anzahl der Datensätze, die der aktuellen Zeilennummer während der Ausführung entspricht.
FNR Die Zeilennummer, die für jede Datei separat gezählt wird

[root@haha ~]# cat test.txt
haha 25 man
hehe 25 man
heihei 25 man
[root@haha ~]# cat test1.txt
xixi 25 man
hengheng 25 man

NF: Drucken Sie aus, wie viele Spalten sich in jeder Zeile befinden:

[root@haha ~]# awk ‘{
    
    print NF}’ test.txt
3
3
3

NF: Zitieren Sie die erste und letzte Spalte

[root@haha ~]# awk ‘{
    
    print $(NF-2),$NF}’test.txt
haha man
hehe man
heihei man

NR: Zeilennummer pro Zeile

[root@haha ~]# awk ‘{
    
    print NR“),$0}’ test.txt
1)haha 25 man
2)hehe 25 man
3)heihei 25 man

FNR: awk unterstützt das Scannen mehrerer Dateien, verwendet NR zum Verbinden der Nummer und FNR zum Trennen der Nummer

[root@haha ~]# awk ‘print NR“),$0’ test.txt test1.txt
1)haha 25 man
2)hehe 25 man
3)heihei 25 man
4)xixi 25 man
5)hengheng 25 man
[root@haha ~]# awk ‘print FNR“),$0’test.txt test1.txt
1)haha 25 man
2)hehe 25 man
3)heihei 25 man
1)xixi 25 man
2)hengheng 25 man

FS: Separator
Allgemeine Schreibweise: -F: -F, -F [/,]

[root@haha ~]# echo “a b c d” | awk ‘{
    
    print $2}’
b
[root@haha ~]# echo “a,b,c,d” | awk -F,{
    
    print $2}’
b
[root@haha ~]# echo “a,b,c,d” | awk -F“,” ‘{
    
    print $2}’
b
[root@haha ~]# echo “a b,c%d” | awk -F“[ ,%]” ‘{
    
    print $2}’
b
[root@haha ~]# echo “a   b,,c%%%d” | awk -F“[ ,%]+” ‘{
    
    print $2}’
b

Beispiel:

[root@haha ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "Total is:"size/1024/1024"MB"}'
统计某个目录下的文件占用字节数,以MB显示

[root@haha ~]# ls -l /etc/ | awk 'BEGIN{sum=0}/^[^d]/{print $9  "\t"  $5;sum+=$5}END{print "Total size:"sum/1024/1024"MB"}'
统计某个目录下每个文件的大小及其总和,但要排除子目录

[root@haha ~]# ifconfig ens33 | grep “inet\>| awk ‘{
    
    print $2}192.168.13.14
提取IP地址

[root@haha ~]# echo “haha heihei hehe xixi” | awk ‘{
    
    print $3}’
hehe
[root@haha ~]# echo “haha heihei hehe xixi” | awk ‘{
    
    print $(NF-1)}’
hehe
关系运算

[root@haha ~]# awk  -F: ‘$3<1000{
    
    print $1<======>”$NF}/etc/passwd
打印passwd文件中用户UID小于10的用户名和它登录使用的登录shell

awk -F: ‘$3>=1000 && $NF==/bin/bash”{
    
    print $1,$NF}/etc/passwd
打印系统中能够正常登录的普通用户

[root@haha ~]# free -m | grep -i "mem" | awk '{printf "%.2f\n",$3/$2*100}'
统计当前内存的使用率
##printf命令按照指定的格式显示输出。
##printf命令格式:printf 	“打印格式”  显示内容
%2.f就是打印格式,表保留小数后两位,f代表浮点数

awk control Anweisung

if-Anweisung

if (Bedingung) print
if (Bedingung) {print} else {print}
if (Bedingung) {print} else if (Bedingung) {print} else {print}
## else if == elif
if-Anweisung use environment: to awk Sagen wir, um eine bedingte Beurteilung der gesamten Zeile oder eines erhaltenen Feldes vorzunehmen

[root@haha ~]# awk -F: '{if($3<1000) {print "system_user="$1} else {print "ordinary_user="$1}}' /etc/passwd
##如果uid小于1000,就打印系统用户:$1,否则打印普通用户:$1

[root@haha ~]# awk -F: '{if($3==0){print "Administrator:"$1}else if($3<1000){print "system_user:"$1}else{print "ordinary_user:"$1}}' /etc/passwd
##如果uid=0就打印系统管理员root,如果uid<1000就打印程序用户,否则打印普通用户

[root@haha ~]# df -hT | awk -F"[ %]+" '/^\/dev/{if($6>25){print $1"\t"$6"%"}}'
##统计分区使用率,输出超过25%的分区信息

while-Schleife

Anweisung: while (Bedingung) {Anweisung} Wenn die Bedingung "wahr" ist, um in die Schleife einzutreten, ist die Bedingung "falsch", um die Schleife zu verlassen.
Wenn Sie eine Statistik der Berechnungsergebnisse durchführen, können Sie das Symbol + = verwenden, was bedeutet, dass wir dem Symbol das hinzugefügte Ergebnis zuweisen können Schreiben Sie für die Variable links im Feld, welches Feld auf der rechten Seite des Symbols für welche Feldoperation verwendet wird, z. B. Total + = $ 3,
während die Anweisung die Umgebung verwendet: Verarbeiten Sie in awk mehrere Felder in einer Inhaltszeile nacheinander

[root@haha ~]# awk '{total=total+$5}END{print total}' test.txt
[root@haha ~]# awk '{total+=$5}END{print total}' test.txt
总数=总数+第五列数据(列数据的和)
END打印总数

[root@haha ~]# awk '{total=0;i=1;while(i<=NF){total+=$i;i++}; print total}' test.txt
##总数为0,赋值1给变量i,当i小于等于字段域时,总数加上i对应域的数据,i递增,循环结束打印总数(行数据的和)

[root@haha ~]# awk 'NR>1{total=0;i=5;while(i<=$(NF-2)){total+=$i;i++};print $1,total}' test.txt
##匹配规则NR>1,执行命令:赋值total,赋值i,当i小于等于(NF-2)时,总数=总数加上i对应列的数据,然后打印出来总数

für Schleife

Syntax: for (Variablenzuweisung; Bedingung; Iteration) {Befehl}
Syntax: for (var in Array) {Anweisung}

[root@haha ~]# awk '{total=0;for(i=1;i<=NF;i++){total+=$i}; print total}' test.txt
##总数为0,i=1,当i小于等于字段个数时,总数=总数和i对应字段的数据相加,i递增,结束for循环后,打印总数

Gerade Zahl (nächste)

Drucken Sie ungerade oder gerade Zeilen

awk'NR% 2 == 0 {print NR, $ 0} '/root/test.txt Das Linienmodulo
2 und der Rest ist 0, was eine gerade Linie ist. Der
Linienmodul ist 2 und der Rest ist 1, was eine ungerade Linie ist.

Array

Ein Array ist eine Sammlung, die eine Reihe von Elementen enthält.
Format:
zex [1] = ”haha”
zex [2] = ”heihei”

zex: ist der Name des Arrays
[1], [2]: ist der Index des Array-Elements, das als erstes Element des Arrays verstanden werden kann, das zweite Element des Arrays
"haha", "heihei": Elementinhalt

Zuweisungsformat für Array-Variablen

var [index] = Elementbeschreibung
: var ====> ist der Name des Array-
Index ===> ist der Index des assoziativen Array-
Elements ===> ist der Elementwert des Arrays

Zahlen als Array-Index:
Array [1] = "haha"
Array [2] = "heihei"

Zeichenfolge als Array-Index:
array ["first"] = "www"
array ["last"] = "name"
Wenn auf eine Array-Variable verwiesen wird, muss sie ihren Indexwert enthalten und dann nach Indexwert extrahieren Sein entsprechender Elementwert

awk Schreibformat

[root@haha ~]# awk 'BEGIN{ \
> test["a"]="haha" \
> test["b"]="heihei" \
> test["c"]="hehe" \
> print test["b"] \
> }'
显示结果:
heihei
也可以写成:
#awk 'BEGIN{test["a"]="haha";test["b"]="heihei";test["c"]="hehe";print test["b"]}'

Durchlaufen Sie die Elemente im Array

für (var in array) {print array [var]}

[root@haha ~]# awk ‘BEGIN{
    
     \
>test[“a”]=“haha” \
>test[“b”]=“hehe” \
>for(i in test) \
>{
    
    print “index:”i,-----------value:”test[i] \
>}’
index:a ----------value:haha
index:b ----------value:hehe

Array-Elemente löschen

Fügen Sie dem Befehl "geschweifte Klammer" das Löscharray [Index] hinzu

[root@haha ~]# awk 'BEGIN{test["a"]="haha";test["b"]="hehe";test["c"]="heihei";for(i in test){print i,test[i]};print "+++++++++++++++";delete test["b"];for(i in test){print i,test[i]}}'

Array-Anwendung

array[“index”]++ 每循环一次这个索引所对应的元素值加1(初始值默认是0[root@haha ~]# netstat -antpu | awk'/^tcp\>/{
    
    test[$6]++}END{
    
    for(i in tes
t){
    
    print i,test[i]}}'
##查看tcp连接LIsten和Estableshed出现的次数

[root@haha ~]# awk -F“[/]+” ‘{
    
    print $2}’ test.txt | sort | uniq -c
##查看相同字符串出现的次数

[root@haha ~]# awk ‘{
    
    test[$1]++}END{
    
    for(i in test){
    
    print i,test[i]}}’ test.txt
##查看相同字符串出现的次数

Ich denke du magst

Origin blog.csdn.net/weixin_52441468/article/details/112642630
Empfohlen
Rangfolge