2017-03-09 134 views
0

试图制作一个具有每个目录和文件的UID/GID的文件。bash(用另一个文件中的值替换列中的值)

out”包括所有具有用户名和组名的目录/文件。

而且我想这个比较的/ etc/passwd文件$1柱,并用UID更换/在/etc/passwd

所以GID上市让我们说 “out” 包括”

sam samgroup /home/sam/hi 
aaron samgroup /home/aaron/no 

我想它变成

1001 1002 /home/sam/hi 
1002 1002 /home/aaron/no 

(在与列对比并替换/从/etc/passwd附加后)

我写了这个,但是这在逻辑上是正确的?如果不是,如何解决它? 谢谢。

[增订]

one="$(awk -F ":" '{print $2}' out)" 
psw="$(awk -F ":" '{print $1}' /etc/passwd)" 
pswthree="$(awk -F ":" '{print $3}' /etc/passwd)" 
pswfour="$(awk -F ":" '{print $4}' /etc/passwd)" 


while read -r out 
do 
     if [ $one == $two ] 
       then sed "s/$one/$pswthree/g" <<< "$out" 
     fi 
done < out 

样品/ etc/passwd中

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin 
qemu:x:107:107:qemu user:/:/sbin/nologin 
+0

几个错误:你读入变量但没有使用该值 - 你应该在'while'中使用'$ out'。你并不是真的在运行'awk',你想要'$(awk ...)'这样的东西。但是你首先需要在/ etc/passwd中搜索匹配的行,我没有看到你这样做。在if后,你需要'然后'和'fi',而不是'do'。 –

+0

有一些语法错误。这应该是在读取-r行时,你应该完成 2017-03-09 16:40:06

+0

我会首先确保您可以迭代文件中的行并将其打印出来。 'while read -r line do echo $ line done 2017-03-09 16:42:01

回答

0

awk来救援!

我想这是你想要做

$ awk -F: 'NR==FNR {a[$1]=$3 OFS $4; next} # cache /etc/passwd user/groupids 
      $1 in a {print a[$1], $3; next} # if found replace 
      1' /etc/passwd FS=' +' out   # otherwise print as is 

必要没有明确的循环是什么

注:ID字段应该是在密码文件3和4。

+0

输出什么也没有,所以我正在寻找修改我的问题 – SndLt

+0

你是用组名或用户名搜索?你的文件似乎是“用户组目录”格式,但你使用的是第二个字段。你可以发布/ etc/passwd文件的示例部分吗? – karakfa

+0

我已经把样例“/ etc/passwd”非常感谢您的时间。我试图同时调试我的“if”语句。 – SndLt

相关问题