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


8

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)

但这最终要花两遍,而且效率极低。有没有更好的办法?希望解决方案涉及更少的通行证吗?

Answers:


10

1.放入1个变量

尝试这个:

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

这将运行curl1次,并在出现string1或时运行grep string2

2.放入2个变量

如果它们是不同的变量,则略微改变策略。捕获curl然后的输出grep

output=$(curl https://domain.com/file.xml)
foo1=$(echo "$output" | grep "string1")
foo2=$(echo "$output" | grep "string2")

3.进入数组

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

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更具便携性。


抱歉! 我有错字了。变量实际上是不同的。:-(摘要现已更新。
迈克乙

您可能要注意,建议的流程替换远非可移植选项。
mikeserv 2014年

@mikeserv-感谢您的反馈,已更新。
slm

3
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

认真的,但是,伙计,有大约一百万种方法可以给这只猫剥皮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.