如何抓取列表中逗号前的字符并导出到脚本?

如何抓取列表中逗号前的字符并导出到脚本?

我有一个包含用户和信息列表的文件,每行都是一个单独的用户,写法如下:

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。因此避免巴什主义在你传递的命令中

相关内容