2012-07-30 139 views
0

下面是該文件grep的特定值,並將其分配給一個變量

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 
+0

如果您發佈的代碼,XML或數據樣本,**請**在文本編輯器中高亮顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以精確地格式化和語法突出顯示它!這樣,你不需要所有那些雜亂的'
'標籤! – 2012-07-30 17:09:57

+0

您將重新分配給Q將清除以前的值。所以現在假設你真的需要閱讀每個這些Q值並且用它們來處理,問題就複雜得多了......如何通過Q,Q 1,Q 2,Q 3的每次傳遞來保持Q,重新處理?祝你好運。 – shellter 2012-07-30 17:15:08

+0

我在每個新任務上在stdout上打印Q值。謝謝.. – Vignesh 2012-08-04 16:06:51

回答

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空格線循環的幻想。

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 
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,直接讀取等

相關問題