需要一个脚本来迭代下面的文件来读取键、值并提取值,例如。 foo_key1、foo.com、/tmp/worker${Build_Number} 将键和值分配给另一个变量(例如 A="foo_key1"、B="foo.com"、C="/tmp/worker${构建_编号}”)。
cat abc.txt
foo_key1=foo.com|/tmp/worker${Build_Number}
foo_key2=goo.com|/tmp/manager${Build_Number}
我已经尝试过下面的代码,但没有运气。
while IFS== read -r key val ; do
val=${val%\"}; val=${val#\"}; key=${key#export };
A="$(cut -d'_' -f1 <<<"$key")"
B="$(cut -d'_' -f1 <<<"$val")"
C="$(cut -d'_' -f2 <<<"$val")"
echo $A
echo $B
echo $C
done < abc.txt
预期输出:
foo_key1
foo.com
/tmp/worker${Build_Number}
答案1
只需使用 awk 进行分割=
或|
打印 3 列,然后使用read
将列分配给变量
awk -F '[=|]' '{print $1, $2, $3}' abc.txt | while read A B C; do
echo $A
echo $B
echo $C
done
您还可以在大括号前添加正则表达式来过滤数据,例如,'/\S+/ {print $1, $2, $3}'
这使用正则表达式来匹配超过 1 个非空格字符,从而跳过空白行
答案2
你可以试试 :
while IFS='|=' read A B C ; do
echo "$A"
echo "$B"
echo "$C"
done < abc.txt
答案3
您的代码将从这些修订中受益:
#!/bin/bash
cat abc.txt | while IFS= read -r line ; do
A=$(echo $line | sed -e 's/=/ /g;s/|/ /g' | awk '{print $1}')
B=$(echo $line | sed -e 's/=/ /g;s/|/ /g' | awk '{print $2}')
C=$(echo $line | sed -e 's/=/ /g;s/|/ /g' | awk '{print $3}')
echo $A
echo $B
echo $C
done
foo_key1
foo.com
/tmp/worker${Build_Number}
foo_key2
goo.com
/tmp/manager${Build_Number}