Filtern in Bash

Manchmal will man aus einer Variable oder einem Text alle Zahlen herausziehen oder verstecken. Das geht natürlich mit sed ganz gut, aber noch einfacher in der Bash selbst.

% VAR=1a2b3c4d
% echo "${VAR//[!0-9]/}"
1234
% echo "${VAR//[0-9]/}"
abcd

Man kann auch nur Buchstaben filtern, damit man Sonderzeichen mit herausfiltert. Oder oder…

% VAR="1a,2b.3c;4d"
% echo "${VAR//[!0-9]/}"
1234
% echo "${VAR//[!a-z]/}"
abcd
% echo "${VAR//[!a-z 0-9]/}"
1a2b3c4d
% echo "${VAR//[a-z 0-9]/}"
,.;
Advertisements
Filtern in Bash

Zähl hoch, bash!

Wenn man in der bash ein Script schreibt, das aus irgend welchen Gründen hoch zählen muss, dann kann man eine Variable definieren, zu der man in einer Schleife eine eins addiert. Dieses Script zählt von 1 bis 10:

N=1
while [ $N -le 10 ]; do
   echo Zeile $N
   ((N++))
done

Noch einfacher kann man dieses Script mit Hilfe von „seq“ realisieren:

for N in $(seq 1 10); do
   echo Zeile $N
done

Ausgabe in beiden Fällen:

Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5
Zeile 6
Zeile 7
Zeile 8
Zeile 9
Zeile 10

Die bash versteht aber (im Gegensatz zur sh) auch den Befehl „let“, mit dem man auch andere Operationen mit ganzzahligem Ergebnis machen kann als nur +1. Dabei rundet „let“ grundsätzlich ab:

N=110
while [ $N -ge 1 ]; do
   echo Ergebnis $N
   let N=$N/3
done

Ausgabe:

Ergebnis 110
Ergebnis 36
Ergebnis 12
Ergebnis 4
Ergebnis 1

Braucht man noch komplexere Ergebnisse mit Bruchzahlen oder will von Dec nach Bin oder Hex umrechnen, dann hilft das Programm bc, das auf den meisten U*ix Distries vorinstalliert ist. Dieses Script zählt alle geraden Zahlen von 2 – 20 und gibt das Ergebnis als Hex aus

N=2
while [ $N -le 20 ]; do
   echo -n "$N in Hex ist "
   echo "obase=16; $N" | bc
   N=$(echo "$N+2" | bc)
done

Ausgabe:

2 in Hex ist 2
4 in Hex ist 4
6 in Hex ist 6
8 in Hex ist 8
10 in Hex ist A
12 in Hex ist C
14 in Hex ist E
16 in Hex ist 10
18 in Hex ist 12
20 in Hex ist 14

Aber Achtung! Der test-Befehl (hier durch die [] aufgerufen) kann nur ganzzahlige Werte vergleichen. Die Schleife wird also nicht funktionieren, wenn man Zahlen mit Kommastellen als Ergebnis hat. Der Rechner bc rundet in der Standardeinstellung das Endergebnis auf ganzzahlige Werte ab, genau wie let, aber etwa mit „scale=2“ kann man auch zwei Kommastellen ausgeben (oder mehr, bei höherem scale):

 echo "scale=2; 8/3" | bc

Ausgabe:

2.66
Zähl hoch, bash!