Bash 在循环中获取grep命令的输出
我有一个包含此搜索的shell脚本: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
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{}+效率更高。