简体   繁体   中英

Parsing in Linux shell script

I am trying to parse the output below:

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

It is the list of flavours in open-stack. I am expecting output as below:

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

What I tried:

I came up with below command for parsing:

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

but the issue is that the command returns output as follows:

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

There is a problem with the space in new test flavor .

Below command will give expected output

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

Above command will give output will white spaces ie

$ 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         ;

To get output without white spaces use below command

$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;

使用以下命令

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' ';'

Software tools (no sed , no awk ):

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

Pure bash (uses no utils at all):

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

Output (either one):

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM