🐼 REGEX_PANDA.md — Muster-Spuren im Textwald

BashPanda sagt: Regex ist wie eine Spur im Log-Wald:
du siehst nicht alles — aber du erkennst Muster.
#kein #krĂźmel #geht #verloren


1) Was sind Reguläre Ausdrßcke?

Reguläre Ausdrßcke (Regex / RegExp) sind eine kompakte Schreibweise, um
Textmuster zu beschreiben — für vier Kern-Sachen:

  1. Suchen (finde Stellen)
  2. Filtern (lass nur passende Zeilen durch)
  3. Extrahieren (hole nur das TeilstĂźck, das du brauchst)
  4. Ersetzen (forme Text um)

Du findest Regex Ăźberall:
- grep / sed / awk / perl
- Python / JavaScript / PHP
- Editor-Suche (VS Code etc.)


2) Panda-Cheatsheet: die wichtigsten Bausteine

Symbol Bedeutung Beispiel
. beliebiges Zeichen a.c → abc, axc
* 0 oder mehr ab*c → ac, abc
+ 1 oder mehr ab+c → abc, abbc
? optional (0/1) colou?r
^ Zeilenanfang ^ERROR
$ Zeilenende \.txt$
[abc] Zeichenmenge [0-9]
(...) Gruppe (capture) (GET|POST)
| oder cat|dog
\d Ziffer (PCRE/Python/JS) \d+
[:digit:] Ziffer (POSIX) [[:digit:]]+

Panda-Tipp: Im Terminal lieber mit POSIX-Klassen arbeiten, wenn du
Engine-Unterschiede vermeiden willst: [[:digit:]], [[:space:]], [[:alpha:]].


3) Engine-Unterschiede (wichtig, sonst frisst Panda falschen Bambus)

grep hat drei „Zähne“

  • grep -F → Fixed String (schnell, keine Regex)
  • grep -E → ERE (Extended Regex)
  • grep -P → PCRE (Lookarounds, \d, \b … falls verfĂźgbar)

awk ist POSIX-Regex (kein PCRE)

  • \b ist in awk kein Word-Boundary.
  • FĂźr „Wortgrenze“ lieber mit POSIX-Mustern arbeiten oder grep -P/perl nutzen.

4) Praxis: 10 Regex-Moves, die du im Wald ständig brauchst

4.1 Zeilen, die mit ERROR beginnen

grep -nE '^ERROR' log.txt

4.2 Alles außer Kommentare und leere Zeilen (Configs säubern)

grep -vE '^[[:space:]]*(#|$)' config.conf

4.3 Doppelte Spaces → ein Space (Text glätten)

sed -E 's/[[:space:]]+/ /g' file.txt

4.4 Dateiendung nur am Ende ändern (.txt → .doc)

echo "example.txt" | sed -E 's/\.txt$/.doc/'

4.5 Nur Matches ausgeben (nicht die ganze Zeile)

echo "User=robot id=12345" | grep -oE '[[:digit:]]+'

5) Crumbforest-Log-Magie: Nginx Accesslog Pfade zählen

Option A (PCRE): GET-Pfad extrahieren

(zwischen GET und HTTP/...)

grep -oP '(?<=GET\s)[^\s"]+(?=\sHTTP/\d+\.\d+")' /var/log/nginx/access.log \
| awk '{ c[tolower($0)]++ } END{ for (p in c) printf "%5d  %s\n", c[p], p }' \
| sort -nr | head

Option B (awk-only, robust & schnell)

awk '
  match($0, /"GET ([^ ]+) HTTP\/[0-9.]+"/, m) {
    p = tolower(m[1]); c[p]++
  }
  END { for (p in c) printf "%5d  %s\n", c[p], p }
' /var/log/nginx/access.log | sort -nr | head

Panda sagt: B ist oft die beste Wahl — weniger Quoting-Stress, kein -P nötig.


6) Mini-Übungen (für echte Krümel-Power)

Finde alle IPv4-Adressen in einem Text

grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt

Extrahiere Datum TT/MM/JJJJ

grep -oE '[0-9]{2}/[0-9]{2}/[0-9]{4}' file.txt

Zähle Statuscodes (200/404/500) im Accesslog

awk '{ code=$9; if (code ~ /^[0-9]{3}$/) c[code]++ }
     END{ for (k in c) printf "%6d  %s\n", c[k], k }' /var/log/nginx/access.log | sort -nr

7) Panda-Regeln (damit keine KrĂźmel verloren gehen)

  1. Starte klein: erst -F, dann -E, dann -P.
  2. Teste Muster an 2–3 Beispielzeilen.
  3. Nutze ^ und $, wenn du präzise sein willst (Endung, Zeilenstart).
  4. Wenn’s unklar ist: mach eine dry-run Ausgabe bevor du ersetzt (sed ... | less).

#kein #krĂźmel #geht #verloren

crewlove 🐼🦉🦊🌲