如果条件匹配错误,为什么要awk

时间:2018-12-29 01:36:08

标签: shell 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

还可以

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

2 个答案:

答案 0 :(得分:0)

您的$i是shell变量,但是它位于引号'内,因此awk会尝试解释它而不是shell。

尝试一下:

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

请注意,$i位于'标记之间,这意味着它位于将由awk解释的块之外,这意味着它应该由外壳程序解释。

还请注意,如果输入文件中有空行,则awk命令将为if($3==),这是无效的,并且会产生错误。

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

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

请注意,即使这不是一个很好的解决方案,但仅通过这些更改,您就已经有了很多思考。如果您更熟悉awk或变得更加专业,请回来查看注释。 ;)

答案 1 :(得分:0)

如果使用这两个文件需要用户名,则可以尝试

$ cat 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

$ cat userid.txt
6534
4524
4522
6635

$ awk -F":" ' { if( NR==FNR ) { a[$3]=$1; next } ;  if(a[$1]) print a[$1] }' userpwinfo.txt userid.txt
nsgg319_YYM
nsgg317_CPA