在我的项目中,我有两个文件。
内容用户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中是错误的,谁可以帮助我?
答案 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