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 吗?不是最有效的,但这里有一个 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 回答