需要帮助在 shell 程序中打印正确的合约输出

问题描述 投票:0回答:1

我想从输入中得到预期的输出。

我编写了下面的程序来获得预期的输出,我几乎得到了输出,但我在这里面临的唯一问题是逗号的位置。该程序在输出中随机插入逗号。帮我改正吧。

输入:

Tenant                       : PROD
Application                  : PROD_ANP
AEPg                         : EPG_VL-408
BD                           : BD-VL-408
uSeg EPG                     : no
Intra EPG Isolation          : unenforced
Proxy ARP                    : none
Policy Tag                   : 49165
Vlan Domains                 : PROD_PhysDom
Consumed Contracts           : Cont_EPG_VL-408_EPG_VL-491,Cont_EPG_VL-408_EPG_VL-450,Cont_
                              EPG_VL-408_EPG_VL-492,Cont_EPG_VL-408_EPG_VL-446,Cont_EPG_VL
                              -408_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-408_EPG_VL-443,Cont
                              _EPG_VL-408_EPG_VL-454,Cont_EPG_VL-408_EPG_VL-449,Cont_EPG_V
                              L-408_EPG_VL-445,Cont_EPG_VL-408_EPG_VL-444,Cont_EPG_VL-408_
                              EPG_VL-452,Cont_EPG_VL-408_EPG_VL-451,Cont_EPG_VL-408_EPG_VL
                              -447,Cont_EPG_VL-408_EPG_VL-448,Cont_EPG_VL-408_EPG_VL-441,C
                              ont_EPG_VL-408_EPG_VL-442
Provided Contracts           : Cont_EPG_VL-408_EPG_VL-491,Cont_EPG_VL-408_EPG_VL-450,Cont_
                              EPG_VL-408_EPG_VL-492,Cont_EPG_VL-408_EPG_VL-446,Cont_EPG_VL
                              -408_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-408_EPG_VL-454,Cont
                              _EPG_VL-408_EPG_VL-441,Cont_EPG_VL-408_EPG_VL-447,Cont_EPG_V
                              L-408_EPG_VL-445,Cont_EPG_VL-408_EPG_VL-444,Cont_EPG_VL-408_
                              EPG_VL-452,Cont_EPG_VL-408_EPG_VL-451,Cont_EPG_VL-408_EPG_VL
                              -443,Cont_EPG_VL-408_EPG_VL-448,Cont_EPG_VL-408_EPG_VL-449,C
                              ont_EPG_VL-408_EPG_VL-442

Tenant                       : PROD
Application                  : PROD_ANP
AEPg                         : EPG_VL-409
BD                           : BD-VL-409
uSeg EPG                     : no
Intra EPG Isolation          : unenforced
Proxy ARP                    : none
Policy Tag                   : 49165
Vlan Domains                 : PROD1_PhysDom
Consumed Contracts           : Cont_EPG_VL-499_EPG_VL-491,Cont_EPG_VL-499_EPG_VL-450,Cont_
                              EPG_VL-499_EPG_VL-492,Cont_EPG_VL-499_EPG_VL-446,Cont_EPG_VL
                              -499_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-499_EPG_VL-443,Cont
                              _EPG_VL-499_EPG_VL-454,Cont_EPG_VL-499_EPG_VL-449,Cont_EPG_V
                              L-499_EPG_VL-445,Cont_EPG_VL-499_EPG_VL-444,Cont_EPG_VL-499_
                              EPG_VL-452,Cont_EPG_VL-499_EPG_VL-451,Cont_EPG_VL-499_EPG_VL
                              -447,Cont_EPG_VL-499_EPG_VL-448,Cont_EPG_VL-499_EPG_VL-441,C
                              ont_EPG_VL-499_EPG_VL-442
Provided Contracts           : Cont_EPG_VL-408_EPG_VL-491,Cont_EPG_VL-408_EPG_VL-450,Cont_
                              EPG_VL-408_EPG_VL-492,Cont_EPG_VL-408_EPG_VL-446,Cont_EPG_VL
                              -408_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-408_EPG_VL-454,Cont
                              _EPG_VL-408_EPG_VL-441,Cont_EPG_VL-408_EPG_VL-447,Cont_EPG_V
                              L-408_EPG_VL-445,Cont_EPG_VL-408_EPG_VL-444,Cont_EPG_VL-408_
                              EPG_VL-452,Cont_EPG_VL-408_EPG_VL-451,Cont_EPG_VL-408_EPG_VL
                              -443,Cont_EPG_VL-408_EPG_VL-448,Cont_EPG_VL-408_EPG_VL-449,C
                              ont_EPG_VL-408_EPG_VL-442

节目:

#!/bin/bash

# Initialize variables to hold the values
current_consumed_contracts=""

# Function to print the current values
print_values() {
    echo "$current_consumed_contracts"
}

# Read input line by line
while IFS= read -r line; do
    # If the line starts with "Consumed Contracts", extract and format the value
    if [[ "$line" == "Consumed Contracts"* ]]; then
        # Extract the consumed contracts value
        current_consumed_contracts=$(echo "$line" | cut -d ':' -f 2 | tr -d '[:space:]')
        # Read the next line and append it to consumed contracts until it starts with another field
        while IFS= read -r next_line && [[ ! "$next_line" =~ ^[A-Za-z].* ]]; do
            # Concatenate the values with a comma and without space
            current_consumed_contracts+="$(echo "$next_line" | tr -d '[:space:]'),"
        done
    # If the line starts with any other field, print the consumed contracts and reset the value
    elif [[ "$line" =~ ^[A-Za-z].* ]]; then
        if [ -n "$current_consumed_contracts" ]; then
            print_values
            current_consumed_contracts=""
        fi
    fi
done < input.txt

# Print the final consumed contracts value
if [ -n "$current_consumed_contracts" ]; then
    print_values
fi

获取输出:(逗号定位不正确)

Cont_EPG_VL-408_EPG_VL-491,Cont_EPG_VL-408_EPG_VL-450,Cont_EPG_VL-408_EPG_VL-492,Cont_EPG_VL-408_EPG_VL-446,Cont_EPG_VL,-408_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-408_EPG_VL-443,Cont,_EPG_VL-408_EPG_VL-454,Cont_EPG_VL-408_EPG_VL-449,Cont_EPG_V,L-408_EPG_VL-445,Cont_EPG_VL-408_EPG_VL-444,Cont_EPG_VL-408_,EPG_VL-452,Cont_EPG_VL-408_EPG_VL-451,Cont_EPG_VL-408_EPG_VL,-447,Cont_EPG_VL-408_EPG_VL-448,Cont_EPG_VL-408_EPG_VL-441,C,ont_EPG_VL-408_EPG_VL-442,
Cont_EPG_VL-499_EPG_VL-491,Cont_EPG_VL-499_EPG_VL-450,Cont_EPG_VL-499_EPG_VL-492,Cont_EPG_VL-499_EPG_VL-446,Cont_EPG_VL,-499_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-499_EPG_VL-443,Cont,_EPG_VL-499_EPG_VL-454,Cont_EPG_VL-499_EPG_VL-449,Cont_EPG_V,L-499_EPG_VL-445,Cont_EPG_VL-499_EPG_VL-444,Cont_EPG_VL-499_,EPG_VL-452,Cont_EPG_VL-499_EPG_VL-451,Cont_EPG_VL-499_EPG_VL,-447,Cont_EPG_VL-499_EPG_VL-448,Cont_EPG_VL-499_EPG_VL-441,C,ont_EPG_VL-499_EPG_VL-442,

预期输出:

Cont_EPG_VL-408_EPG_VL-491,Cont_EPG_VL-408_EPG_VL-450,Cont_EPG_VL-408_EPG_VL-492,Cont_EPG_VL-408_EPG_VL-446,Cont_EPG_VL-408_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-408_EPG_VL-443,Cont_EPG_VL-408_EPG_VL-454,Cont_EPG_VL-408_EPG_VL-449,Cont_EPG_VL-408_EPG_VL-445,Cont_EPG_VL-408_EPG_VL-444,Cont_EPG_VL-408_EPG_VL-452,Cont_EPG_VL-408_EPG_VL-451,Cont_EPG_VL-408_EPG_VL-447,Cont_EPG_VL-408_EPG_VL-448,Cont_EPG_VL-408_EPG_VL-441,Cont_EPG_VL-408_EPG_VL-442
Cont_EPG_VL-499_EPG_VL-491,Cont_EPG_VL-499_EPG_VL-450,Cont_EPG_VL-499_EPG_VL-492,Cont_EPG_VL-499_EPG_VL-446,Cont_EPG_VL-499_EPG_VL-471,Cont_EXT_EPG,Cont_EPG_VL-499_EPG_VL-443,Cont_EPG_VL-499_EPG_VL-454,Cont_EPG_VL-499_EPG_VL-449,Cont_EPG_VL-499_EPG_VL-445,Cont_EPG_VL-499_EPG_VL-444,Cont_EPG_VL-499_EPG_VL-452,Cont_EPG_VL-499_EPG_VL-451,Cont_EPG_VL-499_EPG_VL-447,Cont_EPG_VL-499_EPG_VL-448,Cont_EPG_VL-499_EPG_VL-441,Cont_EPG_VL-499_EPG_VL-442
bash
1个回答
0
投票

这看起来您想要将整个事情重构为 Awk 脚本。

awk '/^Consumed Contracts *:/ { cc=1; consumed = $0;
    sub(/^Consumed Contracts *: */, "", consumed); next }
  /^Provided Contracts *:/ { print consumed; cc = 0 }    
  cc { sub(/^ */, ""); consumed = consumed $0 }
 END { if (cc) print consumed }'

演示:https://ideone.com/wnXiiN

© www.soinside.com 2019 - 2024. All rights reserved.