对比文件内容

需求从A文件当中查找不存在B文件当中的内容

方案1、

diff -B a.txt b.txt |awk '/</{print $2}'

#如果文件过大diff会超出内存就没法玩了~

方案2、

sort a.txt b.txt b.txt | uniq -u > c.txt
#排序并去重

方案3、

awk '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}'  a.txt b.txt > c.txt

其他命令参考:

#拆分文件
split -l 5000000 -d -a 3 c.txt
将c.txt按照每个文件500w行拆分,后缀是数字,并且后缀长度是3

syntax error: Bad for loop variable

在ubuntu下跑一个测试脚本,提示for 循环的语法错误,查了一下,系统启动问题。
代码对于标准bash而言没有错,因为Ubuntu为了加快开机速度,用dash代替了传统的bash,是dash在捣鬼。
解决方法是 取消dash
sudo dpkg-reconfigure dash
在选择项中选No,即可。
dash 好像是Debian的版本。

aapt获取apk信息存储mysql

表结构:

CREATE TABLE IF NOT EXISTS `apk_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '日志编号',
  `version_code` varchar(200) NOT NULL COMMENT '版本号',
  `package_md5` varchar(100) NOT NULL COMMENT '包文件的md5值',
  `package_name` varchar(100) NOT NULL COMMENT '包名称',
  `version_name` varchar(20) NOT NULL COMMENT '版本名',
  `sdk_version` varchar(20) NOT NULL COMMENT '最小SDK版本',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='获取APK信息' AUTO_INCREMENT=8 ;

aapt可以在这里下载:http://blog.phpfs.com/archives/2104.html

#!/bin/bash
#####
# 获取APK信息并保存到MYSQL数据库
#####
#mysql配置
HOST='localhost'
PORT=3306
USERNAME='root'
PASSWORD='Joyous'
DB='apk'
#获取APK信息
logname=/home/joyous/joyous/scripts/study/temp.log
/home/joyous/joyous/scripts/study/aapt d badging ${1} >${logname}
if [ -f "$logname" ]; then
    #包名
    NAME=`grep "package" ${logname}|awk -F"'" '{print $2}'`
    isversionCode=`grep "versionCode" ${logname}|awk -F"'" '{print $3}'|grep versionCode |wc -l` 
    if [ "$isversionCode" -eq 1 ];then
        VERSIONCODE=`grep "versionCode" ${logname}|awk -F"'" '{print $4}'`
    fi
    isversionCode=`grep "versionCode" ${logname}|awk -F"'" '{print $5}'|grep versionCode |wc -l` 
    if [ "$isversionCode" -eq 1 ];then
        VERSIONCODE=`grep "versionCode" ${logname}|awk -F"'" '{print $6}'`
    fi
    isversionName=`grep "versionName" ${logname}|awk -F"'" '{print $3}'|grep versionName |wc -l`  
    if [ "$isversionName" -eq 1 ];then
        VERSIONNAME=`grep "versionName" ${logname}|awk -F"'" '{print $4}'`
    fi
    isversionName=`grep "versionName" ${logname}|awk -F"'" '{print $5}'|grep versionName |wc -l`  
    if [ "$isversionName" -eq 1 ];then
        VERSIONNAME=`grep "versionName" ${logname}|awk -F"'" '{print $6}'`
    fi
    SDKVERSION=`grep "sdkVersion" ${logname}|awk -F"'" '{print $2}'`

    PACKMD5=`md5sum $1|cut -d ' ' -f1`
    insert_sql="insert into apk_info (version_code,package_md5, package_name,version_name,sdk_version) VALUES ('${VERSIONCODE}','${PACKMD5}','${NAME}','${VERSIONNAME}','${SDKVERSION}')"
    echo ${insert_sql}
    res=(`/usr/bin/mysql -h ${HOST} -u ${USERNAME} -P ${PORT} -p${PASSWORD} -e "use ${DB};${insert_sql}"`)
fi   

 

bash定时上传文件到ftp

#!/bin/bash
#上传本地的/var/ftp/test/a.log到ftp服务器的/var/ftp/test/目录下
#FTP信息
FTP_HOST='127.0.0.1'
FTP_PORT='22'
FTP_USER='test'
FTP_PASSWORD='test'
#保存ftp路径
FTP_PATH='/var/ftp'
#本地路径
LOCAL_PATH='/var/ftp'
`ftp -n <

 
备注:
1、注意端口
2、注意目录是否存在

bash连接mysql数据库

#!/bin/bash
HOST='127.0.0.1'
PORT=3306
USERNAME='test'
PASSWORD='test'
DB='test'
#读取字段总数
FIELDNUM=5
select_sql='select * from test'
list=(`/opt/mysql/bin/mysql -h ${HOSTNAME} -u ${USERNAME} -P ${PORT} -p${PASSWORD} -e "use ${DB};${select_sql}" -N -s`)
#总数
total=${#list[@]}
#总行数
line=`expr ${total} / ${FIELDNUM}`
for((i=0;i<${line};i++));do
    j=$[$i * $FIELDNUM]
    echo ${list[j+0]}-${list[j+1]};//输出第一个字段和第二个字段
done;

备注:myql要写绝对路径,不然脚本可执行但是放到crontab就无法执行了!

Ubuntu初始化svn一系列脚本

个人ubuntu服务器初始化svn脚本,虽然很烂,但是自己用起来很方便!(为何写ubuntu呢?因为centos的svn模块和ubuntu不一样!)
#!/bin/bash
read -p 'input svn path (eg:test)> ' site
if [ ! -d "/var/www/svn/${site}" ]; then
svnadmin create "/var/www/svn/${site}"
echo "svn init success /var/www/svn/${site}"
else
echo "svn path is exist!!"
exit 0
fi
if [ ! -f "/var/www/svn/${site}/hooks/post-commit" ];then
touch "/var/www/svn/${site}/hooks/post-commit"
echo "#!/bin/bash
svn update /var/www/html/${site}">/var/www/svn/${site}/hooks/post-commit
else
echo "touch post-commit error!!!"
exit 0
fi
chmod +x /var/www/svn/${site}/hooks/post-commit
chown -R www-data:www-data /var/www/svn/${site}
if [ ! -f "/etc/apache2/svn/${site}.conf" ];then
touch "/etc/apache2/svn/${site}.conf"
echo "
DAV svn
SVNPath /var/www/svn/${site}
Authtype Basic
AuthName 'SVN'
Auth_MySQL on
Auth_MySQL_Authoritative on
Auth_MySQL_Host localhost
Auth_MySQL_DB   test
Auth_MySQL_User test
Auth_MySQL_Password test123456
Auth_MySQL_Password_Table test
Auth_MySQL_Username_Field user
Auth_MySQL_Password_Field pwd
Auth_MySQL_Empty_Passwords Off
Auth_MySQL_Encrypted_Passwords  on
Auth_MySQL_Encryption_Types PHP_MD5
AuthBasicAuthoritative Off
AuthUserFile /dev/null
Require valid-user">/etc/apache2/svn/${site}.conf
else
echo 'touch /etc/apache2/svn/${site}.conf error'
exit 0
fi
echo "cat /var/www/svn/${site}/hooks/post-commit"
echo "cat /etc/apache2/svn/${site}.conf"
echo "cd /var/www/html"
echo "svn checkout http://svn.joyousphper.com/${site}"
这个完全是我方便自己初始化svn编写的(当然里面的路径和帐号密码肯定不是我的了~^_^),不一定适合你!  

vi拾遗

1.命令行模式

:%s/abc/def/g      替换所有abc为def

:%s/abc/def/        替换每行第一个abc为def

:s/abc/def/g          替换当前行所有abc为def

查找修改时间在指定区间的文件并打包

#!/bin/bash
# find file and tar
# joyousphper@gmail.com
# find_and_tar.sh

read -p "Please enter a search path (eg:/root/) >" search_path
if [ -d $search_path ];then
	echo "find path $search_path"
else
	echo "error: $search_path is not a directory"
	exit 0
fi
read -p 'Please enter a start time (eg:201404131600.00) >' start_time
`touch -t ${start_time} ${search_path}start`
read -p'Please enter a end time  (eg:201404131900.00) >' end_time
`touch -t ${end_time} ${search_path}end`
read -p'Please enter a save path (eg:/back/) >' save_path
if [ -d $save_path -a -w $save_path ];then
	echo "save path $save_path"
else
	echo "error: $save_path unable to write"
	exit 0
fi
read -p 'Please enter a file name . >' file_name

`find $search_path -newer ${search_path}start -a ! -newer ${search_path}end -exec tar rvf ${save_path}${file_name} -X ext.txt '{}' \; 1>out.log 2>error.log`

使用说明:

1.脚本需要有执行权限

2.目录需要带上/

3.输入时间格式必须是(201404140400.00),这表示2014年4月14日,4点整

4.保存目录需要有写入权限

5.在shell执行的当前目录内建立ext.txt文件

6.在ext.txt中写需要排除的文件(一行一个,这样打包就不会将这些文件打包在内)

附件:find_and_tar

Shell基础知识

1.变量首个字符必须为字母或者下划线,变量赋值等号前后不能有空格
2.可以用${hello}来表示取出变量hello的值
3.let “var+23″可以执行数学运算,这个时候变量前不带$;$[ no1 + no2 ]或者$[ $no1 + 5];可以用(());可以试用bc进行高级计算
4.$1可以获取输入的命令行的第一个参数,$@可获取所有的参数,$#表示包含参数的个数,很少用$*获取所有参数(整体字符串)
5.可以用单引号类防止变量扩展(eg:echo ‘*.jpg’)这样只会输出*.jpg而不是去匹配
6.sh -x shellscript可以执行调试模式,这样会显示变量的值,可以在/bin/bash -xv就可以启动调试了
7.获取变量值的长度${#var}
8.$0和$SHELL获取当前是哦那个的shell
9.文件描述符0,1,2分别表示标准输入stdin,标准输出stdout,标准错误stderr
10.数组可以用arr=(1 2 3 4 5)也可以用arr[0]=’apple’,echo ${arr[0]},打印所有${arr[*]},数组长度${#arr[*]};关联数组$temp_arr[name]=’Joyous’,echo “${temp_arr[name]}”;列出数组索引${!temp_arr[*]}或者${!temp_arr[@]}
11.比较运算中-gt表示大于;-lt表示小于,-ge表示大于或者等于,-le表示小于或者等于,-eq表示等于,-ne表示不等
12.文件系统判断
[ -f $file_name ] 如果给定的file_name是正常的文件路径或者文件名,返回为真
[ -x $file ]$file有执行权限返回为真
[ -d $dir_name ]如果是目录则返回为真
[ -e $var ] 如果文件存在返回为真
[ -w $var ] 如果文件可以写入返回为真
[ -r $var ] 如果文件可以读取返回为真
等等
13.字符串比较一般要用两个中括号来
[[ -n $str ]] $str非空则返回真
[[ -z $str ]] $str为空则返回真