如何将awk模式作为变量并循环结果?

时间:2019-04-19 00:03:53

标签: shell awk grep

我将关键字指定为变量,并且需要使用该变量从文件中唤醒并循环。该文件有数百万行。

我尝试了以下代码。

   DEVICE="DEV2"
    while read -r line
    do
    echo $line

    X_keyword=`echo $line | cut -d ',' -f 2  | grep -w "X" |  cut -d '=' -f2`

   echo $X_keyword

   done <<< "$(grep -w $DEVICE $config)"

   log="Dev2_PRT.log"

   while read -r file
    do

        VALUE=`echo $file | cut -d '|' -f 1`
        HEADER=`echo $VALUE | cut -c 1-4`
        echo $file


        if [[ $HEADER = 'PTR:' ]]; then

            VALUE=`echo $file | cut -d '|' -f 4`
            echo $VALUE
            XCOORD+=($VALUE)
            ((X++))
        fi

    done <<<  "awk /$X_keyword/ $log"

预期结果:

日志文件的内容如下: PTR:1 | 2 | 3 | 4 | X_keyword PTR:1 | 2 | 3 | 4 | Y_rest .....

过滤X_keyword并获取字段4。

1 个答案:

答案 0 :(得分:2)

不幸的是,您的shell脚本只是解决此问题的错误方法(出于某些原因,请参见https://unix.stackexchange.com/q/169716/133219),因此您应该将其放在一旁并重新开始。

为演示该解决方案,让我们创建一个示例输入文件:

$ seq 10 | tee file
1
2
3
4
5
6
7
8
9
10

和一个用于容纳正则表达式的shell变量,该正则表达式是5、6或7个字符的字符列表:

$ var='[567]'

现在,根据上述输入,以下是如何g/re/p pattern as variable and count how many results的解决方案:

$ awk -v re="$var" '$0~re{print; c++} END{print "---" ORS c+0}' file
5
6
7
---
3

如果这还不是您所需要的,请编辑您的问题以阐明您的要求,并提供简洁,可测试的样本输入和预期输出。