2017-06-28 2 views
0

ich den folgenden Befehl ausführen:String mit bash und weisen auf eine Variable

xinput | grep Razer 

die Ausgabe

⎜ ↳ Razer Razer Abyssus      id=12 [slave pointer (2)] 

wie kann ich die ID erhalten, weisen Sie auf eine Variable, so kann ich wiederverwenden es später im Skript? Die ID ändert sich.

Antwort

2

Sie können über die Pipeline Ihr Befehl sed:

yourvar=$(xinput | sed '/Razer/s/.*id=\([0-9]*\).*/\1/') 
  • /Razer/: Wenn eine Linie Razer enthält
  • s/.*id=\([0-9]*\).*/\1/ gefunden wird: Nehmen Sie den Wert id und drucken Sie es Rückreferenzierung verwenden.
1

grep Lösung: Hier, wenn eine Linie Razer von ID gefolgt enthält dann die ID gedruckt wird. Hier perl Regex wird verwendet, indem -p Flag grep Befehl verwendet wird. \K bedeutet, alles links davon zu ignorieren.

xinput |grep -oP 'Razer.*id=\K[^ ]+' 
12 

Mit gawk ‚s Match-Funktion:

awk '/Razer/{match($0,/id=([^ ]+)/,a);print a[1]}' 
12 
0

wenn Sie GNU AWK haben oder gawk Sie die unten zu tun.

id=$(xinput | awk '/Razer/{printf "%s",gensub(/^.*id=[[:digit:]]*).*$/,"\\1",$0)}') 
+1

Hallo, willst du deine Regex in '/^.* id = ([[: digit:]]] *) ändern? *). * $ /'? –

+0

@PS: Du hast Recht, es ist passiert, dass '' '' getrimmt wurde, als ich den Befehl von meiner VM kopiert habe. – sjsam