上周写Mercurial与apache的脚本,关于创建代码库和创建用户的,shell中用到一些sed和grep操作,遇到些问题,记录下。
目标文件中是以<用户组>:<用户> <用户> <用户> 。。。 这种形式存放,每一行一个组,后面接用户。脚本接收两个参数,用户USER和组GROUP,然后把用户写入相应的组的最后,为了避免重复写,用grep 判断相应的的组中是否已经存在该用户。开始这样写if grep "^$GROUP$" /var/www/file | grep "\<$USER\>"发现查找无结果,后来想想是$GROUP的匹配不对,^以GROUP开头的行,$以GROUP结尾的行,我想找的只是以GROUP开头的行,所以应该去掉$。后来想关掉grep的输出,于是if grep -q "^$GROUP$" /var/www/file | grep -q "\<$USER\>",又查不到了,后来想想是第一个-q把输出关掉了,导致管道后面的grep没有输入了!于是去掉第一个grep的-q就行了。然后用sed -i "/^$GROUP\>/s/$/ $USER/g" /var/www/file 这句先查找以GROUP开头的行然后在行尾添加USER。
删除以GROUP开头行中的USER:sed -i "/^$GROUP\>/s/$USER//g" file
匹配关键字并向下删除六行:sed -i "/$GROUP/,+6d"file