|格雷普:无法打开 |grep:无法打开 grep

  • 本文关键字:grep 雷普 linux bash
  • 更新时间 :
  • 英文 :

FILTER="grep -w PROD | grep -v PROD_OPL"
if (/usr/ucb/ps auxww | grep $1/$2 | $FILTER > /dev/null)
then
  #do something
fi

给出输出:

grep: can't open |
grep: can't open grep
grep: can't open -v
grep: can't open PROD_OPL
grep: can't open |
grep: can't open grep
grep: can't open -v
grep: can't open PROD_OPL

我该如何解决?$FILTER需要动态。

存储命令以供以后使用,您将需要使用函数。

这是一个基本示例,它将执行您的两个特定grep命令:

function filter() { 
    grep -w PROD | grep -v PROD_OPL
}
if (/usr/ucb/ps auxww | grep $1/$2 | filter > /dev/null)
then
  #do something
fi

grep $1/$2的输出将其输入到函数的输入,该输入将其传递到管道,其输出传递到函数的输出。

该函数的返回代码被隐式留作其最后一个命令之一,因此if条件只有在过滤器匹配某些行时才是正确的。

就动态性而言,可以在任何时候重新定义该功能,因此您可以根据需要重新定义过滤器。一个更好的解决方案可能是对该函数进行参数化,以便根据需要实现所需的过滤器。

我需要更多的输入来提供足够的功能(甚至是足够的grep命令,REGEX可以很强大...(,但是您可以想象一个函数过滤线包含包含!和所有参数的任何一个和所有参数其他。

我相信发生了许多错误,因为Bash无法将|解释为管道,因为它只是FILTER内部的一个字符。因此,您需要实际评估$FILTER作为表达式。例如,尝试

FILTER="grep -w PROD | grep -v PROD_OPL"
if /usr/ucb/ps auxww | grep $1/$2 | eval "$FILTER" > /dev/null
then
  #do something
fi

编辑

在各种评论中清楚地说明:这最可能不是您应解决问题的方式。执行字符串作为代码很糟糕,可能是危险的设计。也就是说,如果您完全控制了FILTER的内容,那么它 can 是一个不错的hack。

最新更新