bash – 将shell参数传递给awk不起作用
为什么这样做
for myfile in `find . -name "R*VER" -mtime +1` do SHELLVAR=`grep ^err $myfile || echo "No error"` ECHO $SHELLVAR done 和产出 No error err ->BIST Login Fail 3922 err No error err ->IR Remote Key 1 3310 err 但事实并非如此 for myfile in `find . -name "R*VER" -mtime +1` do SHELLVAR=`grep ^err $myfile || echo "No error"` awk -v awkvar=${SHELLVAR} '{print awkvar}' done 和产出 awk: cmd. line:1: fatal: cannot open file `{print awkvar}' for reading (No such file or directory) 我错过了什么? 解决方法
$SHELLVAR是否包含空格?如果是这样,你的awk脚本会被误解,并且假定{print awkvar}是文件名而不是实际的AWK程序.
你也有一个问题,你的for循环和awk程序都在啜饮STDIN.事实上,你的for循环只会被执行一次,因为AWK将在所有STDIN中读取,直到它完成.最后,你会一遍又一遍地获得相同的行,然后你的程序将停止运行,因为awk等待更多的STDIN. 我想你想做这样的事…… find . -name "R*VER" -mtime +1 | while read myfile do echo "$SHELLVAR" | awk '{print $0}' done 这样,你的echo命令会输入你的awk,这将阻止awk从find语句中读取. 顺便说一句,你最好这样做: find . -name "R*VER" -mtime +1 | while read myfile do ... done 而不是这个: for myfile in `find . -name "R*VER" -mtime +1` do ... done 这有几个原因: >命令行缓冲区可能会溢出,您将丢失文件名,但您永远不会看到错误. 附录 现在我看到了just-my-correct-opinion的答案,我意识到你做错了什么:你忘了awk命令中的文件名: find . -name "R*VER" -mtime +1 | while read myfile do SHELLVAR=`grep ^err $myfile || echo "No error"` awk -v awkvar=${SHELLVAR} '{print awkvar}' $myfile done 现在,问题是你究竟在用awk做什么.除了$SHELVAR的值之外,您不会为文件中的每一行打印任何内容.这可能不是你想要做的.事实上,为什么不简单地这样做: find . -name "R*VER" -mtime +1 | while read myfile do SHELLVAR=$(grep -q "^err" $myfile") if [ "x$SHELLVAR" != "x" ] then echo "$SHELLVAR" fi done 这样,你打印出$SHELLVAR,但前提是$SHELLVAR为空. 或者,您可以使用awk仅打印出与正则表达式匹配的行: find . -name "R*VER" -mtime +1 | while read myfile do awk '/^err/ {print $0}' $myfile done (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |