Sed non funziona in aspettiamo
Domanda
Ho fatto questo bash one-liner, che io uso per elenco Weblogic istanze in esecuzione, insieme con i loro percorsi.Questo funziona bene quando ho eseguito dalla shell.
/usr/ucb/ps auwwx | grep weblogic | tr ' ' '\n' | grep security.policy | grep domain | awk -F'=' '{print $2}' | sed 's/weblogic.policy//' | sed 's/security\///' | sort
Ho provato ad inserire questo in uno script expect
send "echo Weblogic Processes: ; /usr/ucb/ps auwwx | grep weblogic | tr ' ' '\n' | grep security.policy | grep domain | awk -F'=' '{print \$2}' | sed 's/weblogic.policy//' | sed 's/security\///' | sort ; echo ; echo\r"
ma ho ottenuto questo errore sed:-e l'espressione #1, char 13:opzione sconosciuta `s'
Si prega di aiutare
Soluzione
Senza un attento conteggio o test, mi piacerebbe provare ad aggiungere un altro \
dopo la "sicurezza\", o, eventualmente, con l'eliminazione di quella esistente.
Inoltre, è possibile combinare i due sed in uno: sed -e 's/weblogic.policy//' -e 's/security\///'
Altri suggerimenti
Probabilmente il \
carattere
sed 's/security\///'
ha bisogno di un extra di fuga in si aspettano contesto, ad esempio,
send "echo Weblogic Processes: ; /usr/ucb/ps auwwx | grep weblogic | tr ' ' '\n' | grep security.policy | grep domain | awk -F'=' '{print \$2}' | sed 's/weblogic.policy//' | sed 's/security\\///' | sort ; echo ; echo\r"
L'uso di Tcl operatore {} invece di virgolette per racchiudere la stringa che si desidera inviare.Il {} sintassi in Tcl è equivalente alla singola offerta in bash, che significa "stringa letterale, non interpretare il contenuto".
All'interno di {} mettere esattamente ciò che si vuole Tcl/Aspettare di inviare al sottoprocesso, carattere per carattere, senza alcun citando richiesto.
Penso che questo è troppo complesso per inviare oltre a un host remoto.Invece, mettere i comandi in un piccolo script di shell ed eseguire.In questo modo, non sarà possibile eseguire in difficoltà a causa delle quote di espansione regole, in fuga, etc.
Inoltre, si dovrebbe utilizzare ssh
invece di expect
per l'esecuzione di script. expect
è per l'esecuzione di comandi interattivi come ftp
che non hanno un'adeguata capacità di scripting.
puoi provare a rimuovere le virgolette ed eseguire nuovamente il comando.
send "....... sed s/weblogic.policy// | sed s/security\/// ..."
Più probabilmente, citando problemi.Se non è ok, prova il suggerimento da hlovdal
nel frattempo, alcuni dei vostri lunga comandi possono essere combinati
/usr/ucb/ps auwwx |grep weblogic| tr ' ' '\n'|awk '/security.policy/&&/domain/{gsub("weblogic.policy|security","",$2);print $2}|sort