2016-08-08 9 views
0

Ich brauche einen Teil der Zeichenfolge abhängig von einem Wert aus einer langen Zeichenfolge (zum Beispiel einige Ausgabe von ps -ef).bash script get substring von string

zum Beispiel Quelle string:

long_string1="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc." 

oder

long_string2="cmd ... -aaaa=A -DHOME=/home/user/xxx -bbbb=B -zzzz=Z -cccc=C ... etc." 

ich extrahieren oder erhalten folgende subtring erst nach -DHOME =:

/home/user/xxx 

Position von "-DHOME = "ist nicht fest, es könnte irgendwo in long_string sein.

Ich verwende folgenden Befehl:

echo $long_string1|sed -e 's/.*-DHOME=//g;s/ -cccc=C.*//g' 

es für $ long_string1 funktioniert gut, aber es funktioniert nicht für $ long_string2.

Es wird nur funktionieren, wenn "-cccc = C" wird netx sein "-DHOME =" :-(

Wie kann ich Pfad erhalten, nachdem "-DHOME =", aber nicht ist abhängig von folgenden Werten zB "-cccc = C" ???

gibt es eine effektivere Art und Weise oder regexp zu gleiche Ausgabe zu erhalten?

Dank M.Gi

+0

OR, wenn Sie Sachen vor '-DHOME =' entfernt haben, für den ersten Platz suchen und alles danach löschen? d.h. 's /. * $ // ''? Viel Glück. – shellter

+0

unterstützt Ihre Shell 'var =" abc def "; echo $ {var/*} '? – shellter

+0

Auch in der Zukunft, ** diese ** ist, warum Sie ständig Kommentare sehen ** zeigen Sie uns Ihren Code **. Lass die Leute nicht raten, was du tust ;-) – shellter

Antwort

1

awk und kann Ihnen helfen.

#!/bin/bash 
get_home() { awk -F "DHOME=" '{print $2}' <<< "${long_string}" | cut -d ' ' -f1; } 

long_string="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc." 
get_home 
long_string="cmd ... -aaaa=A -DHOME=/home/user/xxx -bbbb=B -zzzz=Z -cccc=C ... etc." 
get_home 
long_string="cmd ... -aaaa=A -DHOME=/home/user/xxx" 
get_home 

Ausgabe

/home/user/xxx 
/home/user/xxx 
/home/user/xxx 

awk teilt den Eingang auf "Dhome =" und druckt den zweiten Teil.
spaltet dann auf Leerzeichen und erhält den ersten Teil. Offensichtlich wird dies nicht korrekt funktionieren, wenn der Name des Ordners Leerzeichen enthält. Normalerweise haben Home-Verzeichnisse keine Leerzeichen in ihren Namen.

+1

Gut Idee über die Verwendung von DHOME = als 'FS', aber Sie müssen nicht zu schneiden, dh' awk-F 'DHOME =' '{line = $ 2; split (line, arr, ""); print arr [ 1)} <<< "$ long_string" 'funktioniert auch. Viel Glück für alle. – shellter

+0

das sieht auch gut aus, es ist genau das, was ich suche ... –

1

Lösung in pure-bash-Stil, Kredite an shelter für Anregungen.

#!/bin/bash 

long_string="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc." 

tempString1="${long_string##*-DHOME=}" # Strips off everything upto '-DHOME=' 
tempString2="${tempString1/ *}" # Strips off everything until first whitespace 

echo "$tempString2" 

es in der Konsole ausführen: -

$ ./myScript.sh 
/home/user/xxx