In Skripten muss ich gelegentlich Ausgaben von Befehlen formatieren oder sonstwie bearbeiten, um sie z.B. als Mailtext eines Cronjobs zu verwenden.
uname -n | gawk '{print toupper($0)}'
Das gibt den Hostnamen in Großbuchstaben aus.
Natürlich geht auch das Umwandeln in Kleinbuchstaben:
echo ASDFGH | gawk '{print tolower($0)}'
Ergebnis: asdfgh
Vielleicht will ich aber einfach nur wissen, wie lang eine Variable (ein String) ist.
echo "dasisteinlangerstring" | gawk '{print length($0)}'
Ergebnis: 21
Gelegentlich bräuchte ich eine hexadezimale Zahl als dezimale.
echo 0xAF5D1 | gawk '{print strtonum($0)}'
Ergebnis: 718289
Wichtig bei strtonum ist, dass es Großbuchstaben sein müssen. Das kann ich ja mit toupper zuvor noch machen.
...Das ist ja recht schön, aber wie kann ich eine Shellvariable an gawk übergeben?
String=23halloo1asdfasdf; gawk 'BEGIN {print substr("'"${String}"'",3,5)}'
Ergebnis: hallo
Wenn wir schon bei substring sind, ist der Weg zu split nicht weit:
String=vorneundhinten; echo | gawk '{split("'"${String}"'",arr,"und"); print arr[1]}'
Ergebnis: vorne
Das leere "echo" bewirkt das selbe wie "BEGIN"
Gawk nimmt es mit Arrays zwar genauer als die Bash, aus irgendwelchen Gründen scheint der Zähler aber bei 1 zu beginnen und nicht bei 0.
Üblicherweise mache ich mit gawk aber viel einfachere Dinge.
cat /etc/passwd | gawk -F":" '{print $1,$NF}'
Das zeigt mir alle Linuxuser und ihre Shell, eben das erste und das letzte Feld in der passwd. Der Vorteil von gawk gegenüber cut ist, dass der Feldtrenner aus mehreren Zeichen bestehen kann.
Als simples Beispiel nehme ich mal Folgendes:
echo -e "eins und zwei\ndrei und vier\nfuenf und sechs"
Das ergibt:
eins und zwei
drei und vier
fuenf und sechs
echo -e "eins und zwei\ndrei und vier\nfuenf und sechs" | gawk -F" und " '{print $1$2}'
Gawk macht dann daraus:
einszwei
dreivier
fuenfsechs
Der Feldtrenner ist in diesem Fall das "und" mit je einem Leerzeichen davor und danach.