为两个完全独立的事物 grep 并将值分配给单独的变量的最有效方法是什么?

Mik*_*e B 8 grep scripting bash variable

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)
Run Code Online (Sandbox Code Playgroud)

但这最终需要两次传球,而且效率极低。有没有更好的办法?希望有一个涉及更少通行证的解决方案?

slm*_*slm 11

1. 进入 1 个变量

尝试这个:

foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")
Run Code Online (Sandbox Code Playgroud)

这将运行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")
Run Code Online (Sandbox Code Playgroud)

3. 进入数组

您还可以将结果存储在数组中而不是单独的变量中。

output=$(curl https://domain.com/file.xml)
readarray foo < <(echo "$output" | grep "string1|string2")
Run Code Online (Sandbox Code Playgroud)

如果来自 grep 的结果可能不会返回结果,则处理这个有点棘手,因为来自“string2”的结果可能是数组中的第一个或第二个项目,但我在这里提供它只是作为演示该方法。

4. 从 grep 读入 vars

另一种使用read命令和进程替换 ( <( ..cmd..)) 的方法。

$ read -d"\n" foo1 foo2 \
   <(curl https://domain.com/file.xml | grep -E "string1|string2")
Run Code Online (Sandbox Code Playgroud)

如果对“string1”的搜索没有返回任何内容,导致“string2”的任何匹配出现在$foo1. 此外,这种方法往往不如上面的 #2 或 #3 便携。