在If语句中使用grep来获取所有项,忽略空格

时间:2011-03-04 04:27:43

标签: linux bash

这是初学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,我不确定我是否会走正轨。提前感谢指导/帮助。

3 个答案:

答案 0 :(得分:1)

默认情况下,cut分隔空格而不是冒号。如果继续使用它,请指定分隔符。

您可能希望在IFS=:循环中使用readwhile语句来获取值:

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。)