0

以下はファイルです

TMPQM>CSQN205I   COUNT=     213, RETURN=00000000, REASON=00000000
CSQM401I ?TMPQM
QUEUE(Q1)                     TYPE(QLOCAL)
QSGDISP(QMGR)             CURDEPTH(0)
CSQM401I ?TMPQM
QUEUE(Q2)                     TYPE(QLOCAL)
QSGDISP(QMGR)             CURDEPTH(23)
CSQM401I ?TMPQM
QUEUE(Q3)               TYPE(QLOCAL)
QSGDISP(QMGR)             CURDEPTH(150)
CSQM401I ?TMPQM

私の意図は、値を取得することです。

Q=Q1
V=0

Q=Q2
V=23

Q=Q3
V=150
4

3 に答える 3

0

バッシュは使えますか?最も効率的ではありませんが、bash スクリプトは次のとおりです。

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

count=1
for queue in `grep "QUEUE" input.txt`
do
    # Strip the beginning up to (
    q1="${queue#*(}"
    # Strip the end from ) on
    q2="${q1%%)*}"
    q[$count]=$q2
    count=$((count+1))
done

count=1
for value in `grep "CURDEPTH" input.txt`
do
    # Strip the beginning up to (
    v1="${value##*(}"
    # Strip the end from ) on
    v2="${v1%)*}"
    v[$count]=$v2
    count=$((count+1))
done

for index in 1 2 3
do
    echo "Q=${q[$index]}"
    echo "V=${v[$index]}"
done
IFS=$SAVEIFS

ファンシー for ループは、bash でスペースを含む行をループ処理するためのものです。

于 2012-07-30T17:44:16.247 に答える
0

pcregrep と sed の組み合わせが仕事をします。pcregrep は -M オプションで複数行の一致をサポートします

-bash-3.2$ pcregrep -M -o '^QUEUE[(](.+?)[)].*\n.*CURDEPTH[(](\d+?)[)]$' trial.txt | sed -e 's/^QUEUE(\([^)]\+\)).*$/Q=\1/g' -e 's/.*CURDEPTH(\([^)]\+\))/V=\1/g'  
Q=Q1
V=0
Q=Q2
V=23
Q=Q3
V=150
于 2012-07-30T17:44:23.503 に答える
0

私の解決策:

grep -oP '(?<=QUEUE|CURDEPTH)\S+' input.txt | tr -d '()' | (while read NAME && read VAL; do echo $NAME=$VAL; done)

出力を簡単にフォーマットできるため、@cravooriのソリューションよりも少し柔軟です。その行の出力は...

Q1=0
Q2=23
Q3=150

...これは、、 などsourceを使用して直接読み取ることができます。$Q1$Q2

于 2012-07-31T06:32:59.337 に答える