Bash

對兩個完全獨立的事物進行 grep 並將值分配給單獨的變數的最有效方法是什麼?

  • March 4, 2014

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")

這將執行curl1 次並 grep 以查找string1or的出現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 便攜。

引用自:https://unix.stackexchange.com/questions/118018