使用具有文件格式的shell脚本查找并向特定行添加单词

时间:2011-03-15 12:45:00

标签: shell

我的问题是为文件添加用户名,我真的坚持继续,请帮忙 问题:我有一个名为usrgrp.dat的文件。此文件的格式如下:

ADMIN:srikanth,admin  
DEV:dev1  
TEST:test1

我正在尝试编写一个shell脚本,它应该给我输出:

Enter group name: DEV  
Enter the username: dev2

我的预期输出是:

User added to Group DEV

如果我看到usrgrp.dat的内容,现在应该是:

DEV:dev1,dev2
TEST:test1

如果我尝试在该组中添加已有用户,则应该向我提出错误user already present。我正在尝试使用以下脚本:

#!/bin/sh
dispgrp()
{
        groupf="/home/srikanth/scm/auths/group.dat"
        for gname in `cat $groupf | cut -f1 -d:`
        do
                echo $gname
        done
        echo "Enter the group name:"
        read grname
        for gname in `cat $groupf | cut -f1 -d:`
        do
                if [ "$grname" = "$gname" ]
                then
                        echo "Enter the username to be added"
                        read uname
                        for grname in `cat $groupf`
                        do

                                $gname="$gname:$uname"
                                exit 1
                        done
                fi
        done
}
echo "Group display"
dispgrp

我被困住了,需要你的宝贵帮助。

2 个答案:

答案 0 :(得分:1)

喜欢(假设你的shell是bash):

adduser() {
    local grp="$1"
    local user="$2"
    local gfile="$3"

    if ! grep -q "^$grp:" "$gfile"; then
        echo "no such group: $grp"
        return 1
    fi

    if grep -q "^$grp:.*\\<$user\\>" "$gfile"; then
        echo "User $user already in group $grp"
    else
        sed -i "/^$grp:/s/\$/,$user/" "$gfile"
        echo "User $user added to group $grp"
    fi 
}

read -p "Enter the group name: " grp
read -p "Enter the username to be added: " user
adduser "$grp" "$user" /home/srikanth/scm/auths/group.dat

答案 1 :(得分:1)

#!/bin/sh
dispgrp()
{
        groupf="/home/srikanth/scm/auths/group.dat"
        tmpfile="/path/to/tmpfile"
        # you may want to pipe this to more or less if the list may be long
        cat "$groupf" | cut -f1 -d:
        echo "Enter the group name:"
        read grname
        if grep "$grname" "$groupf" >/dev/null 2>&1
        then
            echo "Enter the username to be added"
            read uname
            if ! grep "^$grname:.*\<$uname\>" "$groupf" >/dev/null 2>&1
            then
                sed "/^$grname:/s/\$/,$uname/" "$groupf" > "$tmpfile" && mv "$tmpfile" "$groupf"
            else
                echo "User $uname already exists in group $grname"
                return 1
            fi
        else
            echo "Group not found"
            return 1
        fi
}
echo "Group display"
dispgrp

完成循环后,您无需使用循环(例如catsedgrep)。

请勿使用for来迭代cat的输出。

请勿使用exit从函数返回。使用return

非零退出或返回代码表示错误或失败。使用0进行正常的成功返回。如果您未指定,则为隐式操作。

学习使用sedgrep

由于你的shebang说#!/bin/sh,我上面做的更改是基于Bourne shell并假设POSIX实用程序(不是GNU版本)。