如何使用 awk 从文件中提取用户数据并基于此创建新用户?

如何使用 awk 从文件中提取用户数据并基于此创建新用户?

我需要一个可以帮助我锻炼的人。我只能使用 shell 脚本和awk去做吧:

您有一个名为 users.txt 的文本文件,其中包含以下信息:

users.txt

彼得:7777:/home/store;

奎因:7777:/home/accounts;

大卫:7777:/home/secondstore;

丹尼尔:7777:/home/address;

该脚本应使用每行的第一个单词创建一个用户,每行的第二个单词将用作密码,第三个单词作为主目录。

如果有人能指出我正确的方向,我将不胜感激

答案1

awk -F: '{print $1}' users.txt将允许您访问用户名字段
awk -F: '{print $2}' users.txt--> 密码字段
awk -F: '{print $3}' users.txt--> 主目录字段

你可以做类似的事情:

user=`awk -F: '{print $1}' users.txt`;
path=`awk -F: '{print $3}' users.txt`;
useradd -d $path -m $user;

答案2

while 循环中的两个命令都需要以 root 身份运行,因此要么添加sudos,要么将其保存为 bash 脚本并运行该脚本sudo(可能更可取)。

awk -F ':| ' '{print $1, $2, $3}' users.txt |
while read user password homedir; do
    adduser --home "$homedir" "$user"
    echo "$password" | passwd "$user" --stdin
done

或者,正如您所指出的,您可以在里面做更多的事情awk。我们可以让它打印整个命令:

$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) }' users.txt
adduser --home /home/almacen1 Jperez; echo 1234 | passwd Jperez
adduser --home /home/contabilidad1 Lgomez; echo 1234 | passwd Lgomez
adduser --home /home/almacen2 Pfernandez; echo 1234 | passwd Pfernandez
adduser --home /home/direccion1 Mramos; echo 1234 | passwd Mramos

然后让它把所有这些输入到 shell 中(运行时):

$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt
adduser: Only root may add a user or group to the system.
passwd: user 'Jperez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Lgomez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Pfernandez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Mramos' does not exist

显然,您需要使用sudo(或以 root 身份)运行上述命令才能运行(这就是它出现错误的原因)。您可以使用awksystem()命令,但您必须花费更多时间来连接字符串。print()这非常简单,所以我选择了它。

只是为了澄清一下,我的意思是运行sudo awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt

答案3

将内部字段分隔符设置为:,然后简单地忽略;的最后一个字符,用任何方法...使用子字符串或将其切碎。

这段代码应该能为您指明正确的方向。

这是 IFS var 使用的随机示例

#!/bin/bash
IFS=$','
vals='/mnt,/var/lib/vmware/Virtual Machines,/dev,/proc,/sys,/tmp,/usr/portage,/var/tmp'
for i in $vals; do echo $i; done
unset IFS

在您的情况下,您需要设置 IFS=: 并在每一行运行该类型的代码。

对于这些问题,我建议使用搜索引擎或在更适合编程的网站上发帖。

相关内容