bash(用另一个文件中的值替换列中的值)

时间:2017-03-09 16:20:45

标签: bash sed

尝试制作一个包含每个目录和文件的UID / GID的文件。

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

我想将其与/ etc / passwd的列$1进行比较,并将其替换为/etc/passwd

中列出的uid / 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

1 个答案:

答案 0 :(得分: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。