2017-10-13 1 views
0

Ich habe einfach ansible Spiel, das shell: Befehl auf dem entfernten Rechner läuft, die so etwas wie dieseBash Capture alle Zahlen in Folge

ok: [proxmox] => { 
    "CONTAINER_INFO": { 
     "changed": true, 
     "cmd": "pct list | grep -w test", 
     "delta": "0:00:00.463029", 
     "end": "2017-10-13 22:21:22.428399", 
     "failed": false, 
     "rc": 0, 
     "start": "2017-10-13 22:21:21.965370", 
     "stderr": "", 
     "stderr_lines": [], 
     "stdout": "100  stopped     test    ", 
     "stdout_lines": [ 
      "100  stopped     test    " 
     ] 
    } 
} 

Die einzigen nützlichen Informationen Ich brauche Rückkehr ist die Nummer auf den stdout in diesem Fall 100.

Gibt es eine Möglichkeit, dies herauszufiltern wie grep Befehl, der nur 100 zurückgibt?

Bisher Beste, was ich habe, ist dies:

ok: [proxmox] => { 
    "CONTAINER_INFO": { 
     "changed": true, 
     "cmd": "pct list | grep -w test | grep -Eo [[:digit:]]", 
     "delta": "0:00:00.477083", 
     "end": "2017-10-13 22:26:03.258617", 
     "failed": false, 
     "rc": 0, 
     "start": "2017-10-13 22:26:02.781534", 
     "stderr": "", 
     "stderr_lines": [], 
     "stdout": "1\n0\n0", 
     "stdout_lines": [ 
      "1", 
      "0", 
      "0" 
     ] 
    } 
} 

Reines Bash

[email protected]:~# pct list | grep -w "test" 
100  stopped     test 
[email protected]:~# pct list | grep -w "test2" 
101  running     test2 

Liste hilft mir nicht wirklich in diesem Fall.

Jede Hilfe wird geschätzt und danke im Voraus.

Antwort

0

Mit awk:

$ cat input.txt | awk 'match($0, /"stdout":\s*"([0-9]+)/,a){print a[1]}' 
100 

Mit Perl:

$ cat input.txt | perl -n -e '/"stdout":\s+"(\d+)/ && print $1,"\n"' 
100 
+0

Dies ist eine generische Bash-Antwort. Während es in Ansible funktionieren würde, denke ich, Filter sind eine bessere Option. –

+0

OP erwähnt keine mögliche Version. Filter funktionieren erst ab Version 2.2. Also, ja, meine Lösung ist generisch. Und nein, es ist keine Bash, es funktioniert auf jeder Shell. –

+0

Die Ausgabe, die ich bekomme, ist dieser '100 gestoppte Test' zum Beispiel, wenn ich versuche, dies mit einer der obigen Methoden zu filtern; Ich bekomme 'Syntaxfehler bei -e Zeile 1, nahe \ "+) für Perl und' Syntaxfehler bei oder nahe ['für awk. Aus irgendeinem Grund kann ich nicht entkommen oder ich mache etwas falsch. –

1

Ich glaube, Sie für Ansible filters suchen. Dies würde es Ihnen ermöglichen, den Wert 100 mit einem Regex nativ innerhalb von Ansible zu erhalten.

+0

Leider hilft mir der Filter hier nicht, da er "101" zurückgibt: "101", aber danke, dass du dir die Zeit genommen hast zu antworten. –

Verwandte Themen