这是初学bash课程中作业问题的一部分。 我需要引入passwd文件,我已经使用我的passfile变量,然后我需要能够提取它的某些部分并显示不同的字段。当我使用下面的语句从CLI手动grep时它工作正常。我想要所有的变量,我得到了所有这些。
grep 1000 passfile | cut -c1-
但是,当我从脚本执行此操作时,它会在用户全名的第一个“空格”处停止或中断或重新开始。当我只想要一条时,John D. Doe将返回3条线。我通过回显i和以下的值来看到这一点。
for i in `grep 1000 ${passfile} | cut -c1-
user=`echo $1 | cut -d : -f1`
userID=`echo $1 | cut -d : -f3`
例如,如果该行读取
jdoe:x:123:1000:John D Doe:/home/jdoe:/bin/bash
我得到以下内容:
i = jdoe:x:123:1000:John
给了我: 用户是jdoe,UID是509
然后在下一行我从R开始。
i = R.所以用户是R.,UID是R.
下一行
i = Johnson:/home/jjohnson:/bin/bash
返回User是Johnson,UID是/ bin / bash
passwd文件包含许多用户,因此我需要使用for循环来处理它们。我想如果我能让它忽略我能得到它的空间。但是我不太了解Linux,我不确定我是否会走正轨。提前感谢指导/帮助。
答案 0 :(得分:1)
默认情况下,cut
分隔空格而不是冒号。如果继续使用它,请指定分隔符。
您可能希望在IFS=:
循环中使用read
和while
语句来获取值:
while IFS=: read user password uid gid comment home shell
do
...whatever...
done < /etc/passwd
或者您可以将grep
的输出传输到while
循环。
答案 1 :(得分:0)
您是否可以使用任何外部程序?如果是这样,我建议 awk
UID=1000
awkcmd="\$4==\"$UID\" {print \"user:\",\$1}"
cat $PASSWORDFILE | awk -F ":" "$awkcmd"
答案 2 :(得分:0)
在使用特定的字段分隔符(如passwd文件)解析结构化文件时,该作业的相应工具是awk。
UID=1000
awk -vuid="$UID" '$4==uid{print "user: "$1}' /etc/passwd
您不必使用grep或cut或其他任何东西。 (当然,你也可以在演示时读取循环时使用纯bash。)