2013-01-24 79 views
1

通過對命令行的請求,我得到一個csv格式的響應。這是文件:取出NAME字段的值並將其放入一個變量中,

"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" 

有了一個腳本,我想取的名字字段的值,並把它放在一個變量, 你能幫助我嗎?

+1

你想要什麼要處理您的示例輸出,包含2個名稱值。使用第一個,最後一個或兩個。如果你有兩行以上的數據呢?回答這些問題是上述問題的一部分。祝你好運。 – shellter

+0

只有一個NAME值以分號分隔。 – askmish

回答

1

這是示例代碼。

#!/bin/sh 
OLDIFS=$IFS 
IFS=; 
while read f1 f2 f3 
do 
    echo "Name variable is    :$f3" 

done<filename.csv 
IFS=$OLDIFS 

第三個字段是「名稱」,它是在f3中的變量中賦值的。這裏可以顯示兩次。

+0

這裏的IFS應該是分號。 – askmish

+0

@askmish,謝謝我會編輯我的回答 –

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 

注意:這只是您的問題的一種方法。有幾種方法可以實現你的要求。

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),如果它是({下次})

對於每隔一行它檢查它在引號

妥善地包封上移動
if($3 ~ /^[^"].*[^"]$/){$3="\""$3"\""}; 

然後打印出由';'分隔的第3列, (即naem列)後跟一個空格。

printf $3 " " 

這然後擴大了$()以名稱的空間分隔的列表,例如

declare NAMES=(name1 name2) 

然後執行聲明這產生所謂的與每個名字作爲一個單一的元素名稱的數組。所以:

x.txt是你在你的問題中給出的輸出。

[email protected]$ 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" 

[email protected]$ declare NAMES=($(cat x.txt | awk -F ';' 'NR==1{next}; { if($3 ~ /^[^"].*[^"]$/){$3="\""$3"\""}; printf $3 " " }')) 

[email protected]$ echo ${NAMES[@]} 
"LiveStream2" "Live Stream" 
+0

謝謝,謝謝,謝謝!我解決了它! –

2

如果你不知道名字是第三場,你必須在標題行中去尋找它:

awk -F \; ' 
    NR==1 { 
     for (i=1; i<=NF; i++) { 
      if ($i == "\"NAME\"") { 
       name_field = i 
       break 
      } 
     } 
     next 
    } 
    { print $name_field } 
' < filename 

這個輸出

"LiveStream2" 
"LiveStream" 
相關問題