2016-07-01 92 views
1

我試圖解析以下的輸出:解析Linux中的shell腳本

+--------------------------------------+-----------------+-----------+------+-----------+------+-------+-------------+-----------+ 
| ID         | Name   | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | 
+--------------------------------------+-----------------+-----------+------+-----------+------+-------+-------------+-----------+ 
| 1         | m1.tiny   | 512  | 1 | 0   |  | 1  | 1.0   | True  | 
| 2         | m1.small  | 2048  | 20 | 0   |  | 1  | 1.0   | True  | 
| 214b272c-e6a4-4bb5-96a4-c74c64984e5a | MC    | 2048  | 100 | 0   |  | 1  | 1.0   | True  | 
| 3         | m1.medium  | 4096  | 40 | 0   |  | 2  | 1.0   | True  | 
| 4         | m1.large  | 8192  | 80 | 0   |  | 4  | 1.0   | True  | 
| 5         | m1.xlarge  | 16384  | 160 | 0   |  | 8  | 1.0   | True  | 
| 71aa57d1-52e3-4499-abd2-23985949aeb4 | slmc   | 4096  | 32 | 0   |  | 2  | 1.0   | True  | 
| 7cf1d926-c904-47b8-af70-499196a1f65f | new test flavor | 1   | 1 | 0   |  | 1  | 1.0   | True  | 
| 97b3dc38-f752-437b-881d-c3415c8a682c | slstore   | 10240  | 32 | 0   |  | 4  | 1.0   | True  | 
+--------------------------------------+-----------------+-----------+------+-----------+------+-------+-------------+-----------+ 

它是開放堆棧口味的名單。我如下預期輸出:

m1.tiny;m1.small;MC;m1.medium;m1.large;m1.xlarge;slmc;new test flavor;slstore; 

我試了一下:

我想出了下面的命令解析:

nova flavor-list | grep '|' | awk 'NR>1 {print $4}' | tr '\n' ';' 

但問題是,命令返回輸出如下:

m1.tiny;m1.small;MC;m1.medium;m1.large;m1.xlarge;slmc;new;slstore; 

空間有問題我n new test flavor

+0

看起來像某些SQL風格的輸出。通常可以通過生成正確的輸出而不是解析人類可讀的輸出來讓生活更輕鬆。例如,在MySQL中,您可以僅使用'SELECT Name'並使用'--batch'(可能還有'--raw')來產生非表格輸出。使用sqlite3,你可以使用'-csv'或'-line'。 – rici

回答

2

下面的命令將使預期輸出

nova flavor-list | grep '|' | awk -F "|" 'NR>1 {print $3}' | tr '\n' ';' 

上面的命令會給輸出將空格即

$ nova flavor-list | grep '|' | awk -F "|" 'NR>1 {print $3}' | tr '\n' ';' 
m1.tiny   ; m1.small  ; MC    ; m1.medium  ; m1.large  ; m1.xlarge  ; slmc   ; new test flavor ; slstore   ; 

爲了讓輸出不含空格,請使用以下命令

$nova flavor-list | grep '|' | awk -F "|" 'NR>1 {print $3}' | awk -F "\n" '{gsub(/^[ \t]+|[ \t]+$/, "", $1)}1' | tr '\n' ';' 
m1.tiny;m1.small;MC;m1.medium;m1.large;m1.xlarge;slmc;new test flavor;slstore; 
+0

Thanks.yes它給出輸出,但認爲需要修剪它。 「m1.tiny; m1.small; MC; m1.medium; m1.large; m1.xlarge; slmc;新測試風格; slstore;」有分號之前的規格 – Dipak

+0

@Dipak,我編輯了我的答案 – Shubhangi

+0

謝謝它正在工作:) – Dipak

0

使用以下命令

sed -e '1,3d' < flavor-list | sed -e 's/-//g' | sed -e 's/+//g' | cut -f 3 -d "|" | sed -e 's/^ //g' | sed -e 's/\s\+$//g' | tr '\n' ';' 
0

軟件(無sed的,沒有AWK):

tail -n +4 flavor-list | grep -v '\-\-' | cut -d'|' -f3 | cut -d' ' -f2- | \ 
    tr -s ' ' | rev | cut -d' ' -f2- | rev | tr '\n' ';' ; echo 

慶典(不使用utils的全部):

while read a b c d ; do \ 
    d="${d/ [ |]*/}" ; \ 
    [ -z "$d" -o "$d" = Name ] && continue ; \ 
    echo -n "$d;" ; \ 
done < flavor-list ; echo 

輸出(兩者之一) :

m1.tiny;m1.small;MC;m1.medium;m1.large;m1.xlarge;slmc;new test flavor;slstore;