Bash 在循环中获取grep命令的输出

Bash 在循环中获取grep命令的输出,bash,function,shell,grep,Bash,Function,Shell,Grep,我有一个包含此搜索的shell脚本: find . -type f -exec grep -iPho "barh(li|mar|ag)" {} \; 我想捕获grep命令找到的每个字符串,并向它发送一个我将创建的命名解析器函数 parser(){ # do stuff with each single grep result found } 如何做到这一点? 是这样吗 find . -type f -exec grep -iPho "barh(li|mar|ag)" {parser $1

我有一个包含此搜索的shell脚本:

find . -type f -exec grep -iPho "barh(li|mar|ag)" {}  \;
我想捕获grep命令找到的每个字符串,并向它发送一个我将创建的命名解析器函数

parser(){ 
# do stuff with each single grep result found
}
如何做到这一点? 是这样吗

find . -type f -exec grep -iPho "barh(li|mar|ag)" {parser $1}  \;

我不想将整个find命令结果输出到您需要导出函数的函数

parser() {
  echo "GOT: $1"
}
export -f parser

find Projects/ -type f -name '*rb' -exec bash -c 'parser "$0"' {} \;
您还需要调用bash来执行该函数

parser() {
  echo "GOT: $1"
}
export -f parser

find Projects/ -type f -name '*rb' -exec bash -c 'parser "$0"' {} \;

只有shell可以执行函数。您需要在find中使用bash-c来执行它。这也是您需要导出函数的原因,以便新流程能够看到它

parser() { 
    while IFS= read -r line; do
        echo "Processing line: $line"
    done <<< "$1"
}

export -f parser
find . -type f -exec bash -c 'parser "$(grep -iPho "barh(li|mar|ag)" "$1")"' -- {} \;
编辑:非常好且简单的解决方案,不使用@gniourf_gniourf建议的bash-c:

parser() { 
   echo "Processing line: $1"
}

find . -type f -exec grep -iPho "barh(li|mar|ag)" {} + | while IFS= read -r line; do parser "$line"; done
这种方法工作得很好,它将逐个处理每一行。您也不需要使用这种方法导出函数。但是你必须关心一些可能让你吃惊的事情

管道中的每个命令都在其自己的子shell中执行,从该子shell返回后,解析器函数或while中的任何变量赋值都将丢失。如果您正在编写脚本,那么简单的shopt-slastpipe就足够了,可以在当前shell环境中运行最后一个pipe命令。或者,您可以使用流程替换:

parser() {
   echo "Processing line: $1"
}

while IFS= read -r line; do 
   parser "$line"; 
done < <(find . -type f -exec grep -iPho "barh(li|mar|ag)" {} +)

请注意,在前面的bash-c示例中,您将经历相同的行为,并且变量赋值也将丢失

我建议您使用sed,这是一个更强大的文本处理工具。 例如,我想在以ha结尾的行后面添加字符串myparse,我可以这样做

# echo "haha" > text1
# echo "hehe" > text2
# echo "heha" > text3
# find . -type f -exec sed '/ha$/s/ha$/ha myparse/' {} \;
haha myparse
heha myparse
hehe
如果您真的想替换文件,而不仅仅是打印到标准输出,您可以这样做

# find . -type f -exec sed -i '/ha$/s/ha$/ha myparse/' {} \;

注意,我说的是grep命令,而不仅仅是find命令。我试过这个:找到-类型f-execgrep-iphobarhli | mar | ag-execbash-c'parser$0'{}\;这给了我一个肯定的错误。但是缺少的2位是bash-c和export-重新。while-read循环:如果这是OP想要的,那么找到-执行官格雷普。。。{}+|读行时;不要使用$line;“完成”是一个很好的建议。@gniourf\gniourf谢谢你的建议!如果你不介意的话,我把它添加到了答案中。这对我来说很有用:找到-f型-exec grep-iPho barhli | mar | ag{}\|而IFS=读取-r行;不要使用$line;完成。。。注意\;而不是“+”。。。标记为答案的。谢谢。@john_black{}+效率更高。