首页 > 解决方案 > 如果条件匹配错误为什么要 awk

问题描述

在我的项目中,我有两个文件。

内容用户 ID 是:

6534
4524
4522
6635

内容 userpwinfo.txt 是:

nsgg315_RJ:x:4520:100::/home-gg/users/nsgg315_RJ:/bin/bash
nsgg316_ZJY:x:4521:100::/home-gg/users/nsgg316_ZJY:/bin/bash
nsgg317_CPA:x:4522:100::/home-gg/users/nsgg317_CPA:/bin/bash
nsgg318_ZRL:x:4523:100::/home-gg/users/nsgg318_ZRL:/bin/bash
nsgg319_YYM:x:4524:100::/home-gg/users/nsgg319_YYM:/bin/bash

现在我想打印 id 在 userid 中的用户名。我写了一个 bash shell,如:

for i in $(cat userid)
do
  #username=`awk -F: '{if($3=="$i") print $1}' /root/userpwinfo.txt`
  #username=`awk -F: '$3=="$i" {print $1}' /root/userpwinfo.txt`
  #username=`awk -F: '{if($3~/$i/) print $1}' /root/userpwinfo.txt`
   username=`awk -F: '{if($3==$i) print $1}' /root/userpwinfo.txt`
   echo $username
done

但不幸的是,它什么也没显示。正确的结果应该是:

nsgg319_YYM
nsgg317_CPA

我在命令行中尝试过:

awk -F: '{if($3==4524) print $1}' /root/userpwinfo.txt

没关系

也许 if($3==$i) 在 shell 中是错误的,谁能帮助我?

标签: shellawk

解决方案


$i是 shell 变量,但它在引号内,'所以awk会尝试解释它而不是 shell。

尝试这个:

username=`awk -F: '{if($3=='$i') print $1}' /root/userpwinfo.txt`

请注意,在标记$i之间',这意味着它在将由 解释的块之外,awk这意味着它应该由 shell 解释。

另请注意,如果您在输入文件中有一个空行,那么您的 awk 命令将if($3==)是无效的并且会产生错误。

我还想评论一下,awk这意味着有一个过滤器和一个执行块。if除非您想要一些不寻常的东西,否则您不需要在块内写入。意思是,您的命令将更恰当地写为:

username=`awk -F: '($3=='$i'){print $1}' /root/userpwinfo.txt`

请注意,即使这也不是一个很好的解决方案,但您已经有很多需要考虑的只是这些更改。当您更熟悉awk或变得更专业时,请回来查看评论。;)


推荐阅读