一共有两个脚本,一个是bash的,另一个是awk的。本脚本的目的是从一个文本文件中把邮箱名称、姓名、单位读出来(它们是冒号分隔的),并生成两个文件。一个是用户名和密码文件(密码由下面的脚本产生),另一个是SQL文件,把这些数据插入到表中。
本脚本的有趣之处是把awk输出的结果通过管道传给函数setusers。awk输出三个值,把它们用空格分开,通过管道传给setusers,就自然成为了该函数的三个参数。可用$1$2$3来取得它们的值。不过要注意的并且也不太完美之处,是awk输出这三个值以前,要把所有空格先替换成其他的字符串,之后再替换回来。否则,如果这三个值中有空格,会以这些空格为分隔符,setusers得到的参数就不对了。
awk的好用之处,在于可以很容易地把文件中的某列进行处理,但是似乎不容易传给bash,以便再做处理。以下则是一个awk与bash配合的办法。
[gulei@test100 mailuser_to_EA]$ cat getNamePassFile
#!/bin/bash
setusers()
{
local email=${1//THISISASPACE/ }
local username=${2//THISISASPACE/ }
local dept=${3//THISISASPACE/ } local userid=${email%%@*}
local dname=${email##*@}
local pass=`dd bs=4 count=2 if=/dev/random 2>/dev/null | hexdump -d | head -1 | sed -e "s/^0000000//" -e "s/ //g"`
pass=$pass$pass$pass
pass=${pass:0:8}
local encryptedpwd=`./getpass $userid $pass`
echo $email $pass >> $userpassfile
echo "INSERT INTO IMP_USERS(EMAIL,USERID,DOMAINNAME,PASSWORD,ENCRYPTEDPWD,USERNAME,CORP) VALUES ('"$email"','"$userid"','"$dname"','"$pass"','"$encryptedpwd"','"$username"','"$dept"');">>$sqlfile
}
if [ $# -lt 2 ]; then
echo $0 '<ldapfile> <username and password file>'
exit
fi
ldapfile=$1
userpassfile=$2
if [ -f $userpassfile ]; then
rm $userpassfile
fi
sqlfile=$userpassfile.insert.sql
if [ -f $sqlfile ]; then
rm $sqlfile
fi
g++ getpass.cpp -lssl -o getpass
echo "DROP TABLE IF EXISTS IMP_USERS;" > $sqlfile
echo "CREATE TABLE IMP_USERS( EMAIL VARCHAR(100), CORPID VARCHAR(32), USERID VARCHAR(100), DOMAINNAME VARCHAR(100), PASSWORD VARCHAR(20) , ENCRYPTEDPWD VARCHAR(50), USERNAME VARCHAR(200) CHARACTER SET UTF8, CORP VARCHAR(50) CHARACTER SET UTF8 );" >> $sqlfile
echo "SET NAMES GBK;" >> $sqlfile
awk -f getNamePassFile.awk $ldapfile | while read line
do
setusers $line
done
[gulei@test100 mailuser_to_EA]$ cat getNamePassFile.awk
BEGIN {
FS = ":"
}
{
gsub(/ /,"THISISASPACE",$1)
gsub(/ /,"THISISASPACE",$3)
gsub(/ /,"THISISASPACE",$8) printf "%s %s %sn",$1,$3,$8
}