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

时间:2017-05-23 10:45:34

标签: linux bash awk sh

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

Text文件包含以下内容:

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'.

我做错了什么?

P.S:我知道在Linux中有一个名为newusers的命令,但我需要检查相同的脚本以在Linux中创建批量用户。

4 个答案:

答案 0 :(得分:2)

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

以上只是展示如何将文件内容读入变量,它假设您知道您使用&#34; useradd&#34; &#34; passwd&#34;线。

答案 1 :(得分:0)

尝试:

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

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

答案 2 :(得分:0)

如果您遇到awk,可以使用 Awk Global substitution

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

使用带有g标记sed "s/:/-/g" your_file 标记的sed也可行:

    /**
     * @var \Magento\Catalog\Api\CategoryLinkManagementInterface
     */
    protected $_categoryLinkManagement;

$this->_categoryLinkManagement->assignProductToCategories($sku, $categoryIds);
//where $sku is sku of product, and $categoryIds is array of real categories ids

在这两种情况下,您编辑的线条都会打印到屏幕上。

答案 3 :(得分:0)

我会用while来逐行读取文件,这样整行就会存储在你选择的变量中(在我的例子中:line)。然后你可以回显变量,awk将完成其余的工作。我更喜欢$()而不是``所以我现在都使用它们。对于这么多数据,您可以创建一个循环,以便进行代码分类并更好地管理。

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