在Bash中匹配For循环中的数字列表

时间:2016-04-28 12:31:20

标签: bash if-statement curl awk

我有一个循环遍历curl命令的脚本,该命令从API中提取数据。

LIST_OF_ID=$(curl -s -X POST -d "username=$USER&password=$PASS&action=action" http://link.to/api.php)

for PHONE_NUMBER in $(echo $LIST_OF_ID | tr '_' ' ' | awk '{print $2}');
do
  $VOIP_ID = $(echo $LIST_OF_ID | tr '_' ' ' | awk '{print $1}')
done

我还有一个16个数字的变量,范围为" 447856321455 "

NUMBERS=$(cat << EOF
441111111111
441111111112
441111111113
... etc
)

API调用的输出是:

652364_441111111112

正如您可能已经注意到我已将输出切换为2个部分并将其放入变量中。

我需要的是匹配输出中的6位数代码,其中输出中的数字与变量中的数字匹配。

我已尝试使用if语句,但我无法正确理解这种做法。

任何帮助都将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

我会使用join而不是bash中的循环来实现。像这样:

curl -s -X POST -d "$PARAMS" "$URL" | sort \
  | join -t _ -2 2 -o 2.1 <(sort numbers.txt) -

这样做是从curl获取排序后的输出,并将其与numbers.txt的已排序内容相结合(您也可以使用$NUMBERS),使用_作为分隔符,使用文件2的列2-表示stdin(来自curl)。然后输出字段2.1,即六位数ID。

答案 1 :(得分:0)

阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice然后执行以下操作:

curl ... |
awk -v numbers="$NUMBERS" -F'_' '
    BEGIN { split(numbers,tmp,/[[:space:]]+/); for (i in tmp) nums[tmp[i]] }
    $2 in nums
'

但说实话我真的不知道你要做什么,因为你的样本输入中的数字似乎彼此不匹配(in the range of "447856321455"是什么意思,它与$有什么关系?包含441111111111441111111113的NUMBER,以及与match the 6 digit code有何关联的数字,并且缺少预期的输出。