捕獲作業系統命令的輸出

返回字元向量的函式

Base R 有兩個用於呼叫系統命令的函式。兩者都需要一個額外的引數來捕獲系統命令的輸出。

system("top -a -b -n 1", intern = TRUE) 
system2("top", "-a -b -n 1", stdout = TRUE)

兩者都返回一個字元向量。

  [1] "top - 08:52:03 up 70 days, 15:09,  0 users,  load average: 0.00, 0.00, 0.00"     
  [2] "Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie"            
  [3] "Cpu(s):  0.9%us,  0.3%sy,  0.0%ni, 98.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st"  
  [4] "Mem:  12194312k total,  3613292k used,  8581020k free,   216940k buffers"        
  [5] "Swap: 12582908k total,  2334156k used, 10248752k free,  1682340k cached"         
  [6] ""                                                                                
  [7] "  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            "
  [8] "11300 root      20   0 1278m 375m 3696 S  0.0  3.2 124:40.92 trala              "
  [9] " 6093 user1     20   0 1817m 269m 1888 S  0.0  2.3  12:17.96 R                  "
 [10] " 4949 user2     20   0 1917m 214m 1888 S  0.0  1.8  11:16.73 R                  "

例如,使用 UNIX 命令 top -a -b -n 1。這是特定於作業系統的,可能需要進行修改才能在你的計算機上執行示例。

devtools 具有執行系統命令並捕獲輸出而無需額外引數的功能。它還返回一個字元向量。

devtools::system_output("top", "-a -b -n 1") 

返回資料幀的函式

data.table 中的 fread 函式允許執行 shell 命令並讀取像 read.table 這樣的輸出。它返回 data.tabledata.frame

fread("top -a -b -n 1", check.names = TRUE)
       PID     USER PR NI  VIRT  RES  SHR S X.CPU X.MEM     TIME.         COMMAND
  1: 11300     root 20  0 1278m 375m 3696 S     0   3.2 124:40.92           trala
  2:  6093    user1 20  0 1817m 269m 1888 S     0   2.3  12:18.56               R
  3:  4949    user2 20  0 1917m 214m 1888 S     0   1.8  11:17.33               R
  4:  7922    user3 20  0 3094m 131m 1892 S     0   1.1  21:04.95               R

注意,fread 自動跳過了前 6 個標題行。

這裡新增了引數 check.names = TRUE,將%CPU%MENTIME+轉換為語法上有效的列名。