给出第一个单词从文本文件中删除行

时间:2014-04-02 05:53:34

标签: bash shell sh

我有一个用户名和密码的文件,用于我正在制作的VPN网站。它看起来像这样:

#user   #server    #password   #ip
user1   server1    pass1       *
user2   server4    pass67      *
user3   server8    pass32      someip
user9   server1    62pass      *

如果我编写了一个简单的shell脚本来将用户附加到表中,并重新启动VPN进程:

#!/bin/sh
echo "Adding user $1 with password $2."
echo "$1 l2tpd $2 *" >> /etc/ppp/chap-secrets
echo "Restarting xl2tpd process."
sudo /etc/init.d/xl2tpd restart
echo "VPN restarted, user added."

现在我要做的是编写一个脚本,允许我从表中删除用户,然后重新启动该过程。为了做到这一点,我必须传递一个参数,即用户名。

如何使用该用户名查找该行,然后将其删除?

3 个答案:

答案 0 :(得分:2)

您可以使用sed

sed '/^user1/d' filename

会删除以user1开头的行。要将更改保存到文件,请使用-i选项。

要使用变量,请确保使用双引号:

sed "/^$1/d" filename

或者,您可以使用grep

grep -v "^$1" filename

答案 1 :(得分:1)

虽然像devnull这样的基本sed脚本可以解决问题,但你应该知道sed会搜索正则表达式,而不是字符串,他的解决方案建议使用原始命令行内容作为sed命令的一部分。

我不会这样做。输入验证很重要,因为即使没有讨厌的人可以访问你的shell,也会发生拼写错误。例如:

#!/bin/bash

if [[ "$1" ~ ^[a-z][a-z0-9]*$ ]]; then
  if sed -i.bak -e "/^$1 /d" /etc/ppp/chap-secrets; then
    echo "delete user $1"
  fi
else
  echo "ERROR: Invalid characters.  Please try again." >&2
  exit 1
fi

请注意,我们正在测试以确保用户遵循没有特殊字符的安全格式,并且我们还确保删除用户“foo”也不会通过在后面添加空格来删除用户“foobar” sed脚本中的$1范围。

我建议保留-i.bak,以防万一发生不幸事件。

答案 2 :(得分:0)

如果你有使用-i选项的gnu sed。

#!/bin/sh
echo "deleting user $1."
sed -i "/^$1/d" /etc/ppp/chap-secrets
echo "Restarting xl2tpd process."
sudo /etc/init.d/xl2tpd restart
echo "VPN restarted, user deleted."

如果没有,请用以下命令替换sed -i命令:

sed "/^$1/d" /etc/ppp/chap-secrets > temp
mv temp /etc/ppp/chap-secrets