我有一个文本文件,我需要从同一文本得到2个变量并把它们放在一个命令状
for i in `cat TEXT | grep -i UID | awk '{print($2)}'` &&
x in `cat TEXT | grep -i LOGICAL | awk '{print($4)}'`
do
echo "naviseccli -h 10.1.1.37 sancopy -create -incremental -name copy_$i -srcwwn $x -destwwn xxxxxxxxxxxxxxxxxxxxxx -verify -linkbw 2048" >> OUTPUT
done
有来实现这一目标时存储管理员和需要做吨的命令,所以我需要得到这个脚本做任何可能的方式
你可以使用文件描述符。 此外,你的cat
, grep
, awk
命令可以合并成一个单一的awk
命令:
exec 5< <(awk '{IGNORECASE=1}/UID/ {print $2}' TEXT)
exec 6< <(awk '{IGNORECASE=1}/LOGICAL/ {print $4}' TEXT)
while read i <&5 && read x <&6
do
echo command $i $x # Do something with i and x here!
done
执行cat
第一运算,并将结果保存成两个阵列。 然后你就可以在一个阵列的索引迭代,并使用相同的索引也进入另一个。
见http://tldp.org/LDP/abs/html/arrays.html约在bash阵列。 特别请参见“ 实施例27-5。加载脚本的内容到一个数组 ”。
与资源,你应该能够既填充您的阵列,然后同时处理它们。
因为你的话没有在他们的空间(由于使用的awk
),你可以使用:
paste <(grep -i UID TEXT | awk '{print($2)}') \
<(grep -i LOGICAL TEXT | awk '{print($4)}') |
while read i x
do
echo "naviseccli -h 10.1.1.37 sancopy -create -incremental -name copy_$i -srcwwn" \
"$x -destwwn xxxxxxxxxxxxxxxxxxxxxx -verify -linkbw 2048" >> OUTPUT
done
它使用进程替换给paste
两个文件,它拼在一起。 每一行上会有两个领域,这是读入i
和x
在循环体中使用。
请注意,有没有必要使用cat
; 你有资格获得一个UUOC(无用的使用cat
奖)。
伊马采取野生猜测, UID
和LOGICAL
必须是在你收到的同一行TEXT
,在这种情况下,这实际上可能使一些意识和工作:
cat TEST | awk '/LOGICAL/ && /UID/ { print $2, $4 }' | while read i x
do
echo "naviseccli -h 10.1.1.37 sancopy -create -incremental -name copy_$i -srcwwn" \
"$x -destwwn xxxxxxxxxxxxxxxxxxxxxx -verify -linkbw 2048"
done
文章来源: for loop in bash to get more than 1 variables to use it in one command [closed]