awk
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| awk [2020-05-08 14:30:45] – [Zahlen formatiert ausgeben] manfred | awk [2024-07-31 00:17:54] (aktuell) – [Runden] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== AWK ====== | ||
| + | |||
| + | **AWK**: Abkürzung, die aus den Anfangsbuchstaben der Nachnamen der drei " | ||
| + | |||
| + | * **[[https:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * **[[https:// | ||
| + | * **[[https:// | ||
| + | |||
| + | > echo -e " | ||
| + | 1 | ||
| + | 2 | ||
| + | 3 | ||
| + | | ||
| + | > echo -e " | ||
| + | 2 | ||
| + | | ||
| + | > echo "1 2 3" | awk ' | ||
| + | 2 | ||
| + | | ||
| + | > echo " | ||
| + | 2 | ||
| + | | ||
| + | > echo " | ||
| + | foooobazbarrrrr | ||
| + | | ||
| + | > echo " | ||
| + | foooo barrrrr | ||
| + | | ||
| + | |||
| + | |||
| + | ==== Runden ==== | ||
| + | |||
| + | echtes runden mit awk: | ||
| + | > echo " | ||
| + | 5.6 | ||
| + | > echo " | ||
| + | 6 | ||
| + | |||
| + | abrunden mit awk: | ||
| + | > echo " | ||
| + | 5 | ||
| + | |||
| + | Zahlen mit fester Länge ausgeben: | ||
| + | > echo " | ||
| + | 00000005 | ||
| + | |||
| + | |||
| + | ==== Pi ==== | ||
| + | |||
| + | > echo | awk ' | ||
| + | 3.14159 | ||
| + | | ||
| + | # " | ||
| + | > echo | awk ' | ||
| + | 3.141592653589793 | ||
| + | |||
| + | |||
| + | ==== Zahlen summieren ==== | ||
| + | |||
| + | Zusammenzählen aller Werte in der 1. Spalte (" | ||
| + | # awk ' | ||
| + | # awk ' | ||
| + | # awk ' | ||
| + | # awk ' | ||
| + | # awk ' | ||
| + | # awk ' | ||
| + | |||
| + | Durchschnitt aller Werte der letzten Spalte: | ||
| + | # cat ... | nl | awk '{ zwischenwert=$NF; | ||
| + | |||
| + | |||
| + | ==== Schleife ==== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | # echo " | ||
| + | 1 | ||
| + | 2 | ||
| + | 3 | ||
| + | 4 | ||
| + | 5 | ||
| + | 6 | ||
| + | 7 | ||
| + | |||
| + | |||
| + | ==== Wurzel ziehen ==== | ||
| + | |||
| + | Wurzel aus 9 | ||
| + | > echo " | ||
| + | 3 | ||
| + | |||
| + | > echo "10 1" | awk ' | ||
| + | 3 | ||
| + | |||
| + | 5. Wurzel aus 4 ([[https:// | ||
| + | > awk 'BEGIN { print (4 ** (1.0 / 5)) }' | ||
| + | 1.31951 | ||
| + | | ||
| + | > awk 'BEGIN { print (ARGV[2] ** (1.0 / ARGV[1])) }' 5 4 | ||
| + | 1.31951 | ||
| + | |||
| + | |||
| + | ==== Logarithmus ==== | ||
| + | |||
| + | natürlicher Logarithmus aus 5: | ||
| + | > echo " | ||
| + | 1.60944 | ||
| + | |||
| + | natürlicher Logarithmus aus 20: | ||
| + | > echo " | ||
| + | 2.99573 | ||
| + | |||
| + | dezimaler Logarithmus 1000: | ||
| + | > echo " | ||
| + | 3 | ||
| + | |||
| + | binärer Logarithmus aus 8: | ||
| + | > echo " | ||
| + | 3 | ||
| + | |||
| + | |||
| + | ==== IF-Verzweigung ==== | ||
| + | |||
| + | Mit Alphanumerischen Zeichen: | ||
| + | # echo ' | ||
| + | RSN | ||
| + | |||
| + | die " | ||
| + | # echo " | ||
| + | 1.5=mittel | ||
| + | |||
| + | # echo " | ||
| + | 2 | ||
| + | |||
| + | # echo " | ||
| + | mittel | ||
| + | |||
| + | |||
| + | === IP => Integer === | ||
| + | |||
| + | # vi ip2int.sh | ||
| + | |||
| + | #!/bin/bash | ||
| + | | ||
| + | echo " | ||
| + | do | ||
| + | echo "${N} ${Z}" | awk ' | ||
| + | done | awk ' | ||
| + | |||
| + | # /bin/bash ip2int.sh 192.168.1.100 | ||
| + | 3232235876 | ||
| + | | ||
| + | # /bin/bash ip2int.sh 255.255.255.0 | ||
| + | 4294967040 | ||
| + | |||
| + | |||
| + | === Integer => Binär === | ||
| + | |||
| + | # echo " | ||
| + | | ||
| + | exit | ||
| + | | ||
| + | # solange die erste Zahl >=0 ist, weitermachen: | ||
| + | | ||
| + | # / | ||
| + | 31 2147483648 | ||
| + | | ||
| + | # echo " | ||
| + | 2147483392 | ||
| + | | ||
| + | # / | ||
| + | 30 1073741824 | ||
| + | |||
| + | Das mach ich später fertig, hab jetzt keine Zeit mehr... | ||
| + | |||
| + | |||
| + | ==== Zahlen formatiert ausgeben ==== | ||
| + | |||
| + | c Ein ASCII-Zeichen. | ||
| + | Ist das entsprechende Argument eine Zahl, | ||
| + | so wird diese als Kode im Zeichensatz interpretiert und ausgegeben. | ||
| + | d Eine vorzeichenbehaftete Integerzahl | ||
| + | i Eine vorzeichenbehaftete ganze Zahl. | ||
| + | e Eine Gleitkommazahl der Form: [-]d.ddddddE[+-]dd | ||
| + | f Eine Gleitkommazahl der Form: [-]ddd.dddddd | ||
| + | g das Argument wird entweder wie e oder f umgewandelt. | ||
| + | Je nachdem, welches Ergebnis kürzer ist. | ||
| + | Nicht signifikante Nullen werden dabei unterdrückt. | ||
| + | o Eine vorzeichenlose Oktalzahl. | ||
| + | s Ein String. | ||
| + | u Eine vorzeichenlose ganze Zahl. | ||
| + | x Eine vorzeichenlose Hexadezimalzahl mit Kleinbuchstaben. | ||
| + | X Eine vorzeichenlose Hexadezimalzahl mit Großbuchstaben. | ||
| + | % Hebt die bedeutung von % auf. Also %% gibt % aus. | ||
| + | abs(x) | ||
| + | int(x) | ||
| + | log(x) | ||
| + | rand() | ||
| + | sqrt(x) Wurzel aus x | ||
| + | | ||
| + | # echo "10 50" | awk 'func abs(x) {return ((x < 0.0) ? -x : x)} {printf " | ||
| + | | ||
| + | # echo "1021 576" | awk ' | ||
| + | # echo "1021 576" | awk ' | ||
| + | # echo "1021 576" | awk ' | ||
| + | # echo "1021 576" | awk ' | ||
| + | |||
| + | **__Rechengenauigkeit__** | ||
| + | # echo "76.1 81.8 3.1415926535897932384626433832795028841971693993751" | ||
| + | 399.927 | ||
| + | | ||
| + | # echo "76.1 81.8 3.1415926535897932384626433832795028841971693993751" | ||
| + | 399.9273868814023 | ||
| + | | ||
| + | # echo "76.1 81.8 3.1415926535897932384626433832795028841971693993751" | ||
| + | 373, | ||
| + | | ||
| + | # echo "76.1 81.8 3.1415926535897932384626433832795028841971693993751" | ||
| + | 373, | ||
| + | | ||
| + | # echo "76.1 81.8 3.1415926535897932384626433832795028841971693993751" | ||
| + | 399.92738688140229896817 | ||
| + | | ||
| + | # echo " | ||
| + | 399.92738688140234827240 | ||
| + | |||
| + | ---- | ||
| + | Aus einer Datei soll die letzte Spalte von allen Zeilen ausgegeben werden, | ||
| + | die " | ||
| + | |||
| + | # export SUCHPATTERN=" | ||
| + | # awk '/' | ||
| + | | ||
| + | # awk '/ | ||
| + | |||
| + | Es entspricht dem Aufruf: | ||
| + | # cat [Datei] | grep ' | ||
| + | |||
| + | Die letzte Spalte an den Anfang setzen, egal wieviel Spalten die Zeile hat: | ||
| + | # awk '{ printf $NF;$NF = "" | ||
| + | |||
| + | Wenn die Spalte 4 groesser ist als Spalte 6 | ||
| + | oder wenn in Spalte 7 eine Zahl steht, die groesser als 30000 ist, | ||
| + | wird die Zeile ausgegeben: | ||
| + | # awk '$4 < $6 || $7 > 30000' | ||
| + | |||
| + | Es wird die Zeile ausgegeben, in der von Spalte 7, die Groesste Zahl steht: | ||
| + | # vi script.awk | ||
| + | max < $7 { max = $7 ; stadt = $1 } | ||
| + | END { print "Die meisten Zuschauer waren in", | ||
| + | |||
| + | # awk -v max=0 -f script.awk | ||
| + | |||
| + | mit AWK alles in Großbuschtaben umwandeln: | ||
| + | # echo " | ||
| + | BUCHSTABEN | ||
| + | |||
| + | mit AWK alles in Kleinbuschtaben umwandeln: | ||
| + | # echo " | ||
| + | buchstaben | ||
| + | |||
| + | AWK als grep: | ||
| + | # awk '/ | ||
| + | # awk '/ | ||
| + | # awk '/ | ||
| + | # awk '/ | ||
| + | # awk ' | ||
| + | |||
| + | AWK als sed: | ||
| + | # awk '/ | ||
| + | # awk -v neu=" | ||
| + | # awk -v alt=' | ||
| + | # awk -v alt=' | ||
| + | # awk ' | ||
| + | |||
| + | Beispiel: | ||
| + | * rein: D00D2 00010 31/12/2008 102 | ||
| + | * raus: D00D2 00010 20081231 102 | ||
| + | |||
| + | # awk '{ alt="/"; | ||
| + | |||
| + | Es sollen nur die Leerzeichen der Variablen (vor dem Gleichheitszeichen) gegen Unterstriche ausgetauscht werden, nicht jedoch die Leerzeichen der Werte (hinter dem Gleichheitszeichen). Dazu wird vor der Veränderung der Wert in eine Variable gespeichert: | ||
| + | |||
| + | # echo "CPU Signature=Type 0, Family 6, Model 26, Stepping 5" | awk -F' | ||
| + | CPU_Signature=Type 0, Family 6, Model 26, Stepping 5 | ||
| + | |||
| + | Und jetzt noch zusätzlich die Variablen von Großschreibung in Kleinschreibung umwandeln. | ||
| + | |||
| + | # echo "CPU Signature=Type 0, Family 6, Model 26, Stepping 5" | awk -F' | ||
| + | cpu_signature=Type 0, Family 6, Model 26, Stepping 5 | ||
| + | |||
| + | Zeilenlängen einer Datei ermitteln | ||
| + | # wc -L [dateiname].csv | ||
| + | # awk ' | ||
| + | 78 | ||
| + | |||
| + | CSV (comma separated version) in "feste Spaltenbreite" | ||
| + | |||
| + | 12 Zeichen breite Spalte generieren: " | ||
| + | # awk -F';' | ||
| + | | ||
| + | 13 1 | ||
| + | 52 1 | ||
| + | 62 1 | ||
| + | 64 1 | ||
| + | 71 1 | ||
| + | 85 1 | ||
| + | |||
| + | # Da wo das Komma steht, werden die Freiräume mit Leerzeichen | ||
| + | # aufgefüllt. | ||
| + | |||
| + | # echo " | ||
| + | |||
| + | |||
| + | allerdings sind die Einträge in der ersten Spalte immer __rechtsbündig__: | ||
| + | > echo " | ||
| + | | ||
| + | |||
| + | will man sie __linksbündig__, | ||
| + | > echo " | ||
| + | innodb_file_per_table | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Muss man einen String innerhalb eines Stringes (Unterstring => SubString) zerlegen, also zum Beispiel ein Datum in einem Satz umformen, dann bietet sich die Funktion //substr// in //AWK// an: | ||
| + | |||
| + | echo "Das Datum 21.03.1969 im klassischen Format." | ||
| + | Das Datum 1969-03-21 im Euro-Format. | ||
| + | |||
| + | //substr// benötigt drei Parameter: | ||
| + | |||
| + | - " | ||
| + | - ab dem wievielten Zeichen von dieser " | ||
| + | - wieviel Zeichen aus dieser " | ||
| + | |||
| + | die ersten beiden Zeichen einer Zeichenkette ausgeben: | ||
| + | echo " | ||
| + | |||
| + | die letzten beiden Zeichen einer Zeichenkette ausgeben: | ||
| + | echo " | ||
| + | ---- | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | Will man zum Beispiel die Werte "cpu family", | ||
| + | dann kann man einfach in dieser Datei nachsehen: | ||
| + | |||
| + | # cat / | ||
| + | | ||
| + | processor | ||
| + | vendor_id | ||
| + | cpu family | ||
| + | model : 2 | ||
| + | model name : Intel(R) Pentium(R) 4 CPU 2.60GHz | ||
| + | stepping | ||
| + | cpu MHz : 2593.547 | ||
| + | cache size : 512 KB | ||
| + | fdiv_bug | ||
| + | hlt_bug | ||
| + | f00f_bug | ||
| + | coma_bug | ||
| + | fpu : yes | ||
| + | fpu_exception | ||
| + | cpuid level : 2 | ||
| + | wp : yes | ||
| + | flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe up pebs bts cid xtpr | ||
| + | bogomips | ||
| + | clflush size : 64 | ||
| + | power management: | ||
| + | |||
| + | Hat diese CPU allerdings mehr als einen Kern, dann wird es schnell unübersichtlich: | ||
| + | |||
| + | # cat / | ||
| + | | ||
| + | processor | ||
| + | vendor_id | ||
| + | cpu family | ||
| + | model : 26 | ||
| + | model name : Intel(R) Xeon(R) CPU | ||
| + | stepping | ||
| + | cpu MHz : 2926.105 | ||
| + | cache size : 8192 KB | ||
| + | physical id : 1 | ||
| + | siblings | ||
| + | core id : 0 | ||
| + | cpu cores : 4 | ||
| + | apicid | ||
| + | initial apicid | ||
| + | fpu : yes | ||
| + | fpu_exception : yes | ||
| + | cpuid level : 11 | ||
| + | wp : yes | ||
| + | flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 lahf_lm ida tpr_shadow vnmi flexpriority ept vpid | ||
| + | bogomips | ||
| + | clflush size : 64 | ||
| + | cache_alignment | ||
| + | address sizes : 40 bits physical, 48 bits virtual | ||
| + | power management: | ||
| + | | ||
| + | ... | ||
| + | | ||
| + | processor | ||
| + | vendor_id | ||
| + | cpu family | ||
| + | model : 26 | ||
| + | model name : Intel(R) Xeon(R) CPU | ||
| + | stepping | ||
| + | cpu MHz : 2926.105 | ||
| + | cache size : 8192 KB | ||
| + | physical id : 0 | ||
| + | siblings | ||
| + | core id : 3 | ||
| + | cpu cores : 4 | ||
| + | apicid | ||
| + | initial apicid | ||
| + | fpu : yes | ||
| + | fpu_exception : yes | ||
| + | cpuid level : 11 | ||
| + | wp : yes | ||
| + | flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 lahf_lm ida tpr_shadow vnmi flexpriority ept vpid | ||
| + | bogomips | ||
| + | clflush size : 64 | ||
| + | cache_alignment | ||
| + | address sizes : 40 bits physical, 48 bits virtual | ||
| + | power management: | ||
| + | |||
| + | Die oben gezeigte Ausgabe stammt von einem Dual-Quad-Core mit Hyper-Threading. Also sind es nur zwei CPUs mit je vier Kernen, die über erweiterte Register verfühgt, wodurch der einzelne Kern zwischen zwei Pipes schneller hin und her springen kann. | ||
| + | |||
| + | Hyper-Threading bringt nur einen Geschwindigkeitsvorteil, | ||
| + | An sonsten werden z.B. die ersten beiden Prozesse auf die ersten beiden virtuellen CPUs gestartet, wobei das aber der selbe Kern (mit Hyper-Threading) ist und alle anderen CPU-Kerne haben nix zu tun. | ||
| + | |||
| + | Deshalb sollte man HT (Hyper-Threading) im BIOS nur dann aktivieren, wenn man vilele Prozesse fährt. | ||
| + | |||
| + | Möchte man | ||
| + | - nur diese drei Parameter und | ||
| + | - nur vom ersten CPU-Kern-Block (also nur ein einziges mal) | ||
| + | dann kann man sich alles, bis zu der Zeile anzeigen lassen, in der " | ||
| + | |||
| + | sed -e '/ | ||
| + | | ||
| + | processor | ||
| + | vendor_id | ||
| + | cpu family | ||
| + | model : 26 | ||
| + | model name : Intel(R) Xeon(R) CPU | ||
| + | stepping | ||
| + | |||
| + | Das ist schon sehr viel übersichtlicher und enthält auch alle Informationen, | ||
| + | |||
| + | Allerdings werden auch da noch viele unnütze Infos angezeigt, die rausgefiltert werden sollen. | ||
| + | |||
| + | Filtert man jetzt nach der klassischen Art mit " | ||
| + | |||
| + | # sed -e '/ | ||
| + | | ||
| + | 6 | ||
| + | 26 | ||
| + | 5 | ||
| + | |||
| + | Das gleiche Ergebnis kann man allerdings auch bekommen, wenn man an Stelle von drei Prozessen (egrep, fgrep und awk) | ||
| + | nur einen aufruft (awk): | ||
| + | |||
| + | # sed -e '/ | ||
| + | | ||
| + | 6 | ||
| + | 26 | ||
| + | 5 | ||
| + | |||
| + | Denn //AWK// kann alles, was grep kann. | ||
| + | |||
