1.如何安装rpm软件包
rmp软件包的安装可以使用程序rpm来完成。执行下面的命令
rpm -i your-package.rpm
其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。
安装过程中可能出现下面的警告或者提示:
... conflict with ... 可能是要安装的包里有一些文件可能会覆盖现有
的文件,缺省时这样的情况下是无法正确安装的可以用
rpm --force -i 强制安装即可
... is needed by ...
... is not installed ... 此包需要的一些软件你没有安装可以用
rpm --nodeps -i 来忽略此信息
也就是说,rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包
都能安装上,但这种强制安装的软件包不能保证完全发挥功能
2.如何安装.src.rpm软件包
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时
需要进行编译。这类软件包有两种安装方法,
方法一:
1.执行rpm -i your-package.src.rpm
2. cd /usr/src/redhat/SPECS
3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件
4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录
5. ./configure 这一步和编译普通的源码软件一样,可以加上参数
6. make
7. make install
方法二:
1.执行rpm -i you-package.src.rpm
2. cd /usr/src/redhat/SPECS
前两步和方法一相同
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)
在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。
3.如何卸载rpm软件包
使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀.rpm
比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd
不可以是下列格式:
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1
有时会出现一些错误或者警告:
... is needed by ... 这说明这个软件被其他软件需要,不能随便卸载
可以用rpm -e --nodeps强制卸载
4.如何不安装但是获取rpm包中的文件
使用工具rpm2cpio和cpio
rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程
d和make-directory相同,表示根据包中文件原来的路径建立目录
m表示保持文件的更新时间。
5.如何查看与rpm包相关的文件和其他信息
下面所有的例子都假设使用软件包mysql-3.23.54a-11
1.我的系统中安装了那些rpm软件包
rpm -qa 讲列出所有安装过的包
如果要查找所有安装过的包含某个字符串sql的软件包
rpm -qa |grep sql
2.如何获得某个软件包的文件全名
rpm -q mysql 可以获得系统中安装的mysql软件包全名,从中可以获得
当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11
3.一个rpm包中的文件安装到那里去了?
rpm -ql 包名
注意这里的是不包括.rpm后缀的软件包的名称
也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。
如果只是想知道可执行程序放到那里去了,也可以用which,比如
which mysql
4.一个rpm包中包含那些文件
一个没有安装过的软件包,使用rpm -qlp ****.rpm
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm
5.如何获取关于一个软件包的版本,用途等相关信息?
一个没有安装过的软件包,使用rpm -qip ****.rpm
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm 6.某个程序是哪个软件包安装的,或者哪个软件包包含这个程序
rpm -qf `which 程序名` 返回软件包的全名
rpm -qif `which 程序名` 返回软件包的有关信息
rpm -qlf `which 程序名` 返回软件包的文件列表
注意,这里不是引号,而是`,就是键盘左上角的那个键。
也可以使用rpm -qilf,同时输出软件包信息和文件列表
7.某个文件是哪个软件包安装的,或者哪个软件包包含这个文件
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以
用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。
首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
# whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
# rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1
总结:
获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如
i 表示info,获得软件包的信息;
l 表示list,获得文件列表;
a 表示all,在所有包中执行查询;
f 表示file,根据文件进行相关的查询;
p 表示package,根据软件包进行查询
需要的查询条件可以使用grep产生,或者从"` `"中的命令行产生
6.关于rpm软件包的一些相关知识
1.什么是rpm
rpm 即RedHat Package Management,是RedHat的发明之一
2.为什么需要rpm
在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的
程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装,
配置,卸载的自动化问题。为了解决这些问题,RedHat针对自己的系统提出了一个
较好的办法来管理成千上百的软件。这就是RPM管理系统。在系统中安装了rpm管理系统
以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载
3.是不是所有的linux都使用rpm
任何系统都需要包管理系统,因此很多linux都使用rpm系统。但rpm系统是为RH专门
但是TL,Mandrake等系统也都使用rpm。由于rpm的源程序可以在别的系统上进行编译,
所以有可能在别的系统上也使用rpm
除了rpm,其他一些系统也有自己的软件包管理程序,例如debian的deb包,
slakware也都有自己的包管理系统
4.rpm包的文件名为什么那么长
rpm包的文件名中包含了这个软件包的版本信息,操作系统信息,硬件要求等等。
比如mypackage-1.1-2TL.i386.rpm,其中mypackage是在系统中登记的软件包的名字
1.1是软件的版本号,2是发行号,TL表示用于TL操作系统,还可能是RH等。i386表示
用于intel x86平台,还可能是sparc等。
5.软件包文件名中的i386,i686是什么意思
rpm软件包的文件名中,不仅包含了软件名称,版本信息,还包括了适用的硬件架构
的信息。
i386指这个软件包适用于intel 80386以上的x86架构的计算机(AI32)
i686指这个软件包适用于intel 80686以上(奔腾pro以上)的x86架构的计算机(IA32)
noarch指这个软件包于硬件架构无关,可以通用。
i686软件包的程序通常针对CPU进行了优化,所以,向后兼容比较用以,i386的包在
x86机器上都可以用。向前一般不兼容。不过现在的计算机,奔腾pro以下的CPU已经很少
用,通常配置的机器都可以使用i686软件包
6.不同操作系统发行的rpm包可否混用?
对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。
对于以src.rpm发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同
系统下安装。
7.使用rpm时遇到的一些特殊问题
Q 我用rpm -e **.rpm无法删除rpm包
A 包名不要包括rpm,
rpm -e 包名,可以包含版本号等信息,但是不可以有后缀.rpm
Q 在MS的系统下有没有读RPM文件的工具?
A wincmd with rpm plugins.....
Q 是否可以通过ftp安装安装升级rpm包?
A 可以。rpm -ivh ftp://xxxxxxxx/PATH2SomeRPM
Q rpm安装时已有的包版本过高怎么办?
A 有时由于安装的软件包太老,而系统中相关的软件包版本比较新,所以可能需要
安装的包依赖的一些文件会找不到。这时有两种解决办法,
第一是在系统文件中找到和需要的文件功能相同或相似的文件,做一个符号链接到
需要的目录下。
第二是下载安装新版本的软件包。
rmp软件包的安装可以使用程序rpm来完成。执行下面的命令
rpm -i your-package.rpm
其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。
安装过程中可能出现下面的警告或者提示:
... conflict with ... 可能是要安装的包里有一些文件可能会覆盖现有
的文件,缺省时这样的情况下是无法正确安装的可以用
rpm --force -i 强制安装即可
... is needed by ...
... is not installed ... 此包需要的一些软件你没有安装可以用
rpm --nodeps -i 来忽略此信息
也就是说,rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包
都能安装上,但这种强制安装的软件包不能保证完全发挥功能
2.如何安装.src.rpm软件包
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时
需要进行编译。这类软件包有两种安装方法,
方法一:
1.执行rpm -i your-package.src.rpm
2. cd /usr/src/redhat/SPECS
3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件
4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录
5. ./configure 这一步和编译普通的源码软件一样,可以加上参数
6. make
7. make install
方法二:
1.执行rpm -i you-package.src.rpm
2. cd /usr/src/redhat/SPECS
前两步和方法一相同
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)
在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。
3.如何卸载rpm软件包
使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀.rpm
比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd
不可以是下列格式:
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1
有时会出现一些错误或者警告:
... is needed by ... 这说明这个软件被其他软件需要,不能随便卸载
可以用rpm -e --nodeps强制卸载
4.如何不安装但是获取rpm包中的文件
使用工具rpm2cpio和cpio
rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程
d和make-directory相同,表示根据包中文件原来的路径建立目录
m表示保持文件的更新时间。
5.如何查看与rpm包相关的文件和其他信息
下面所有的例子都假设使用软件包mysql-3.23.54a-11
1.我的系统中安装了那些rpm软件包
rpm -qa 讲列出所有安装过的包
如果要查找所有安装过的包含某个字符串sql的软件包
rpm -qa |grep sql
2.如何获得某个软件包的文件全名
rpm -q mysql 可以获得系统中安装的mysql软件包全名,从中可以获得
当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11
3.一个rpm包中的文件安装到那里去了?
rpm -ql 包名
注意这里的是不包括.rpm后缀的软件包的名称
也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。
如果只是想知道可执行程序放到那里去了,也可以用which,比如
which mysql
4.一个rpm包中包含那些文件
一个没有安装过的软件包,使用rpm -qlp ****.rpm
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm
5.如何获取关于一个软件包的版本,用途等相关信息?
一个没有安装过的软件包,使用rpm -qip ****.rpm
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm 6.某个程序是哪个软件包安装的,或者哪个软件包包含这个程序
rpm -qf `which 程序名` 返回软件包的全名
rpm -qif `which 程序名` 返回软件包的有关信息
rpm -qlf `which 程序名` 返回软件包的文件列表
注意,这里不是引号,而是`,就是键盘左上角的那个键。
也可以使用rpm -qilf,同时输出软件包信息和文件列表
7.某个文件是哪个软件包安装的,或者哪个软件包包含这个文件
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以
用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。
首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
# whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
# rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1
总结:
获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如
i 表示info,获得软件包的信息;
l 表示list,获得文件列表;
a 表示all,在所有包中执行查询;
f 表示file,根据文件进行相关的查询;
p 表示package,根据软件包进行查询
需要的查询条件可以使用grep产生,或者从"` `"中的命令行产生
6.关于rpm软件包的一些相关知识
1.什么是rpm
rpm 即RedHat Package Management,是RedHat的发明之一
2.为什么需要rpm
在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的
程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装,
配置,卸载的自动化问题。为了解决这些问题,RedHat针对自己的系统提出了一个
较好的办法来管理成千上百的软件。这就是RPM管理系统。在系统中安装了rpm管理系统
以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载
3.是不是所有的linux都使用rpm
任何系统都需要包管理系统,因此很多linux都使用rpm系统。但rpm系统是为RH专门
但是TL,Mandrake等系统也都使用rpm。由于rpm的源程序可以在别的系统上进行编译,
所以有可能在别的系统上也使用rpm
除了rpm,其他一些系统也有自己的软件包管理程序,例如debian的deb包,
slakware也都有自己的包管理系统
4.rpm包的文件名为什么那么长
rpm包的文件名中包含了这个软件包的版本信息,操作系统信息,硬件要求等等。
比如mypackage-1.1-2TL.i386.rpm,其中mypackage是在系统中登记的软件包的名字
1.1是软件的版本号,2是发行号,TL表示用于TL操作系统,还可能是RH等。i386表示
用于intel x86平台,还可能是sparc等。
5.软件包文件名中的i386,i686是什么意思
rpm软件包的文件名中,不仅包含了软件名称,版本信息,还包括了适用的硬件架构
的信息。
i386指这个软件包适用于intel 80386以上的x86架构的计算机(AI32)
i686指这个软件包适用于intel 80686以上(奔腾pro以上)的x86架构的计算机(IA32)
noarch指这个软件包于硬件架构无关,可以通用。
i686软件包的程序通常针对CPU进行了优化,所以,向后兼容比较用以,i386的包在
x86机器上都可以用。向前一般不兼容。不过现在的计算机,奔腾pro以下的CPU已经很少
用,通常配置的机器都可以使用i686软件包
6.不同操作系统发行的rpm包可否混用?
对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。
对于以src.rpm发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同
系统下安装。
7.使用rpm时遇到的一些特殊问题
Q 我用rpm -e **.rpm无法删除rpm包
A 包名不要包括rpm,
rpm -e 包名,可以包含版本号等信息,但是不可以有后缀.rpm
Q 在MS的系统下有没有读RPM文件的工具?
A wincmd with rpm plugins.....
Q 是否可以通过ftp安装安装升级rpm包?
A 可以。rpm -ivh ftp://xxxxxxxx/PATH2SomeRPM
Q rpm安装时已有的包版本过高怎么办?
A 有时由于安装的软件包太老,而系统中相关的软件包版本比较新,所以可能需要
安装的包依赖的一些文件会找不到。这时有两种解决办法,
第一是在系统文件中找到和需要的文件功能相同或相似的文件,做一个符号链接到
需要的目录下。
第二是下载安装新版本的软件包。
My previous articles on installing PHP on CentOS dealt with installing PHP 5.2.6. I have found this to have some bugs that kill the process without error information. One bug I found, which was on an x86_64 server, was that converting an object to a string did this.
So, I have compiled the latest PHP version, 5.2.10 5.3.0 5.3.1, and put it in my own repository for easy installation. I have compiled it for CentOS 5 i386 and x86_64, and provided the source RPMS in the repo, if anyone wants to compile it for another OS or architecture.
Update 2009-07-03 – I updated the version to PHP 5.3, which was released a few days before. This includes many new features such as closures, namespaces, and packaged scripts in phar files, which I’ll blog about soon. Check out PHP changelog for more details.
Update 2009-09-01 – Added a note about deprecated errors, and how to silence them. Also I have included a tip that might help those of you struggling to install.
I have also included the same php extensions I mentioned in my other article, php-mcrypt, php-mhash, php-mssql and php-tidy
To install, first you must tell rpm to accept rpm’s signed by me, then add the yum repository information to yum:
rpm --import http://repo.webtatic.com/yum/RPM-GPG-KEY-webtatic-andy
wget -P /etc/yum.repos.d/ http://repo.webtatic.com/yum/webtatic.repoNow you can install php by doing:
yum --enablerepo=webtatic install phpOr update an existing installation of php, which will also update all of the other php modules installed:
yum --enablerepo=webtatic update phpIf this does not work correctly, try disabling all other repositories while installing/updating, by adding the –disablerepo=* option. This will stop other dependencies from being installed, so you may want to install them first.
yum --disablerepo=* --enablerepo=webtatic update phpDeprecated Errors
Once you are running the new version, you may get “deprecated” errors in your error logs. This isn’t bad, it just means to tell you that some of the functions you are using are no longer prefered, and may be removed in a future major release. An example of this is the ereg functions. Preg functions are prefered over these, as they are much faster and more powerful, and in all cases do at least the same thing.
If upgrading the functions are not an option, and you would like to hide the deprecated errors from your error log, for example on a production server, just edit your /etc/php.ini file, find the line:
error_reporting = E_ALLand replace to:
error_reporting = E_ALL & ~E_DEPRECATED
So, I have compiled the latest PHP version, 5.2.10 5.3.0 5.3.1, and put it in my own repository for easy installation. I have compiled it for CentOS 5 i386 and x86_64, and provided the source RPMS in the repo, if anyone wants to compile it for another OS or architecture.
Update 2009-07-03 – I updated the version to PHP 5.3, which was released a few days before. This includes many new features such as closures, namespaces, and packaged scripts in phar files, which I’ll blog about soon. Check out PHP changelog for more details.
Update 2009-09-01 – Added a note about deprecated errors, and how to silence them. Also I have included a tip that might help those of you struggling to install.
I have also included the same php extensions I mentioned in my other article, php-mcrypt, php-mhash, php-mssql and php-tidy
To install, first you must tell rpm to accept rpm’s signed by me, then add the yum repository information to yum:
rpm --import http://repo.webtatic.com/yum/RPM-GPG-KEY-webtatic-andy
wget -P /etc/yum.repos.d/ http://repo.webtatic.com/yum/webtatic.repoNow you can install php by doing:
yum --enablerepo=webtatic install phpOr update an existing installation of php, which will also update all of the other php modules installed:
yum --enablerepo=webtatic update phpIf this does not work correctly, try disabling all other repositories while installing/updating, by adding the –disablerepo=* option. This will stop other dependencies from being installed, so you may want to install them first.
yum --disablerepo=* --enablerepo=webtatic update phpDeprecated Errors
Once you are running the new version, you may get “deprecated” errors in your error logs. This isn’t bad, it just means to tell you that some of the functions you are using are no longer prefered, and may be removed in a future major release. An example of this is the ereg functions. Preg functions are prefered over these, as they are much faster and more powerful, and in all cases do at least the same thing.
If upgrading the functions are not an option, and you would like to hide the deprecated errors from your error log, for example on a production server, just edit your /etc/php.ini file, find the line:
error_reporting = E_ALLand replace to:
error_reporting = E_ALL & ~E_DEPRECATED
http://www.webtatic.com/blog/2009/06/php-530-on-centos-5/
下载地址:
https://ohse.de/uwe/software/lrzsz.html
章分类:操作系统 关键字: securecrt的sz/rz工具包
CentOS6.5:
sudo yum install lrzsz
用习惯了SecureCRT,觉得rz的命令太方便了,但最近遇到一新装的linux服务器,急忙用SecureCRT连上去,发现不能识别rz命令,以前用过几百次,不会错啊,于是在网上查N久,才知道原来要使用SecureCRT的rz命令,要在linux上安装一个工具,具体过程如下:
Linux系统手动安装rz/sz 软件包
定制安装的linux可能没有把rzsz包安装到系统,这对用securecrt这样的windows工具传输文件特别不方便。为了使用这个方便的法门,可以手动安装之。
1、下载软件 rzsz-3.34.tar.gz,登录linux,用命令
wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载。
2、解压 tar zxvf rzsz-3.34.tar.gz
3、安装cd rzsz-3.34 ; make posix 。注意:这个软件安装与常规的GNU软件不同—没有configure(配置)及make install (安装过程)。先执行命令make,将给出下面的提示:
[root@appuser rzsz]# make
根据自己的系统选择make的位置参数,一般情况下,选posix或linux就可以了。执行命令make posix,我们从输出部分可以很清楚的看见这个步骤所进行的工作:
[root@appuser rzsz]# make posix
4、为了方便使用这个工具,把相关文件复制到目录/usr/bin下面。这里只需要拷贝2个文件rz及sz,命令为:cp rz sz /usr/bin.
ok,大功告成,现在就可以使用SecureCRT的rz命令了。
https://ohse.de/uwe/software/lrzsz.html
章分类:操作系统 关键字: securecrt的sz/rz工具包
CentOS6.5:
sudo yum install lrzsz
用习惯了SecureCRT,觉得rz的命令太方便了,但最近遇到一新装的linux服务器,急忙用SecureCRT连上去,发现不能识别rz命令,以前用过几百次,不会错啊,于是在网上查N久,才知道原来要使用SecureCRT的rz命令,要在linux上安装一个工具,具体过程如下:
Linux系统手动安装rz/sz 软件包
定制安装的linux可能没有把rzsz包安装到系统,这对用securecrt这样的windows工具传输文件特别不方便。为了使用这个方便的法门,可以手动安装之。
1、下载软件 rzsz-3.34.tar.gz,登录linux,用命令
wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载。
2、解压 tar zxvf rzsz-3.34.tar.gz
3、安装cd rzsz-3.34 ; make posix 。注意:这个软件安装与常规的GNU软件不同—没有configure(配置)及make install (安装过程)。先执行命令make,将给出下面的提示:
[root@appuser rzsz]# make
根据自己的系统选择make的位置参数,一般情况下,选posix或linux就可以了。执行命令make posix,我们从输出部分可以很清楚的看见这个步骤所进行的工作:
[root@appuser rzsz]# make posix
4、为了方便使用这个工具,把相关文件复制到目录/usr/bin下面。这里只需要拷贝2个文件rz及sz,命令为:cp rz sz /usr/bin.
ok,大功告成,现在就可以使用SecureCRT的rz命令了。
在大型的web应用中数据库经常成为并发访问的一个瓶颈,为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量。
master-slave模式是为了数据同步的问题。
sqlrelay解决连接池问题以及实现读写分离的均衡负载。
sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router,负责调度应用。
php通过A还是通过B连接数据库。
在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。
一、MySQL master/slave配置
################
#mster/slave配置
################
master:192.168.1.51
slave:192.168.1.50
1、master配置
/etc/my.cnf 中加入
binlog-do-db=book book为数据库名
确保
server-id=1
log-bin=mysql-bin
授权给rep用户进行复制操作
GRANT REPLICATION SLAVE ON book.* TO rep@192.168.1.50 IDENTIFIED BY '123456';
重启master服务
2、配置slave
vi /etc/my.cnf
设置下面4行
server-id = 2
master-host = 192.168.1.51
master-user = rep
master-password = 123456
重启slave
3、把master的原始数据导入slave。
二、sqlrelay配置
当前行业中比较流行的连接池解决方案几乎都不支持php,经过多番努力终于在找到了一个开源的连接池技术--------sqlrelay。
sqlreplay支持的语言:
C C++ Perl Python PHP Ruby Java TCL Zope
sqlreplay支持的数据库:
Oracle MySQL mSQL PostgreSQL Sybase MS SQL Server IBM DB2 Interbase Sybase SQLite ODBC MS Access
sqlreplay的网站
http://sqlrelay.sourceforge.net/。
基本思路:
1、配置2个实例用以最终处理业务
clubs-read
clubi-write
其中读取的 instance分别配置两个连接,且两个连接启动对等的连接数。
2、配置一个instance来调度读写操作,即clubr
通过router来区分读写连接不同的mysql数据库。
<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">
<instances>
<!-- club Instance -->
<instance id="clubs" port="9002" socket="/tmp/clubs.socket" dbase="mysql" connections="10" maxconnections="20" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">
<users>
<user user="club" password="edb:club"/>
</users>
<connections>
<connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
<connection connectionid="slave50" string="host=192.168.1.50;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
</connections>
</instance>
<instance id="clubi" port="9003" socket="/tmp/clubi.socket" dbase="mysql" connections="10" maxconnections="40" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">
<users>
<user user="club" password="edb:club"/>
</users>
<connections>
<connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
</connections>
</instance
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rushcc2006/archive/2009/11/07/4775135.aspx
master-slave模式是为了数据同步的问题。
sqlrelay解决连接池问题以及实现读写分离的均衡负载。
sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router,负责调度应用。
php通过A还是通过B连接数据库。
在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。
一、MySQL master/slave配置
################
#mster/slave配置
################
master:192.168.1.51
slave:192.168.1.50
1、master配置
/etc/my.cnf 中加入
binlog-do-db=book book为数据库名
确保
server-id=1
log-bin=mysql-bin
授权给rep用户进行复制操作
GRANT REPLICATION SLAVE ON book.* TO rep@192.168.1.50 IDENTIFIED BY '123456';
重启master服务
2、配置slave
vi /etc/my.cnf
设置下面4行
server-id = 2
master-host = 192.168.1.51
master-user = rep
master-password = 123456
重启slave
3、把master的原始数据导入slave。
二、sqlrelay配置
当前行业中比较流行的连接池解决方案几乎都不支持php,经过多番努力终于在找到了一个开源的连接池技术--------sqlrelay。
sqlreplay支持的语言:
C C++ Perl Python PHP Ruby Java TCL Zope
sqlreplay支持的数据库:
Oracle MySQL mSQL PostgreSQL Sybase MS SQL Server IBM DB2 Interbase Sybase SQLite ODBC MS Access
sqlreplay的网站
http://sqlrelay.sourceforge.net/。
基本思路:
1、配置2个实例用以最终处理业务
clubs-read
clubi-write
其中读取的 instance分别配置两个连接,且两个连接启动对等的连接数。
2、配置一个instance来调度读写操作,即clubr
通过router来区分读写连接不同的mysql数据库。
<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">
<instances>
<!-- club Instance -->
<instance id="clubs" port="9002" socket="/tmp/clubs.socket" dbase="mysql" connections="10" maxconnections="20" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">
<users>
<user user="club" password="edb:club"/>
</users>
<connections>
<connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
<connection connectionid="slave50" string="host=192.168.1.50;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
</connections>
</instance>
<instance id="clubi" port="9003" socket="/tmp/clubi.socket" dbase="mysql" connections="10" maxconnections="40" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">
<users>
<user user="club" password="edb:club"/>
</users>
<connections>
<connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
</connections>
</instance
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rushcc2006/archive/2009/11/07/4775135.aspx
[原创]在zend studio 7.1里安装aptana,强强整合!
Php/Js/Shell/Go jackxiang 2010-1-1 17:16
http://www.zendstudio.net/archives/zend-studio-7-1-and-aptana-are-good-brothers/
上面说的都是管理员权限下的安装!!!其余非管理员的用户似乎有问题的,我试了下。
插件下载地址:
http://www.aptana.org/studio/plugin
Aptana Studio 2.0 Plugin Installation Instructions
Eclipse Update Site: Installing via Aptana or Eclipse
Update Site:
http://download.aptana.org/tools/studio/plugin/install/studio
Detailed Directions:
1. From the Help menu, select Install New Software... to open an Install pop-up window.
2. In the Work with: text box of the Install window, type the URL http://download.aptana.org/tools/studio/plugin/install/studio for the update site, and hit the Enter key.
3. In the populated table below, check the box next to the name of the plug-in, and click the Next button.
4. Click the Next button to go to the license page.
5. Choose the option to accept the terms of the license agreement, and click the Finish button.
Manual Installation: Download the Plugin Update Site
1. Download Studio 2.0 Plugin zip.
2. Open Eclipse distribution, and go to Help -> Install New Software....
3. Click the Add... button to open the Add Site window.
4. Click the Archive... button, and select the file saved in step 1.
5. Select the appropriate plugins to install, and click Next -> Next.
6. Click the Finish button.
上面说的都是管理员权限下的安装!!!其余非管理员的用户似乎有问题的,我试了下。
插件下载地址:
http://www.aptana.org/studio/plugin
Aptana Studio 2.0 Plugin Installation Instructions
Eclipse Update Site: Installing via Aptana or Eclipse
Update Site:
http://download.aptana.org/tools/studio/plugin/install/studio
Detailed Directions:
1. From the Help menu, select Install New Software... to open an Install pop-up window.
2. In the Work with: text box of the Install window, type the URL http://download.aptana.org/tools/studio/plugin/install/studio for the update site, and hit the Enter key.
3. In the populated table below, check the box next to the name of the plug-in, and click the Next button.
4. Click the Next button to go to the license page.
5. Choose the option to accept the terms of the license agreement, and click the Finish button.
Manual Installation: Download the Plugin Update Site
1. Download Studio 2.0 Plugin zip.
2. Open Eclipse distribution, and go to Help -> Install New Software....
3. Click the Add... button to open the Add Site window.
4. Click the Archive... button, and select the file saved in step 1.
5. Select the appropriate plugins to install, and click Next -> Next.
6. Click the Finish button.
AMD X2 240
斯巴达克 黑潮BA-140 499 這塊主板採用原生AM3 純DDR3內存 . 5相供電
斯巴达克黑潮BA-210集成的显卡(备选)
DDR3 金士顿 4G
宏基19寸 led//新
其余买二手。
http://news.newhua.com/news1/yj_diy/2009/513/0951314194427B15D6AI99ECFBFE0854C90A164JIEDIAE80AIAGK455_3.html?lt=common
斯巴达克 黑潮BA-140 499 這塊主板採用原生AM3 純DDR3內存 . 5相供電
斯巴达克黑潮BA-210集成的显卡(备选)
DDR3 金士顿 4G
宏基19寸 led//新
其余买二手。
http://news.newhua.com/news1/yj_diy/2009/513/0951314194427B15D6AI99ECFBFE0854C90A164JIEDIAE80AIAGK455_3.html?lt=common
新浪微博已开放很久但是无奈一直不提供api.网上也没搜索到相应的,因此风吟自己写了一个函数。可以发送到新浪微博。跟大家分享,希望官方能及早开放API。诞生更多应用.
以下为引用的内容:
以下为引用的内容:
<?php
/*
-------------------------------------------------------
@名称:基于CURL的新浪微博接口
@演示:http://demos.fengyin.name/apps/sina-microblog-api.php
@作者:风吟
@博客:http://fengyin.name/
@更新:2009年11月6日 17:15:54
@版权:Copyright (c) 风吟版权所有转载请保留注释,本程序为开源程序(开放源代码)。
只要你遵守 MIT licence 协议.您就可以自由地传播和修改源码以及创作衍生作品.
-------------------------------------------------------
调用方式:
sendmicroblog([帐号],[密码],[内容]);
*/
function sendmicroblog($a, $b, $c) {
$d = tempnam('./', 'cookie.txt'); //创建随机临时文件保存cookie.
$ch = curl_init("");
curl_setopt($ch, CURLOPT_COOKIEJAR, $d);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, "FengYin");
curl_exec($ch);
curl_close($ch);
unset($ch);
$ch = curl_init($ch);
curl_setopt($ch, CURLOPT_URL, "");
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "content=".urlencode($c));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $d);
curl_exec($ch);
curl_close($ch);
unlink($d);//删除临时文件.
}
/*
使用方式:
sendmicroblog(我爱新浪 - 通过风吟API发送');
*/
?>
/*
-------------------------------------------------------
@名称:基于CURL的新浪微博接口
@演示:http://demos.fengyin.name/apps/sina-microblog-api.php
@作者:风吟
@博客:http://fengyin.name/
@更新:2009年11月6日 17:15:54
@版权:Copyright (c) 风吟版权所有转载请保留注释,本程序为开源程序(开放源代码)。
只要你遵守 MIT licence 协议.您就可以自由地传播和修改源码以及创作衍生作品.
-------------------------------------------------------
调用方式:
sendmicroblog([帐号],[密码],[内容]);
*/
function sendmicroblog($a, $b, $c) {
$d = tempnam('./', 'cookie.txt'); //创建随机临时文件保存cookie.
$ch = curl_init("");
curl_setopt($ch, CURLOPT_COOKIEJAR, $d);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, "FengYin");
curl_exec($ch);
curl_close($ch);
unset($ch);
$ch = curl_init($ch);
curl_setopt($ch, CURLOPT_URL, "");
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "content=".urlencode($c));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $d);
curl_exec($ch);
curl_close($ch);
unlink($d);//删除临时文件.
}
/*
使用方式:
sendmicroblog(我爱新浪 - 通过风吟API发送');
*/
?>
软件包下载:
http://sqlrelay.sourceforge.net/download.html
http://rudiments.sourceforge.net/download.html
写的比较好的安装url:http://www.linuxsir.org/main/?q=node/144
阅读全文
http://sqlrelay.sourceforge.net/download.html
http://rudiments.sourceforge.net/download.html
写的比较好的安装url:http://www.linuxsir.org/main/?q=node/144
阅读全文
随着PHP 5.3的发布,这个开源动态语言迎来了近两年来的最重要更新,新版PHP具有一长串新功能,性能得到大大改进。
应该说,PHP 5.3版是一个大于开发者预期的重大版本,加入了最初计划在PHP 6中出现的一些功能。新版PHP将继续扮演与Ruby、Java和.net等多种技术相竞争的开源语言角色。
PHP核心开发人员Ilia Alshanetsky表示,“在新特点和功能方面,PHP 5.3可以说比任何人预想的都要更全面,这主要因为PHP 6推迟发布的原因。因此尽管它发布的时间间隔有些长,但是我认为这种等待是值得的,PHP 5.3是一个汇聚众多开发者心血的优秀作品。”
Alshanetsky表示,与多数重要版本PHP一样,这个版本的PHP引入了众多改进,可以让开发者更简单的使用它。
PHP 5.3简化应用程序部署的方式之一是它支持新命名空间,这是封装类和其它PHP对象的方式之一。
Alshanetsky表示,对PHP开发者来说,命名空间可以带来更清晰的代码和更简单的名称约定。
“目前,多数程序库作者被迫在他们的类和函数名称前加上库名作为前缀,以避免命名冲突问题,有些时候这种做法会带来相当难用的名称,”Alshanetsky表示。“该功能还会简化单一应用程序中多程序库的利用,这些库并不一定必须遵循详细的命名约定,例如在其类/函数名称前加前缀等。”
提速与MySQL的连接
PHP经常被与开源数据库MySQL配合使用来开发Web应用,它们在开源开发工具组合LAMP中是非常重要的一部分。在PHP 5.3中增加了一个名为MySQLInd的新功能,取代了以前的libmysql库,用来连接PHP和MySQL,并拥有优化MySQL性能和内存利用率的可能。
Alshanetsky表示,“当说到数据库时,多数情况下主要的瓶颈并非数据库接口的速度,而是数据库的操作。使用MySQLInd来取代标准的 libmysql,肯定会带来速度的改善,不过我不认为它会让所有应用都提高运行速度。换句话说,使用高度调优MySQL应用的人将会看到新版PHP中更快速、更专用的接口所带来的速度提升。”
总体来说,Alshanetsky预计,通过从目前的PHP5.2转向PHP 5.3,用户应该会看到多数工作流程的性能将提高5%到15%,某些特定工作流程甚至可能看到更高的收益。
E_DEPRECATED标记将被废弃的功能
尽管增加新功能是任何新技术发布的一个关键部分,除此之外PHP 5.3还有自己的特别之处——它明确了哪个功能可能会被取消。
该版本提供了一个名为E_DEPRECATED的新错误代码,让开发者知道哪些特定功能即将从该语言中消失。
Alshanetsky表示,“以前我们曾碰到过这样的问题,我们没有一个明确的错误代码来表示已经不支持的功能,人们很难在错误代码层次上来判断什么功能可能最后被移除。”
通过创建一个专用错误代码来解决这个问题,开发者可以通过使用PHP的错误记录工具来识别自己代码库中的哪一部分还在使用将被移除的功能,因此开发者可以进行相应的调整。
据Alshanetsky表示,PHP开发团队存在一个共识,目前被标记为E_DEPRECATED的功能将在PHP 6中移除。
应该说,PHP 5.3版是一个大于开发者预期的重大版本,加入了最初计划在PHP 6中出现的一些功能。新版PHP将继续扮演与Ruby、Java和.net等多种技术相竞争的开源语言角色。
PHP核心开发人员Ilia Alshanetsky表示,“在新特点和功能方面,PHP 5.3可以说比任何人预想的都要更全面,这主要因为PHP 6推迟发布的原因。因此尽管它发布的时间间隔有些长,但是我认为这种等待是值得的,PHP 5.3是一个汇聚众多开发者心血的优秀作品。”
Alshanetsky表示,与多数重要版本PHP一样,这个版本的PHP引入了众多改进,可以让开发者更简单的使用它。
PHP 5.3简化应用程序部署的方式之一是它支持新命名空间,这是封装类和其它PHP对象的方式之一。
Alshanetsky表示,对PHP开发者来说,命名空间可以带来更清晰的代码和更简单的名称约定。
“目前,多数程序库作者被迫在他们的类和函数名称前加上库名作为前缀,以避免命名冲突问题,有些时候这种做法会带来相当难用的名称,”Alshanetsky表示。“该功能还会简化单一应用程序中多程序库的利用,这些库并不一定必须遵循详细的命名约定,例如在其类/函数名称前加前缀等。”
提速与MySQL的连接
PHP经常被与开源数据库MySQL配合使用来开发Web应用,它们在开源开发工具组合LAMP中是非常重要的一部分。在PHP 5.3中增加了一个名为MySQLInd的新功能,取代了以前的libmysql库,用来连接PHP和MySQL,并拥有优化MySQL性能和内存利用率的可能。
Alshanetsky表示,“当说到数据库时,多数情况下主要的瓶颈并非数据库接口的速度,而是数据库的操作。使用MySQLInd来取代标准的 libmysql,肯定会带来速度的改善,不过我不认为它会让所有应用都提高运行速度。换句话说,使用高度调优MySQL应用的人将会看到新版PHP中更快速、更专用的接口所带来的速度提升。”
总体来说,Alshanetsky预计,通过从目前的PHP5.2转向PHP 5.3,用户应该会看到多数工作流程的性能将提高5%到15%,某些特定工作流程甚至可能看到更高的收益。
E_DEPRECATED标记将被废弃的功能
尽管增加新功能是任何新技术发布的一个关键部分,除此之外PHP 5.3还有自己的特别之处——它明确了哪个功能可能会被取消。
该版本提供了一个名为E_DEPRECATED的新错误代码,让开发者知道哪些特定功能即将从该语言中消失。
Alshanetsky表示,“以前我们曾碰到过这样的问题,我们没有一个明确的错误代码来表示已经不支持的功能,人们很难在错误代码层次上来判断什么功能可能最后被移除。”
通过创建一个专用错误代码来解决这个问题,开发者可以通过使用PHP的错误记录工具来识别自己代码库中的哪一部分还在使用将被移除的功能,因此开发者可以进行相应的调整。
据Alshanetsky表示,PHP开发团队存在一个共识,目前被标记为E_DEPRECATED的功能将在PHP 6中移除。
Linux作为一款成熟而稳定的操作系统,其具备很多的优点。于是大部分人学习Linux操作系统,本文为你介绍Linux下php扩展cURL的安装方法,希望你能学会Linux下php扩展cURL的安装的知识。
方法一
安装cURL
1. # wget
2. http://curl.haxx.se/download/curl-7.17.1.tar.gz
3. [url=http://curl.haxx.se/download/curl-7.15.0.tar.gz][/url]
4. # tar -zxf curl-7.17.1.tar.gz
5. # ./configure –prefix=/usr/local/curl
6. # make; make install
安装php
只要打开开关 –with-curl=/usr/local/curl
就可以了。
这个扩展库还是非常棒,是fsockopen等等相关的有效的替代品。
方法二
进入安装原php的源码目录,
1. cd ext
2. cd curl
3. phpize
4. ./configure –with-curl=DIR (可以不写dir,如果你的curl安装时没有指定目录)
5. make
如下:
/php-5.2.14/ext/curl # rpm -ql curl-7.15.1-19.7
/usr/bin/curl
./configure --with-php-config=/usr/local/php/bin/php-config --with-curl=/usr/bin/
configure: error: Cannot find php-config. Please use --with-php-config=PATH
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/
Centos:yum -y install curl-devel
就会在PHPDIR/ext/curl/moudles/下生成curl.so的文件。
复制curl.so文件到extensions的配置目录,修改php.ini就好了
以上两种就是Linux下php扩展cURL的安装方法。
----------------------
编译扩展库,分别执行下面的configure和make命令。
[root@vnegar curl]# ./configure --with-php-config=/usr/local/php/bin/php-config
报错如下: checking for cURL in default path... not found configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/
解决办法:yum -y install curl-devel
出现如下报错
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/
其实就是curl的dev包没有安装, 解决方案:
终端下
# yum -y install curl-devel
然后就可以继续了:
依赖如下:
rpm -ihv openssl-devel-0.9.8a-18.26.i586.rpm
rpm -ihv libidn-devel-0.6.0-14.2.i586.rpm
rpm -ihv curl-devel-7.15.1-19.7.x86_64.rpm
Suse Linux 2.6.16.60-0.21 x86_64 编译curl出现:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
看网上有人说是:
./configure --prefix=/usr/local/confuse CFLAGS=-fPIC --disable-nls
#加这个CFLAGS=-fPIC --disable-nls 是为了解决libconfuse.a: could not read symbols: Bad value
依旧不行,这个URL说到这个问题:http://blog.csdn.net/eroswang/archive/2009/04/14/4073807.aspx
但没有人回复。
方法一
安装cURL
1. # wget
2. http://curl.haxx.se/download/curl-7.17.1.tar.gz
3. [url=http://curl.haxx.se/download/curl-7.15.0.tar.gz][/url]
4. # tar -zxf curl-7.17.1.tar.gz
5. # ./configure –prefix=/usr/local/curl
6. # make; make install
安装php
只要打开开关 –with-curl=/usr/local/curl
就可以了。
这个扩展库还是非常棒,是fsockopen等等相关的有效的替代品。
方法二
进入安装原php的源码目录,
1. cd ext
2. cd curl
3. phpize
4. ./configure –with-curl=DIR (可以不写dir,如果你的curl安装时没有指定目录)
5. make
如下:
/php-5.2.14/ext/curl # rpm -ql curl-7.15.1-19.7
/usr/bin/curl
./configure --with-php-config=/usr/local/php/bin/php-config --with-curl=/usr/bin/
configure: error: Cannot find php-config. Please use --with-php-config=PATH
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/
Centos:yum -y install curl-devel
就会在PHPDIR/ext/curl/moudles/下生成curl.so的文件。
复制curl.so文件到extensions的配置目录,修改php.ini就好了
以上两种就是Linux下php扩展cURL的安装方法。
----------------------
编译扩展库,分别执行下面的configure和make命令。
[root@vnegar curl]# ./configure --with-php-config=/usr/local/php/bin/php-config
报错如下: checking for cURL in default path... not found configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/
解决办法:yum -y install curl-devel
出现如下报错
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/
其实就是curl的dev包没有安装, 解决方案:
终端下
# yum -y install curl-devel
然后就可以继续了:
依赖如下:
rpm -ihv openssl-devel-0.9.8a-18.26.i586.rpm
rpm -ihv libidn-devel-0.6.0-14.2.i586.rpm
rpm -ihv curl-devel-7.15.1-19.7.x86_64.rpm
Suse Linux 2.6.16.60-0.21 x86_64 编译curl出现:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
看网上有人说是:
./configure --prefix=/usr/local/confuse CFLAGS=-fPIC --disable-nls
#加这个CFLAGS=-fPIC --disable-nls 是为了解决libconfuse.a: could not read symbols: Bad value
依旧不行,这个URL说到这个问题:http://blog.csdn.net/eroswang/archive/2009/04/14/4073807.aspx
但没有人回复。
PHP.INI settings: Disable exec, shell_exec, system, popen and Other Functions To Improve Security,禁用php某些函数
Php/Js/Shell/Go jackxiang 2009-12-31 21:06
date测试的时候容易出现如下情况,data-s 查询了下,可以实现如下,
date -s "2010-1-1 16:11:21"
但是其他同事也用到date("Y-m-d H:i:s"),就会说:我在调试c程序,是谁修改了服务器时间?我说:我在测试。
于是就有人说没有必要通过date -s来修改整个服务器的时间,而是重写php的该date函数,但是我一旦重写,会提示错误的。
于是又有人说可以关闭掉,date()函数,于是查了下国外的,如下:
Q. I run a small Apache based webserver for my personal use and it is shared with friends and family. However, most script kiddie try to exploit php application such as wordpress using exec() , passthru() , shell_exec() , system() etc functions. How do I disable these functions to improve my php script security?
A. PHP has a lot of functions which can be used to crack your server if not used properly. You can set list of functions in php.ini using disable_functions directive. This directive allows you to disable certain functions for security reasons. It takes on a comma-delimited list of function names. disable_functions is not affected by Safe Mode. This directive must be set in php.ini For example, you cannot set this in httpd.conf.
Open php.ini file:
# vi /etc/php.ini
Find disable_functions and set new list as follows:
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source !
Save and close the file. Restart httpd:
# service httpd restart
# vi /etc/php.ini
Find disable_functions and set new list as follows:
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source !
Save and close the file. Restart httpd:
# service httpd restart
Warning: date() has been disabled for security reasons in /*/*/datetest.php on line 5
<?php
function date($str)
{
return "2009-12-11 21:09:35";
}
echo date("Y-m-d H:i:s");
?>
function date($str)
{
return "2009-12-11 21:09:35";
}
echo date("Y-m-d H:i:s");
?>
出现:
[/usr/local/tads/htdocs/qdkj/src/view]# php datetest.php
Fatal error: Cannot redeclare date() in /data/*/*/src/view/datetest.php on line 6
I think:
PHP already has a date() function and you cannot overwrite existing functions in this language. Rename your function and it will work. Or wrap it in a class and it will work as well.
于是,我在想啊,现在如果有人在用php的date,我给大家把这个date函数给disable了,大家回不会来找我呢?拭目以待。。。
EOF
^[ \t]*\n
注意\t前有空格符。 下面的操作添加正则表达式,该表达式代表待查找的空行。(技巧提示:空行仅包括空格符、制表符、回车符,且必须以这三个符号之一作为一行的开头,并且以回车符结尾,查找空行的关键是构造代表空行的正则表达式)。
(1)选择“行首”,则查找内容组合框中出现字符“^”,表示待查找的字符串必须出现在文本中一行的行首,才符合条件。
(2)选择“范围内的字符”,“^”后增加一对括号“[]”,当前插入点在括号中。括号在正则表达式中表示,文本中的字符匹配括号中任意一个字符即符合查找条件。
(3)按一下空格键,添加空格符。空格符是空行的一个组成成分。
(4)选择“制表符”,添加代表制表符的“\t”。
(5)移动光标,将当前插入点移到“]”之后,然后选择“0或多次匹配”,添加了星号字符“*”。星号表示,其前面的括号“[]”内的空格符或制表符,在一行中出现0个或多个。
(6)选择“换行”,插入“\n”,表示回车符。
3.替换内容组合框保持空,表示删除查找到的内容。单击“替换”按钮逐个行删除空行,或单击“全部替换”按钮删除全部空行(注意:EditPlus和UltraEdit均存在全部替换不能一次性完全删除空行的问题,可能是程序BUG,需要多按几次按钮)。
对于熟悉EditPlus的朋友,可以直接在Find what中输入正则表达式^[ \t]*\n ,注意\t前有空格符
参考来源:
http://info.office.hc360.com/2008/07/11142343729.shtml
awk批量shell命令生成示例
Php/Js/Shell/Go jackxiang 2009-12-31 10:40
** 表示中文:
步骤:
1.先出一个统一的文件shell.sh:
2.用awk命令:
生成如下:
**1000.txt
**1001.txt
**1002.txt
.
.
.
在Linux下想把中文**去掉,如下:**1001.txt
**1002.txt
.
.
.
mv *1001.txt 1001.txt
mv *1002.txt 1002.txt
mv *1003.txt 1003.txt
mv *1004.txt 1004.txt
mv *1005.txt 1005.txt
mv *1006.txt 1006.txt
mv *1007.txt 1007.txt
mv *1008.txt 1008.txt
.
.
.
如何生成如上的语句?mv *1002.txt 1002.txt
mv *1003.txt 1003.txt
mv *1004.txt 1004.txt
mv *1005.txt 1005.txt
mv *1006.txt 1006.txt
mv *1007.txt 1007.txt
mv *1008.txt 1008.txt
.
.
.
步骤:
1.先出一个统一的文件shell.sh:
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
2.用awk命令:
num=1000;
cat shell.sh |awk -F"1000" '{print $1 '$num'+NR $2 '$num'+NR $3}'
cat shell.sh |awk -F"1000" '{print $1 '$num'+NR $2 '$num'+NR $3}'
生成如下:
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
.
.
.
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
mv *1000.txt 1000.txt
.
.
.
Problem:
------------------------------------------------------------------------------------------------------------------------
比如一个文件为:
a 3
b 2
c 4
a 5
d 1
c 2
我要得到唯一的第一列的总和的前三名
就是
a的和为8
c的和为6
然后再按照和排序
a 8
c 6
b 2
d 1
然后得到前三
Solution:
------------------------------------------------------------------------------------------------------------------------
[root@SGDVG405 zhu]# cat datafile
a 3
b 2
c 4
a 5
d 1
c 2
[root@SGDVG405 zhu]# cat datafile |awk '
{
a[$1] += $2;
}
END{
for(i in a) print i,a[i];}
'
a 8
b 2
c 6
d 1
[root@SGDVG405 zhu]#
最好用sort -k2,2nr 排序
------------------------------------------------------------------------------------------------------------------------
比如一个文件为:
a 3
b 2
c 4
a 5
d 1
c 2
我要得到唯一的第一列的总和的前三名
就是
a的和为8
c的和为6
然后再按照和排序
a 8
c 6
b 2
d 1
然后得到前三
Solution:
------------------------------------------------------------------------------------------------------------------------
[root@SGDVG405 zhu]# cat datafile
a 3
b 2
c 4
a 5
d 1
c 2
[root@SGDVG405 zhu]# cat datafile |awk '
{
a[$1] += $2;
}
END{
for(i in a) print i,a[i];}
'
a 8
b 2
c 6
d 1
[root@SGDVG405 zhu]#
最好用sort -k2,2nr 排序
提示:其实 man awk 提供的文档也很详细,不过整理加上中文估计还是可以对初学者有一定帮助的。
awk 用法:awk ‘ pattern {action} ‘
变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
1、
awk ‘/101/’ file 显示文件file中包含101的匹配行。
awk ‘/101/,/105/’ file
awk ‘$1 == 5′ file
awk ‘$1 == “CT”‘ file 注意必须带双引号
awk ‘$1 * $2 >100 ‘ file
awk ‘$2 >5 && $2<=15' file
2、
awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。
awk '/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
3、
df | awk '$4>1000000 ‘ 通过管道符获得输入,如:显示第4个域满足条件的行。
4、
awk -F “|” ‘{print $1}’ file 按照新的分隔符“|”进行操作。
awk ‘BEGIN { FS=”[: \t|]” } {print $1,$2,$3}’ file 通过设置输入分隔符(FS=”[: \t|]”)修改输入分隔符。
Sep=”|”
awk -F $Sep ‘{print $1}’ file 按照环境变量Sep的值做为分隔符。
awk -F ‘[ :\t|]’ ‘{print $1}’ file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
awk -F ‘[][]’ ‘{print $1}’ file 按照正则表达式的值做为分隔符,这里代表[、]
5、
awk -f awkfile file 通过文件awkfile的内容依次进行控制。
cat awkfile /101/{print “\047 Hello! \047″} –遇到匹配行以后打印 ‘ Hello! ‘.\047代表单引号。
{print $1,$2} –因为没有模式控制,打印每一行的前两个域。
6、
awk ‘$1 ~ /101/ {print $1}’ file 显示文件中第一个域匹配101的行(记录)。
7、
awk ‘BEGIN { OFS=”%”} {print $1,$2}’ file 通过设置输出分隔符(OFS=”%”)修改输出格式。
8、
awk ‘BEGIN { max=100 ;print “max=” max} BEGIN 表示在处理任意行之前进行的操作。{max=($1 >max ?$1:max); print $1,”Now max is “max}’ file 取得文件第一个域的最大值。
(表达式1?表达式2:表达式3 相当于:
if (表达式1)
表达式2
else
表达式3
awk ‘{print ($1>4 ? “high “$1: “low “$1)}’ file
9、
awk ‘$1 * $2 >100 {print $1}’ file 显示文件中第一个域匹配101的行(记录)。
10、
awk ‘{$1 == ‘Chi’ {$3 = ‘China’; print}’ file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk ‘{$7 %= 3; print $7}’ file 将第7域被3除,并将余数赋给第7域再打印。
11、
awk ‘/tom/ {wage=$2+$3; printf wage}’ file 找到匹配行后为变量wage赋值并打印该变量。
12、
awk ‘/tom/ {count++;}
END {print “tom was found “count” times”}’ file END表示在所有输入行处理完后进行处理。
13、
awk ‘gsub(/\$/,”");gsub(/,/,”"); cost+=$4; END {print “The total is $” cost>”filename”}’ file gsub函数用空串替换$和,再将结果输出到filename中。
1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00
awk ‘{gsub(/\$/,”");gsub(/,/,”");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过if和else if完成条件语句
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过exit在某条件时退出,但是仍执行END操作。
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf “c4=[%d]\n”,c4}”‘ file
通过next在某条件时跳过该行,对下一行执行操作。
14、
awk ‘{ print FILENAME,$0 }’ file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
15、
awk ‘ $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0,” “) +1)>$1}’ fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。
16、
awk ‘BEGIN {”date”|getline d; print d}’ 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
17、
awk ‘BEGIN {system(”echo \”Input your name:\\c\”"); getline d;print “\nYour name is”,d,”\b!\n”}’
通过getline命令交互输入name,并显示出来。
awk ‘BEGIN {FS=”:”; while(getline< "/etc/passwd" >0) { if($1~”050[0-9]_”) print $1}}’
打印/etc/passwd文件中用户名包含050x_的用户名。
18、
awk ‘{ i=1;while(i awk '{ for(i=1;i type file|awk -F "/" '
{ for(i=1;i { if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 显示一个文件的全路径。
用for和if显示日期
awk 'BEGIN {
for(j=1;j<=12;j++)
{
flag=0;
printf "\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf “%02d%02d “,j,i}
}
}
}’
19、
在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk ‘{print ‘$Flag’}’ 结果为abcd
awk ‘{print “$Flag”}’ 结果为$Flag
awk 用法:awk ‘ pattern {action} ‘
变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
1、
awk ‘/101/’ file 显示文件file中包含101的匹配行。
awk ‘/101/,/105/’ file
awk ‘$1 == 5′ file
awk ‘$1 == “CT”‘ file 注意必须带双引号
awk ‘$1 * $2 >100 ‘ file
awk ‘$2 >5 && $2<=15' file
2、
awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。
awk '/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
3、
df | awk '$4>1000000 ‘ 通过管道符获得输入,如:显示第4个域满足条件的行。
4、
awk -F “|” ‘{print $1}’ file 按照新的分隔符“|”进行操作。
awk ‘BEGIN { FS=”[: \t|]” } {print $1,$2,$3}’ file 通过设置输入分隔符(FS=”[: \t|]”)修改输入分隔符。
Sep=”|”
awk -F $Sep ‘{print $1}’ file 按照环境变量Sep的值做为分隔符。
awk -F ‘[ :\t|]’ ‘{print $1}’ file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
awk -F ‘[][]’ ‘{print $1}’ file 按照正则表达式的值做为分隔符,这里代表[、]
5、
awk -f awkfile file 通过文件awkfile的内容依次进行控制。
cat awkfile /101/{print “\047 Hello! \047″} –遇到匹配行以后打印 ‘ Hello! ‘.\047代表单引号。
{print $1,$2} –因为没有模式控制,打印每一行的前两个域。
6、
awk ‘$1 ~ /101/ {print $1}’ file 显示文件中第一个域匹配101的行(记录)。
7、
awk ‘BEGIN { OFS=”%”} {print $1,$2}’ file 通过设置输出分隔符(OFS=”%”)修改输出格式。
8、
awk ‘BEGIN { max=100 ;print “max=” max} BEGIN 表示在处理任意行之前进行的操作。{max=($1 >max ?$1:max); print $1,”Now max is “max}’ file 取得文件第一个域的最大值。
(表达式1?表达式2:表达式3 相当于:
if (表达式1)
表达式2
else
表达式3
awk ‘{print ($1>4 ? “high “$1: “low “$1)}’ file
9、
awk ‘$1 * $2 >100 {print $1}’ file 显示文件中第一个域匹配101的行(记录)。
10、
awk ‘{$1 == ‘Chi’ {$3 = ‘China’; print}’ file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk ‘{$7 %= 3; print $7}’ file 将第7域被3除,并将余数赋给第7域再打印。
11、
awk ‘/tom/ {wage=$2+$3; printf wage}’ file 找到匹配行后为变量wage赋值并打印该变量。
12、
awk ‘/tom/ {count++;}
END {print “tom was found “count” times”}’ file END表示在所有输入行处理完后进行处理。
13、
awk ‘gsub(/\$/,”");gsub(/,/,”"); cost+=$4; END {print “The total is $” cost>”filename”}’ file gsub函数用空串替换$和,再将结果输出到filename中。
1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00
awk ‘{gsub(/\$/,”");gsub(/,/,”");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过if和else if完成条件语句
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过exit在某条件时退出,但是仍执行END操作。
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf “c4=[%d]\n”,c4}”‘ file
通过next在某条件时跳过该行,对下一行执行操作。
14、
awk ‘{ print FILENAME,$0 }’ file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
15、
awk ‘ $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0,” “) +1)>$1}’ fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。
16、
awk ‘BEGIN {”date”|getline d; print d}’ 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
17、
awk ‘BEGIN {system(”echo \”Input your name:\\c\”"); getline d;print “\nYour name is”,d,”\b!\n”}’
通过getline命令交互输入name,并显示出来。
awk ‘BEGIN {FS=”:”; while(getline< "/etc/passwd" >0) { if($1~”050[0-9]_”) print $1}}’
打印/etc/passwd文件中用户名包含050x_的用户名。
18、
awk ‘{ i=1;while(i awk '{ for(i=1;i type file|awk -F "/" '
{ for(i=1;i { if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 显示一个文件的全路径。
用for和if显示日期
awk 'BEGIN {
for(j=1;j<=12;j++)
{
flag=0;
printf "\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf “%02d%02d “,j,i}
}
}
}’
19、
在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk ‘{print ‘$Flag’}’ 结果为abcd
awk ‘{print “$Flag”}’ 结果为$Flag
who am i 2>/dev/null| awk '{print $1,$NF}'
xiangdong (10.65.1.154)
"NF" 代表 Awk 中的一个内置变量,表示当前记录(行)中的字段数(即列数)。在这种上下文中,"NF" 的值表示当前行中的最后一个字段的索引。通过 "$NF",你可以引用当前行中的最后一个字段的值。
who am i
xiangdong pts/1 2023-08-15 15:06 (10.65.1.154)
刚看了SHELL中的awk部分
现在想过滤文件中的空行输出
自己写的两个:
awk '{if($0 !~/^$/)print $0}' test.txt
awk '{if(NF>0)print $0}' test.txt
试了下,可以输出正确结果,但不知道完善不完善或是大家有没有更好的命令
awk 'NF' urfile
真NB!~ 学习·~~
另外两个awk的, 如果有TAB的话不能过滤出去
自己使用:
这个简单而且靠谱!阅读全文
xiangdong (10.65.1.154)
"NF" 代表 Awk 中的一个内置变量,表示当前记录(行)中的字段数(即列数)。在这种上下文中,"NF" 的值表示当前行中的最后一个字段的索引。通过 "$NF",你可以引用当前行中的最后一个字段的值。
who am i
xiangdong pts/1 2023-08-15 15:06 (10.65.1.154)
刚看了SHELL中的awk部分
现在想过滤文件中的空行输出
自己写的两个:
awk '{if($0 !~/^$/)print $0}' test.txt
awk '{if(NF>0)print $0}' test.txt
试了下,可以输出正确结果,但不知道完善不完善或是大家有没有更好的命令
awk '!/^$/' urfile
awk 'NF' urfile
awk '/./' test
awk '!/^$/' 218_219_test.txt
awk 'NF' urfile
awk '/./' test
awk '!/^$/' 218_219_test.txt
awk 'NF' urfile
真NB!~ 学习·~~
另外两个awk的, 如果有TAB的话不能过滤出去
自己使用:
awk 'NF' 218_219_test.txt
这个简单而且靠谱!阅读全文