bash(用另一个文件中的值替换列中的值)
问题描述:
试图制作一个具有每个目录和文件的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
答
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。
几个错误:你读入变量但没有使用该值 - 你应该在'while'中使用'$ out'。你并不是真的在运行'awk',你想要'$(awk ...)'这样的东西。但是你首先需要在/ etc/passwd中搜索匹配的行,我没有看到你这样做。在if后,你需要'然后'和'fi',而不是'do'。 –
有一些语法错误。这应该是在读取-r行时,你应该完成
2017-03-09 16:40:06
我会首先确保您可以迭代文件中的行并将其打印出来。 'while read -r line do echo $ line done
2017-03-09 16:42:01