2016-08-29 4 views
0

Unter OSX verwende ich die Funktion system(), um Befehle im Terminal von der R-Konsole als Teil eines Skripts auszuführen, das ich geschrieben habe. Das Skript benötigt eine Verbindung zu einer MySQL() -Datenbank über einen SSH-Tunnel, und ich tippe in die Befehlszeile "ps aux | grep ssh", um zu sehen, mit welchen Tunneln ich verbunden bin. Zum Beispiel einige Ausgaben:
.R - Ausführen von Befehlen im Terminal und Speichern der Ausgabe auf einem Datenrahmen

> system("ps aux | grep ssh") 
Home   50915 0.0 0.0 2501204 3264 ?? S 10:32AM server info 
Home   50092 0.0 0.0 2504172 3048 ?? Ss 9:35AM server2 info 
Home   50090 0.0 0.0 2501372 480 ?? Ss 9:35AM server3 info 
Home    1155 0.0 0.0 2544220 1368 ?? S Thu07PM server4 info 
Home   51333 0.0 0.0 2434840 800 ?? S 11:00AM 0:00.00 grep ssh 
Home   51331 0.0 0.0 2438508 1124 ?? S 11:00AM 0:00.00 sh -c ps aux | grep ssh 

.
Ich möchte diese Ausgabe in einen Datenrahmen verwandeln, kann aber nicht. Funktionen wie as.data.frame(system("ps aux | grep ssh")) funktionieren nicht so, wie ich hoffe, dass sie funktionieren.

Irgendwelche Gedanken dazu würden geschätzt!

EDIT - wollte nur Fehler markieren von einem Kommentar

vorgeschlagen
> read.table(pipe("ps aux | grep ssh")) 
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    line 1 did not have 34 elements 
> pipe("ps aux | grep ssh") 
     description    class    mode    text    opened   can read   can write 
"ps aux | grep ssh"    "pipe"     "r"    "text"   "closed"    "yes"    "yes" 
+0

Was haben Sie es nur Rohtext ist, der als data.frame analysiert werden muss. Versuchen Sie 'read.table (pipe (" ps aux | grep ssh "))' stattdessen. – MrFlick

Antwort

2

Erstes Rohr die Ausgabe einer tatsächlichen Textdatei:

> system("ps aux | grep ssh") > output.txt 

in dieser Datei in R Lesen Sie dann read.table mit:

Hinweis: Mit sep="" (das ist die Standardeinstellung f oder tatsächlich) behandelt jede Art/Menge von Leerzeichen als Delimeter zwischen den Spalten. Dies sollte die Ausgabe abdecken, die Sie von Ihrem Aufruf an Linux erhalten.

+1

gute Idee, danke! – Canovice

0

Sie können ein wenig näher (zu einem Zeichen Vektor) mit intern=TRUE erhalten:

as.data.frame(system("ps aux | grep ssh", intern=TRUE)) 
Verwandte Themen