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
没关系
也许 if($3==$i) 在 shell 中是错误的,谁能帮助我?
解决方案
你$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
或变得更专业时,请回来查看评论。;)
推荐阅读
- java - Java 语义 - 有没有办法写得更好?
- c# - 如何在 blazor 服务器端本地化验证消息 (DataAnnotationsValidator)
- c# - 有没有办法让 SQL 启动 C# 应用程序
- php - 如何将 Array 中的数组与 foreach 循环合并?
- python - Keras的欧几里得距离
- java - 我可以使用 LDAP 仅对 Active Directory 进行授权吗?
- android - React-native - 显示特定区域而不是使用整个地图
- php - PHP / AJAX:删除数据行后,AJAX 表单不会保留在同一页面上
- linux - 从 git 就地诱导命令下载项目文件
- android - 无法通过 Retrofit Coroutine api 调用获得响应