繁体   English   中英

使用“:”的awk字段分隔符,并忽略“:”中的空格

[英]awk field separator using “:” and ignore spaces within “:”

我正在尝试在Linux中自动执行用户创建(批量用户)。 因此,我创建了一个文本文件,其中包含用户创建所需的所有参数。

文本文件包含以下内容:

tom:tom1:588:0:test user1:/home/test:/bin/false
harry:harry1:589:0:test test2:/hom/test2:/bin/nologin

尝试使用awk命令来打印列的for循环并使用/tmp/user.txt中的信息创建用户

for userdetails in $(cat /tmp/user.txt) 
do
user=`echo $userdetails | awk -v FS=: '{print $1}'`
passwd=`echo $userdetails | awk -v FS=: '{print $2}'`
uid=`echo $userdetails | awk -v FS=: '{print $3}'`
gid=`echo $userdetails | awk -v FS=: '{print $4}'`
comment=`echo $userdetails | awk -v FS=: '{print $5}'`
home_dir=`echo $userdetails | awk -v FS=: '{print $6}'`
user_shell=`echo $userdetails | awk -v FS=: '{print $7}'`
useradd -d "$home_dir" -c "$comment" -s "$user_shell" -u "$uid" -g "$gid" "$user"
echo "$passwd" | passwd "$user" --stdin;
done

实际输出:

useradd: invalid home directory ''
passwd: Unknown user name 'tom'.
useradd: invalid home directory ''
passwd: Unknown user name 'user1'.
useradd: invalid home directory ''
passwd: Unknown user name 'harry'.
useradd: invalid home directory ''
passwd: Unknown user name 'test2'.

我做错了什么?

PS:我知道Linux中有一个名为newusers的命令,但是我需要通过脚本检查该命令以在Linux中创建批量用户。

idk您是如何开始这条赛道的,但您还处于劣势。 只需使用一个shell循环:

while IFS=':' read -r user passwd uid gid comment home_dir user_shell; do
    useradd -d "$home_dir" -c "$comment" -s "$user_shell" -u "$uid" -g "$gid" "$user"
    echo "$passwd" | passwd "$user" --stdin;
done < /tmp/user.txt

上面仅显示了如何将文件内容读入变量,它假设您知道“ useradd”和“ passwd”行在做什么。

尝试:

awk '{gsub(/:/,"-")} 1'   Input_file

因此,简单地用-和1全局替换冒号将打印当前(已编辑)行。

如果您对awk感到困惑,则可以使用Awk Global替换

awk '{gsub(/:/,"-")} 1' your_file

这也是可行的使用SEDg标志( 桑达全球取代 ):

sed "s/:/-/g" your_file

在这两种情况下,您编辑的行都将被打印到屏幕上。

我会用while来逐行读取文件,因此整行将存储在您选择的变量中(在我的情况下为line)。 然后,您可以echo变量,awk将完成其余的工作。 我更喜欢$()而不是``,所以我现在都使用。 对于这么多的数据,您可以在while中创建一个循环,以使代码分类程序更易于管理。

cat /tmp/user.txt | while read line
do
user=`echo $line | awk -F ":" '{print $1}'`
passwd=$(echo $line | awk -F ":" '{print $2}')
uid=$(echo $line | awk -F ":" '{print $3}')
gid=$(echo $line | awk -F ":" '{print $4}')
comment=$(echo $line | awk -F ":" '{print $5}')
home_dir=$(echo $line | awk -F ":" '{print $6}')
user_shell=$(echo $line | awk -F ":" '{print $7}')

useradd -d "$home_dir" -c "$comment" -s "$user_shell" -u "$uid" -g "$gid" "$user"

echo "$passwd" | passwd "$user" --stdin;

done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM