通过对命令行发出的请求,我得到了csv格式的响应。这是文件:
"STACK";"STACK_ID";"NAME";"DESCRIPTION";"CREATION_TIME";"DELETION_TIME";"STATUS"
"STACK";"arn:aws:cloudformation:us-west-1:222222222222:stack/LiveStream2/00000000-6000-00e2-acd3-333333333333";"LiveStream2";"(nil)";"2013-01-23T16:01:36Z";"2013-01-23T16:22:57Z";"DELETE_COMPLETE"
"STACK";"arn:aws:cloudformation:us-west-1:444444444444:stack/LiveStream/00000000-6000-00e2-acd3-222222222222";"LiveStream";"(nil)";"2013-01-23T13:53:13Z";"2013-01-23T15:20:29Z";"DELETE_COMPLETE"
使用脚本我想取NAME字段的值并将其放在变量中, 你能救我吗?
答案 0 :(得分:2)
如果您不知道NAME是第3个字段,则必须在标题行中搜索它:
awk -F \; '
NR==1 {
for (i=1; i<=NF; i++) {
if ($i == "\"NAME\"") {
name_field = i
break
}
}
next
}
{ print $name_field }
' < filename
此输出
"LiveStream2"
"LiveStream"
答案 1 :(得分:1)
这是示例代码。
#!/bin/sh
OLDIFS=$IFS
IFS=;
while read f1 f2 f3
do
echo "Name variable is :$f3"
done<filename.csv
IFS=$OLDIFS
第三个字段是“NAME”,它在f3中的变量中赋值。这里varable显示两次。
答案 2 :(得分:1)
切割命令应该适合你:
例如,如果您的文件是test.txt
,
cat test.txt| cut -d';' -f3
将获得字段3。
如果要逐行存储值,请使用:
for i in `cat test.txt`
do
MYVAR=$(echo $i| cut -d';' -f3)
//do something with the variable $MYVAR
done
注意:这只是您问题的一种方法。有几种方法可以实现您的要求。
答案 3 :(得分:1)
Awk将是我最好的选择。
declare NAMES=( $( cmd_that_generates_output | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""}; printf $3 " " }' ) )
所以bash执行comand subsititution,即$()cmd内的所有内容都会生成你的csv并将其传递给awk。
Awk检查输入是否是第一行(NR == 1),如果是({next})则继续
对于其他所有行,它会检查它是否正确包含在引号
中if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};
然后打印出由';'分隔的第3列(即naem列)后跟一个空格。
printf $3 " "
然后将$()扩展为空格分隔的名称列表,例如
declare NAMES=( name1 name2 )
然后执行declare,创建一个名为NAMES的数组,每个名称作为单个元素。这样:
x.txt是您在问题中提供的输出。
pete.mccabe@jackfrog$ cat x.txt
"STACK";"STACK_ID";"NAME";"DESCRIPTION";"CREATION_TIME";"DELETION_TIME";"STATUS"
"STACK";"arn:aws:cloudformation:us-west-1:222222222222:stack/LiveStream2/00000000-6000-00e2-acd3-333333333333";"LiveStream2";"(nil)";"2013-01-23T16:01:36Z";"2013-01-23T16:22:57Z";"DELETE_COMPLETE"
"STACK";"arn:aws:cloudformation:us-west-1:444444444444:stack/LiveStream/00000000-6000-00e2-acd3-222222222222";Live Stream;"(nil)";"2013-01-23T13:53:13Z";"2013-01-23T15:20:29Z";"DELETE_COMPLETE"
pete.mccabe@jackfrog$ declare NAMES=( $( cat x.txt | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""}; printf $3 " " }' ) )
pete.mccabe@jackfrog$ echo ${NAMES[@]}
"LiveStream2" "Live Stream"