如何在shell程序中grep变量?

时间:2009-11-30 06:06:00

标签: bash shell grep

#!/bin/bash

for ((var=0; var<20; var++))
do
echo " Number is: $(grep 'Multiple_Frame = echo **$var**'  20mrf.txt | wc -l)" >>statisic.txt 

done

这个shell程序无法产生正确的结果,这可能是第二个grep命令中返回错误变量的原因。

如何在第二个echo句中grep一个变量?根据var的变化来改变不同的东西?

非常感谢!

5 个答案:

答案 0 :(得分:4)

正如其他人所说,问题在于单引号会阻止变量的扩展。但是,使用$()可以使用双引号:

echo " Number is: $(grep "Multiple_Frame = echo **$var**"  20mrf.txt | wc -l)" >>statisic.txt

虽然我怀疑这样的意思是你的意思:

echo " Number is: $(grep "Multiple_Frame = $var"  20mrf.txt | wc -l)" >>statisic.txt

您还应该知道,grep可以选择输出计数,以便省略wc

echo " Number is: $(grep -c "Multiple_Frame = $var"  20mrf.txt)" >>statisic.txt

答案 1 :(得分:2)

@OP,按照这种方式做的事情效率很低。你在同一个文件上调用grep和wc 20次。只打开一次文件,并在文件内容的1次迭代中获得所需的所有内容。 bash 4.0中的示例

declare -A arr
while read -r line
do  
    case "$line" in
        *"Multiple_Frame ="*) 
            line=${line#*Multiple_Frame = }
            num=${line%% *}
            if [ -z ${number_num[$num]} ] ;then
               number_num[$num]=1
            else
                number_num[$num]=$(( number_num[$num]+1 ))
            fi
            ;;
    esac    
done <"file"
for i in "${!number_num[@]}"
do
    echo "Multiple_Frame = $i has ${number_num[$i]} counts"
done

同样,您可以在gawk中使用关联数组来帮助您完成此任务。

gawk '/Multiple_Frame =/{
  sub(/.*Multiple_Frame = /,"")
  sub(/ .*/,"")
  arr["Multiple_Frame = "$0]=arr["Multiple_Frame = "$0]+1  
}END{
    for(i in arr) print i,arr[i]
}' file

答案 2 :(得分:1)

您必须将每个替换存储在变量中。像这样:

#!/bin/bash

for ((var=0; var < 20; var++))
do

count=`grep "Multiple_Frame = $var"  20mrf.txt | wc -l`
echo " Number is: $count" >> statisic.txt 

done

答案 3 :(得分:1)

好的,第二个[原文如此]问题是你在第5行的引用。对$ var的引用永远不会被扩展,因为它包含在单引号中。您可以使用转义双引号(')替换单引号(\")来解决此问题。

第一个[原文如此]问题是你试图在一行中做太多,这会导致嵌套问题引用。将该行分成多个命令,根据需要存储中间结果。是的,它可能会慢一点,但你会节省很多时间来调试和维护它。

  

交易者的第二定律:如果您必须在优化性能和优化可维护性之间做出选择,请务必选择使代码更易于维护。计算机一直在变快;程序员没有。

答案 4 :(得分:0)

$(...)中的字符串引用单引号('...')此引号可防止变量扩展。请改用双引号。在你的情况下:

#!/bin/bash

for ((var=0; var<20; var++))
do
echo " Number is: $(grep 'Multiple_Frame = echo **'"$var"'**'  20mrf.txt | wc -l)" >>statisic.txt 

done

请注意,在此示例中,似乎已打开echo命令的双引号,但您应该注意首先评估$(...),并且其中没有双引号。因此,此处的更改是关闭grep打开双引号的单引号,然后关闭双引号并稍后重新打开单引号。

这个冗长的解释说明了将表达分开的好处,正如其他答案所暗示的那样。