Bash
對兩個完全獨立的事物進行 grep 並將值分配給單獨的變數的最有效方法是什麼?
CentOS 6.x
我想從 curl、grep 中獲取兩個完全獨立的字元串的輸出,並將它們各自的值分配為變數。最有效的方法是什麼(不將輸出寫入磁碟)?
通常我會想到有一個類似的腳本:
#!/usr/bin/env bash foo1=$(curl https://domain.com/file.xml | grep string1) foo2=$(curl https://domain.com/file.xml | grep string2)
但這最終需要通過兩次,而且效率非常低。有沒有更好的辦法?希望是一個涉及更少通行證的解決方案?
1. 進入 1 個變數
試試這個:
foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")
這將執行
curl
1 次並 grep 以查找string1
or的出現string2
。2. 進入 2 個變數
如果它們是不同的變數,則稍微改變策略。擷取的輸出,
curl
然後grep
。output=$(curl https://domain.com/file.xml) foo1=$(echo "$output" | grep "string1") foo2=$(echo "$output" | grep "string2")
3. Grepping 成一個數組
您還可以將結果儲存在數組中,而不是單獨的變數中。
output=$(curl https://domain.com/file.xml) readarray foo < <(echo "$output" | grep "string1|string2")
如果 grep 的結果可能不返回結果,則處理這個有點棘手,因為“string2”的結果可能是數組中的第一項或第二項,但我在這裡提供它只是為了展示該方法。
4. 從 grep 讀入 vars
另一種方法是使用
read
命令和程序替換 (<( ..cmd..)
)。$ read -d"\n" foo1 foo2 \ <(curl https://domain.com/file.xml | grep -E "string1|string2")
如果對“string1”的搜尋沒有返回任何結果,這又會很棘手,導致“string2”的任何匹配項出現在
$foo1
. 此外,這種方法往往不如上面的 #2 或 #3 便攜。