从文件中grep特定值并将其分配给变量

时间:2012-07-30 16:57:24

标签: shell

以下是文件

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

3 个答案:

答案 0 :(得分: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

花哨的循环只是为了处理在bash中用空格循环的行。

答案 1 :(得分: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

答案 2 :(得分: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等直接阅读