将grep输出重定向到文件

时间:2012-01-16 05:30:01

标签: bash shell sh

我不确定为什么代码中提供的重定向不起作用。每次运行脚本时,输出文件始终为空。有没有人对此有所了解?

感谢。

#!/bin/sh

LOOK_FOR="DefaultProblem"
FILES=`ls plugins/*source*.jar`

for i in $FILES
  do
    # echo "Looking in $i ..."
    unzip -p $i | grep -i $LOOK_FOR > output #> /dev/null 
    if [ $? == 0 ]
    then
      echo ">>>> Found $LOOK_FOR in $i <<<<"
    fi
  done

4 个答案:

答案 0 :(得分:9)

您可能希望使用>>(追加)代替>(覆盖)进行重定向:

unzip -p $i | grep -i $LOOK_FOR >> output #> /dev/null

由于您每次都在循环中执行此命令并覆盖文件output,如果使用grep的最后一个命令找不到任何匹配项,最后可能是空白解压缩输出行。

答案 1 :(得分:3)

你有三个问题

  1. 不要尝试解析ls的输出。相反,只需使用for i in plugins/*source*.jar主要原因是您的脚本将完全彻底打破名称中包含空格的任何文件。有关为何不解析ls
  2. 的一些原因,请参阅this link
  3. 您需要使用>>而不是>,因为后者将在循环的每次迭代时覆盖输出文件。前者将追加到它
  4. 使用更多报价!您需要引用变量以确保它们不会受到分词
  5. 此外,您可以内联if测试。所以把它们放在一起我们有:

    #!/bin/sh
    
    LOOK_FOR="DefaultProblem"
    for i in plugins/*source*.jar
    do
        # echo "Looking in $i ..."
        if unzip -p "$i" | grep -i "$LOOK_FOR" >> output #> /dev/null
        then
          echo ">>>> Found $LOOK_FOR in $i <<<<"
        fi
    done
    

答案 2 :(得分:2)

您可以重定向整个循环的输出:

#!/bin/sh

LOOK_FOR="DefaultProblem"
FILES=`ls plugins/*source*.jar`

for i in $FILES ; do
    # echo "Looking in $i ..." 1>&2
    unzip -p $i | grep -i $LOOK_FOR
    if [ $? == 0 ] ; then
        echo ">>>> Found $LOOK_FOR in $i <<<<" 1>&2
    fi
done > output

请注意,我已将诊断消息重定向到stderr。

答案 3 :(得分:0)

您可以在一个for loop命令中执行所有操作,而不是if conditionalfind

find /path/to/plugins -name "*source*.jar" -exec sh -c 'unzip -l "{}" | grep -q DefaultProblem' \; -print