加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 将shell参数传递给awk不起作用

发布时间:2020-12-15 22:23:48 所属栏目:安全 来源:网络整理
导读:为什么这样做 for myfile in `find . -name "R*VER" -mtime +1`do SHELLVAR=`grep ^err $myfile || echo "No error"` ECHO $SHELLVARdone 和产出 No errorerr -BIST Login Fail 3922 err No errorerr -IR Remote Key 1 3310 err 但事实并非如此 for myfile i
为什么这样做

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

这有几个原因:

>命令行缓冲区可能会溢出,您将丢失文件名,但您永远不会看到错误.
>第二个示例中的find命令必须先完成,然后才能开始执行for循环.在第一个示例中,查找提供到while循环中.

附录

现在我看到了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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读