我正在尝试将用户分类到特定的服务器中,因此我目前尝试做的是按性别抓取所有用户。本质上,我会有一台服务器,里面全是男性用户,另一台服务器,里面全是女性用户。文件中每行的数据如下:
jimlee,7676,jim lee,sony,male,8912,1543,33:44
下面我使用的命令抓取第一个字段,然后添加用户。但是我的目标是仅添加特定性别并为他们创建用户。因此,看到第五个字段是性别字段,我知道使用-f5
会给我该字段并按性别显示所有用户,但我不确定如何根据特定字段(在本例中为第五个字段(性别))抓取名称。
cut -d ',' -f1 file.csv | while read line; do sudo useradd "$line"; done
答案1
延续我之前对你另一个问题的回答如何抓取列表中逗号前的字符并导出到脚本?,使用 awk 和$FIELD == "word"
。此处在字段 5 中设置了男性和女性
awk -F',' '$5=="male" {command=sprintf("useradd \"%s\" ",$1); system(command) }' input.txt
您可以对“女性”执行相同操作
答案2
你可以尝试
sudo awk -F , '($5=="male") {system("useradd " $1)}' file.csv
答案3
如果您想要搜索一种模式,并且字段可能不一致(即性别可能不总是在第 5 个字段中),您可以使用一种sed
方法来抓取第一个字段(如果female
在任何字段中),例如:
sed -nr 's/^([^,]+),.*,female,.*/\1/p' file
解释
-n
在我们要求之前不要打印-r
使用 EREs/old/new
old
用。。。来代替new
^([^,]+),
保存每行开头逗号前的一些字符(第一个字段),.*,
两个逗号之间可能出现的任意数量的字符(因此第一个字段和模式之间有多少个字段并不重要),female,
仅当出现此模式时,该行才会匹配\1
()
之前保存的模式p
仅打印我们更改的行
答案4
这可能很简单,只需使用逗号作为 Bash 循环即可字段分隔符并useradd
在需要时调用:
while IFS=, read user f2 f3 f4 gender _;
do
if [ "$gender" == "male" ]; then
sudo useradd "$user"
fi
done < file
无需调用外部命令(如 awk 或 sed)。