データブロックからキーと値のペアを取得する

データブロックからキーと値のペアを取得する

Q:EPS_PROFILE_ID、MMEFEATURELISTの組み合わせを持つ340039などで始まるすべてのIMSIリストが必要です。

入力する

<BEGINFILE>
<SUBBEGIN
    IMSI=340039XXXXXXXXX;
    MSISDN=59995171393;
    EPS_PROFILE_ID=1;
    PLMNTPLID=1;
    SUB_DYN_EPS_ID=1;
    MMEHOST=XXXXXXXXXXXXXXXXXXXXXXXXXX.VVV.VV;
    MMEREALM=dwcxd.dnhjxcdws.cdnjkcd;
    EPS_IMEI=155186158551851658;
    EPS_IMEISV=01;
    MMEFEATURELIST=ALL_APN;
    MMETIMESTAMP=15513535;
    S4SGSNTIMESTAMP=0;
    HLR_INDEX=1;
    LTEAUTOPROV=NO;
    MPS=NO;
    RELAY=NO;
<SUBEND
<SUBBEGIN
IMSI=340038XXXXXXXXX;
    MSISDN=59995171393;
    PLMNTPLID=1;
    CURRENTNAM=BOTH;
    CAT=COMMON;
    TBS=TS11&TS12&TS21&TS22&TS61&BS26&BS2G;
    VLRLIST=2;
    SGSNLIST=2;
<SUBEND
<ENDFILE>

希望の出力

IMSI=340039XXXXXXXXX;EPS_PROFILE_ID=1;MMEFEATURELIST=ALL_APN;

ベストアンサー1

私はperlこの種の分析を好む

perl -ne '
    $/ = "\n<SUBBEGIN\n";                     # Read blocks starting with this pattern
    ($i) = /\b(IMSI=340039[^;]*)/;            # Get IMSI and value
    ($e) = /\b(EPS_PROFILE_ID=[^;]+)/;        # Get EPS_PROFILE_ID and value
    ($m) = /\b(MMEFEATURELIST=[^;]+)/;        # Get MMEFEATURELIST and value
    print "$i;$e;$m;\n" if $i && $e && $m;    # Print result only if all three items are present
' input_file

例の出力

IMSI=340039XXXXXXXXX;EPS_PROFILE_ID=1;MMEFEATURELIST=ALL_APN;

おすすめ記事