【问题标题】:Unix Shell - Parsing file value into a variableUnix Shell - 将文件值解析为变量
【发布时间】:2016-12-07 06:09:37
【问题描述】:

如何将字符串分配给如下变量:

输入内容:

+++    USCDB        2016-07-29 20:19:53 PGW    #036326 %%/*HWHandle=12547*/LST EPS:IMSI="515020211157018";%% RETCODE = 0 SUCCESS0001:Operation is successful

                          IMSI = 515020211157018
                          ISDN = 632000000016
                           EPS = NOTPROV
                        ANCHOR = FALSE
                        ICSIND = FALSE

Total count = 5

There is together 1 report

---    END
+++    USCDB        2016-07-29 20:19:53 PGW    #036331 %%/*HWHandle=12547*/LST EPS:IMSI="515020211157020";%% RETCODE = 0
SUCCESS0001:Operation is successful

                          IMSI = 515020211157020
                          ISDN = 632000000018
                           EPS = PROV
                     AMBRMAXUL = 7104000
                     AMBRMAXDL = 15200000
               RATFREQSELPRIID = 256
                        ANCHOR = FALSE
                        ICSIND = FALSE
                           MPS = FALSE
                      TAUTIMER = 0
                           MDT = NOTGIVEN
                   LTEAUTOPROV = FALSE
                    RELAY_NODE = FALSE
                     EPSODBPOS = NOBPOS
                  LTE_M2M_FLAG = FALSE

Total count = 15

There is together 1 report

虽然我目前使用 grep 和 awk 来获取上述值。

IMSI=$(echo $LINE | grep 'IMSI' | awk -F'=' '{print $2}')  
ISDN=$(echo $LINE | grep 'ISDN' | awk -F'=' '{print $2}')  
EPS=$(echo $LINE | grep 'EPS =' | awk -F'=' '{print $2}') 

AMBRMAXUL=$(echo $LINE | grep 'AMBRMAXUL' | awk -F'=' '{print $2}') 

AMBRMAXDL=$(echo $LINE | grep 'AMBRMAXDL' | awk -F'=' '{print $2}')

但是在打印时,所有的 IMSI 值都将存储在一个变量中

预期输出:

515020211157018 632000000016 NOTPROV  
515020211157020 632000000018 PROV 7104000 15200000

【问题讨论】:

  • 变量是否包含空格,例如AMB RMAXUL是否允许?
  • @shellter : 你可能破坏了预期输出的格式
  • hm...我所做的只是使用{} 工具。如果您认为它是错误的,请随时修改。祝大家好运。
  • 不要将grep 传递给awkecho $LINE | grep 'IMSI' | awk -F'=' '{print $2}' 写得更好echo $LINE | awk -F= '/IMSI/{print $2}'
  • 您输入的第二份报告中的END 标记是否真的缺失?

标签: shell parsing unix awk grep


【解决方案1】:

只需使用外壳:

#!/bin/bash

while read line
do
    case ${line%% *} in
        IMSI) IMSI=${line##* }
              ;;
        ISDN) ISDN=${line##* }
              ;;
        EPS) EPS=${line##* }
             ;;
        AMBRMAXUL) AMBRMAXUL=${line##* }
             ;;
        AMBRMAXDL) AMBRMAXDL=${line##* }
             ;;
        ---) echo $IMSI $ISDN $EPS $AMBRMAXUL $AMBRMAXDL
             unset IMSI ISDN EPS AMBRMAXUL AMBRMAXDL
             ;;
    esac
done < test.in

让我们测试一下:

$ bash test.sh
515020211157018 632000000016 NOTPROV
515020211157020 632000000018 PROV 7104000 15200000

顺便说一句,上面预计每条记录都以 --- END 结尾,这似乎是第一条记录的情况,但不是第二条。

【讨论】:

  • 您好先生,感谢您的建议,假设我将使用此代码。您能否确认以下代码是否适合为 AMBRMAXUL 和 AMBRMAXDL 的值添加条件。 > AMBRMAXUL) AMBRMAXUL=${line##* } > ;; > AMBRMAXDL) AMBRMAXDL=${line##* } > ;; > ---) 如果 [ $EPS = "PROV" ];然后 > 回声 $IMSI $ISDN $EPS $AMBRMAXUL $AMBRMAXDL > 其他 > 回声 $IMSI $ISDN $EPS > fi > ;;输出:>515020211172557 632000005500 PROV 7104000 15200000 >515020211172560 632000005503 NOTPROV
  • 如果我想得那么远,我会这样做的。
【解决方案2】:

假设记录包含AMBRMAXUL & AMBRMAXDL 仅当EPS = PROV 时,下面应该可以解决问题:

awk '/^[[:blank:]]*IMSI[[:blank:]]+|^[[:blank:]]*ISDN[[:blank:]]+/{printf "%s ",$3}
      /^[[:blank:]]*EPS[[:blank:]]+/{if($3 == "PROV"){printf "%s",$3}else{print $3};check=0}
      /^[[:blank:]]*AMBRMAXUL[[:blank:]]+|^[[:blank:]]*AMBRMAXDL[[:blank:]]+/{check++;val=val" "$3}
       check == 2 {print val;val="";check=0}' file

会给你

515020211157018 632000000016 NOTPROV
515020211157020 632000000018 PROV 7104000 15200000

这就是你要找的东西。

我使用了print,它让我可以将\n(不太便携)硬编码到脚本中。

【讨论】:

  • 所以为了明确起见,awk '...' file | while read imsi isdn eps; do ... : things with "$imsi" and "$isdn" and "$eps"; done 将允许您循环遍历这些值。这应该很容易扩展以添加更多值,并且比重复 echoing 整个文件更有效(最重要的是,您在没有引用的情况下这样做,但这是一个单独的问题)以及更易于维护和可读.
  • 还要注意我是如何将你的变量转换为小写的;大写是为系统变量保留的。
  • @tripleee :注意到你的第一点。但我在此处的 awk 脚本之外没有任何变量。
  • 我的意思主要是针对 OP。抱歉不清楚。
  • 谢谢先生!这会有很大帮助:)
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 2011-12-11
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2013-04-09
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多