2017-10-13 158 views
0

所有的數字我有一個在遠程機器上運行shell:命令,該命令返回類似這樣擊捕捉順序

ok: [proxmox] => { 
    "CONTAINER_INFO": { 
     "changed": true, 
     "cmd": "pct list | grep -w test", 
     "delta": "0:00:00.463029", 
     "end": "2017-10-13 22:21:22.428399", 
     "failed": false, 
     "rc": 0, 
     "start": "2017-10-13 22:21:21.965370", 
     "stderr": "", 
     "stderr_lines": [], 
     "stdout": "100  stopped     test    ", 
     "stdout_lines": [ 
      "100  stopped     test    " 
     ] 
    } 
} 

我唯一需要的有用的信息,在這種情況下對stdout數量簡單Ansible戲100

有沒有辦法將此過濾出來,如grep命令,它將僅返回100

到目前爲止最好的我是這樣的:

ok: [proxmox] => { 
    "CONTAINER_INFO": { 
     "changed": true, 
     "cmd": "pct list | grep -w test | grep -Eo [[:digit:]]", 
     "delta": "0:00:00.477083", 
     "end": "2017-10-13 22:26:03.258617", 
     "failed": false, 
     "rc": 0, 
     "start": "2017-10-13 22:26:02.781534", 
     "stderr": "", 
     "stderr_lines": [], 
     "stdout": "1\n0\n0", 
     "stdout_lines": [ 
      "1", 
      "0", 
      "0" 
     ] 
    } 
} 

純猛砸

[email protected]:~# pct list | grep -w "test" 
100  stopped     test 
[email protected]:~# pct list | grep -w "test2" 
101  running     test2 

名單並沒有真正幫助我在這種情況下。

任何幫助表示感謝,並提前感謝。

回答

0

使用AWK

$ cat input.txt | awk 'match($0, /"stdout":\s*"([0-9]+)/,a){print a[1]}' 
100 

使用perl的

$ cat input.txt | perl -n -e '/"stdout":\s+"(\d+)/ && print $1,"\n"' 
100 
+0

這是一個通用的bash答案。雖然它可以在Ansible中工作,但我認爲過濾器是更好的選擇。 –

+0

OP沒有提到有效的版本。過濾器僅從版本2.2開始工作。所以,是的,我的解決方案是通用的。不,它不是bash,它適用於任何外殼。 –

+0

我得到的輸出就是這個'100停止測試'的例子,所以當我嘗試用上述任何一種方法進行過濾時,我在-e第1行附近得到'語法錯誤,在\「+附近)perl和'語法錯誤在或接近['for awk。由於某種原因,我無法逃脫或者我做錯了某些事情 –

1

我認爲你正在尋找Ansible filters。這將允許您在Ansible中本地使用正則表達式獲取值100

+0

不幸的是,過濾器並不能幫助我,因爲它會返回「101」:「101」',但是感謝您花時間回答。 –