我有一个包含用户和信息列表的文件,每行都是一个单独的用户,写法如下:
alfred,butler,male,70,7:15.
我只想从列表中获取名称,以便可以为他们创建用户。
一旦我有了名字,我就可以简单地使用 for 循环并回显 useradd 和每个用户名,然后简单地复制并粘贴文本。我如何抓取第一个逗号之前的字符?
答案1
您可以使用cut
抓取第一个字段,然后将其放入循环中while
以名称作为输入来运行命令:
cut -d ',' -f1 file | while read line; do echo "$line"; done
显然这个脚本并没有做任何有用的事情 - 用echo
你想对每个名称执行的任何操作进行替换,例如sudo useradd
(在使用测试后echo
)
解释
-d ','
使用逗号作为分隔符 (d
)-f1
第一个 (1
) 字段 (f
)while read line
从文件中读取,循环遍历每一行作为变量$line
do <command> "$line"
<command>
对从变量扩展的参数执行(即在管道输出的每一行上)
答案2
提取名称很容易:使用带有-F
标志的 awk 打印第一个字段
awk -F, '{print $1}' input.csv
为了实际添加用户,您需要逐行读取 awk 的输出。一种方法是像 Zanna 展示的那样,使用管道到while read variable ; do . . . done
。
另一种方法是利用 awk 的system()
功能先创建命令,然后将其传递给函数。考虑一下:
$ awk -F ',' '{command=sprintf("useradd \"%s\"",$1);print command }' input.txt
useradd "alfred"
useradd "johnny"
对于每一行,我们提取第一个单词并将其放入useradd "%s"
。可以将其提供给system()
函数,它将运行/bin/sh
以 root 身份运行:
$ awk -F ',' '{command=sprintf("useradd \"%s\" ",$1); system(command) }' input.txt
$ grep 'alfred' /etc/passwd
alfred:x:1001:1001::/home/alfred:
警告: system()
调用/bin/sh
,在 Ubuntu 上是符号链接/bin/dash
。因此避免巴什主义在你传递的命令中