Die besseren Befehle wurden ja schon genannt.
Allgemein kannst Du in der Shell die Ausgaben von Befehlen in Variablen schreiben lassen, so sparst Du Dir die temporäre Datei. Das läuft unter dem Stichwort "Command Substitution".
Im Deinem Beispiel hätte man also z.B. sowas machen können:
PIDS=$( ps ax | grep 'openvpn --daemon --log /var/log/openvpn.log --config /home/' | grep -v 'grep' | awk '{print $1}' )
Danach hätte die Variable PID die gefundenen PIDs.
Über diese könntest Du dann iterieren mit:
for PID in $PIDS ; do
kill $PID
done
Wenn man denn bei dem Konstrukt bleiben möchte, so hätte man es mit awk etwas einfacher bauen können, awk kann alles was Du brauchst.
Mit etwas vereinfachtem Pattern sieht das dann so aus:
PIDS=$( ps ax | awk '/[o]penvpn --daemon/ {print $1}' )
Die [] sorgen dafür, dass der awk Befehl selbst nicht matcht, da [o] im Pattern einem normalen "o" entspricht. Die Aktion in {} gibt die erste Spalte (PID) aus.