2017-12-13 3 views
-2

Ich bin ein Neuling zu bash und ich versuche, ein Skript zu schreiben, Wartung auf einem LXC-Host zu tun, und es ist Container, die Sie in meinem github project finden können. Im Moment versuche ich die Namen der Container in zwei Arrays zu bekommen: $ active_containers und $ inactive_containers. Der reguläre Ausdruck, den ich gebaut habe basiert auf der folgenden:Bash-Skript mit regulärem Ausdruck

Enforce valid container names

Dies erfordert, dass alle Containernamen zu:
- zwischen 1 und 63 Zeichen lang
- ausschließlich aus alphanumerischen Zeichen gemacht werden und Bindestriche
- nicht mit einem numerischen Zeichen oder Bindestrich beginnt
- nicht mit einem Bindestrich enden

Ich weiß, dass meine Regex noch nicht perfekt ist, sie sucht nach 3-63 Zeichen.

Mein test.sh:

#!/bin/bashbased 
active_containers="$(lxc list -c ns | grep RUNNING)" 
echo $active_containers 
findcontainers='\b(a-zA-Z{1}a-zA-Z0-9\-{,61}a-zA-Z0-9{1})\b' 
echo $active_containers | sed -e $findcontainers 
echo "Containers found: $active_containers" 

FYI: die Ausgabe des Befehls "lxc Liste -c ns":

+-------------+---------+ 
| NAME  | STATE | 
+-------------+---------+ 
| linuxserver | RUNNING | 
+-------------+---------+ 
| websites | RUNNING | 
+-------------+---------+ 

aktuelles Ergebnis:

| linuxserver | RUNNING | | websites | RUNNING | 
sed: -e expression #1, char 37: unterminated address regex 

Das Ergebnis I Ich möchte:

$active_containers(0): "linuxserver" 
$active_containers(1): "RUNNING" 
$active_containers(2): "websites" 
$active_containers(3): "RUNNING" 

Ich habe durch Stackoverflow und Handbücher von (e) grep suchen, sed und awk aber nicht finden können, was ich falsch mache ..

Meine bescheidene Entschuldigungen, wenn ich eine doppelte Frage gemacht haben .
bearbeiten:
Ich würde dankbar schätzen, wenn jemand mir sagen könnte, was an meiner Frage falsch ist, verdient eine -1. Ich weiß nicht, was zu beheben/verbessern ...

+0

sollte wahrscheinlich sein '„$ findcontainers“' bare Variablen sind in der Regel ein Fehler – Jasen

+0

Was genau Sie mit Ihrem 'sed' zu erreichen versuchen? – PesaThe

+0

@PesaThe Ich versuche, die Namen der Container zu isolieren, so dass mein Skript Befehle an die Container senden und Dateien in und aus den Containern ziehen/schieben kann. –

Antwort

0
findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]*$' 
echo "$active_containers" | grep "$findcontainers" 

3 bis 63 charcters entsprechen, und kein Bindestrich in erster oder letzter Stelle, je nach grep Versionen { entwertet werden muss oder nicht eine besondere haben Bedeutung.

findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]\{1,61\}[a-zA-Z0-9]$' 
echo "$active_containers" | grep "$findcontainers" 

sonst Gnu grep mit PCRE verwenden (-P Perl regex)

findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]{1,61}[a-zA-Z0-9]$' 
echo "$active_containers" | grep -P "$findcontainers" 

lxc Ausgang gegeben, kann das Muster Namen wegen RUNNING entsprechen bereits vielleicht gefiltertes helfen können sich bilden:

echo "$active_containers" | grep -Po "\b[a-zA-Z0-9][-a-zA-Z0-9]{1,61}[a-zA-Z0-9](?=\s*\| RUNNING)" 
  1. Variablen müssen zwischen doppelten Anführungszeichen stehen, wenn sie als Argument übergeben werden Befehle um Worttrennung zu vermeiden (aufgeteilt in mehrere Parameter).

  2. Das Tool zum Filtern von Übereinstimmungen ist grep, sed ist Ersatz zu machen.

    • ^ der Linie Anker beginnen Spiele leeren String
    • [ .. ] ist Zeichensatz, - in der ersten Position oder der letzten Bindestrich - gesetzt sonst definiert eine Reihe von Zeichen

    • * hinzufügen bedeutet 0 oder mehr Vorkommen

    • $ Ende der Linie Anker entspricht leere Zeichenfolge