追加 groupID newusers

Append groupID newusers

我有一个结构错误的文件,我使用 while..read 循环将其转换为正确的结构

userid1:john doe smith:group1
userid2:jane doe smith:group2
userid3:paul rudd :group2

到目前为止的代码:

while IFS=: read userid username; do 
        userid=`echo $username|cut -d ":" -f 1`
             echo "$userid:password:$username:/home/$userid/bin/bash";
        done <  users.txt > newusers.txt

这给了我这个输出,

userid1:password123:John Doe Smith:/home/userid1/bin/bash
userid2:password123:Jane Doe Smith:/home/userid2/bin/bash
userid3:password123:Paul Rudd:/home/userid3/bin/bash

现在我需要附加 uid(自动生成,所以空白)和 gid,不知道该怎么做,我已经创建了 2020 和 2040 组。

期望的输出:

userid1:password123::2020:John Doe Smith:/home/userid1/bin/bash
userid2:password123::2040:Jane Doe Smith:/home/userid2/bin/bash
userid3:password123::2040:Paul Rudd:/home/userid3/bin/bash

干杯。

我认为您的代码可能如下所示:

while IFS=: read -r userid username group; do 
        if [ "$group" = "group1" ]; then
           groupid=2020
         elif [ "$group" = "group2" ]; then
           groupid=2040
         else
           echo "Unknown groupid"
           do something with error.
         fi
         echo "$userid:password123::$groupid:$username:/home/$userid/bin/bash";
done <  users.txt > newusers.txt

awk无所不能

$ awk -F: '{gid==="group1" ? "2020":"2040";print  FS "password123" FS FS gid \
    FS  FS "/home/"  "/bin/bash" }' ./users.txt

userid1:password123::2020:john doe smith:/home/userid1/bin/bash
userid2:password123::2040:jane doe smith:/home/userid2/bin/bash
userid3:password123::2040:paul rudd:/home/userid3/bin/bash
$ cat tst.awk
BEGIN {
    FS = "[[:space:]]*:[[:space:]]*"
    OFS = ":"
    gid["group1"] = 2020
    gid["group2"] = 2040
}
{ print , "password123", "", gid[], , "/home/"  "/bin/bash" }

$ awk -f tst.awk file
userid1:password123::2020:john doe smith:/home/userid1/bin/bash
userid2:password123::2040:jane doe smith:/home/userid2/bin/bash
userid3:password123::2040:paul rudd:/home/userid3/bin/bash

请注意,以上内容从您的输入中删除了 paul rudd 之后不需要的空白。现在也将每个名称中的第一个字母转换为大写:

$ cat tst.awk
BEGIN {
    FS = "[[:space:]]*:[[:space:]]*"
    OFS = ":"
    gid["group1"] = 2020
    gid["group2"] = 2040
}
{
    name = ""
    numParts = split(,parts," ")
    for (i=1; i<=numParts; i++) {
        part = parts[i]
        name = (i>1 ? name " " : "") toupper(substr(part,1,1)) substr(part,2)
    }
    print , "password123", "", gid[], name, "/home/"  "/bin/bash"
}

$ awk -f tst.awk file
userid1:password123::2020:John Doe Smith:/home/userid1/bin/bash
userid2:password123::2040:Jane Doe Smith:/home/userid2/bin/bash
userid3:password123::2040:Paul Rudd:/home/userid3/bin/bash