awk '/mysql/&&/apache/
Submitted by admin on 2010, December 4, 5:48 PM
awk '/mysql/&&/apache/
Submitted by admin on 2010, December 4, 5:18 PM
awk '{ sub(/\r$/,""); print }'
这条语句使用了sub(regex,repl,[string])
函数。此函数将匹配regex的string替换成repl,如果没有提供string参数,则$0将会被默认使用。$0的含义在上一篇已经介绍过,代表整行。
这句话其实是将\r
删除,然后print语句在行后自动添加一个ORS,也就是默认的\n
。
awk '{ sub(/$/,"\r"); print }'
这句话同样使用了sub函数,它将长度为0的行结束符$替换成\r
,也就是CR。然后print语句在后面添加一个ORS,使每行最后以CRLF结束。
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也就是单个空格分隔所有字段,这样以来所有的多余的空格就消失了。
awk '{ sub(/^/," "); print }'
同上,sub将行首符替换为5个空格,达到了在行首添加空格的目的。
awk '{ printf "%79s\n", $0 }'
同上一篇,又使用了printf函数。
awk '{ l=length(); s=int((79-l)/2); printf "%"(s+l)"s\n", $0 }'
第一句用length函数计算当前行内容的长度,第二句计算行首应该添加多少空格,第三句让内容在s+l宽度靠右对齐。
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里面才能用到它。
awk '/baz/ { sub(/foo/,"bar") }; {print}'
(真的没什么好说的)
awk '!/baz/ { gsub(/foo/, "bar") }; { print }'
跟上一句的差别是用!
让搜到baz的返回为假。
awk '{ gsub(/scarlet|ruby|puce/,"red"); print }'
(再懒一次)
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,不输出。
awk 'ORS=NR%5?",":"\n"'
这里在每行输出前,对ORS重新进行定义,如果行号能被5整除则为\n
,否则为逗号。(也很天书的一句)
Submitted by admin on 2010, December 4, 5:09 PM
比如现在AWK处理到第五行。第一行没有进行操作,2,3,4,5行进行了操作,那么NR=5,FNR=4 NR==FNR 表示从起始行到当前行,awk都进行了操作,比如修改,添加等等 简单来说,NR就是当前读取多少行,FNR就是当前修改了多少行,FNR<=NR
Submitted by admin on 2010, December 4, 4:57 PM
|
输出为
|
|
不过严谨的用法还是用 |
Submitted by admin on 2010, December 4, 4:56 PM
Table 1. awk的环境变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔。 |
$0 | 完整的输入记录。 |
ARGC | 命令行参数的数目。 |
ARGIND | 命令行中当前文件的位置(从0开始算)。 |
ARGV | 包含命令行参数的数组。 |
CONVFMT | 数字转换格式(默认值为%.6g) |
ENVIRON | 环境变量关联数组。 |
ERRNO | 最后一个系统错误的描述。 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔)。 |
FILENAME | 当前文件名。 |
FNR | 同NR,但相对于当前文件。 |
FS | 字段分隔符(默认是任何空格)。 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配。 |
NF | 当前记录中的字段数。 |
NR | 当前记录数。 |
OFMT | 数字的输出格式(默认值是%.6g)。 |
OFS | 输出字段分隔符(默认值是一个空格)。 |
ORS | 输出记录分隔符(默认值是一个换行符)。 |
RLENGTH | 由match函数所匹配的字符串的长度。 |
RS | 记录分隔符(默认是一个换行符)。 |
RSTART | 由match函数所匹配的字符串的第一个位置。 |
SUBSEP | 数组下标分隔符(默认值是\034)。 |
Submitted by admin on 2010, December 4, 4:53 PM
[root@asmboy ~]# more tes
1 sldj
1 sldfjf
2 lsdf
1 sdsl
2 ls
[root@asmboy ~]# awk '$1==1{if(i++)printf ","$2;else printf $2}END{print ""}' tes
sldj,sldfjf,sdsl
[root@asmboy ~]# awk '$1==2{if(i++)printf ","$2;else printf $2}END{print ""}' tes
lsdf,ls
Submitted by admin on 2010, December 3, 10:17 PM
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$3&page=$3
RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3
RewriteRule ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2
</IfModule>
Submitted by admin on 2010, December 3, 4:57 PM
vi main/fopen_wrappers.c
/* {{{ php_check_open_basedir
*/
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
/* Only check when open_basedir is available */
if (PG(open_basedir) && *PG(open_basedir)) {
char *pathbuf;
char *ptr;
char *end;
// add by anxsoft.com
char *env_doc_root;
if(PG(doc_root)){
env_doc_root = estrdup(PG(doc_root));
}else{
env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
}
if(env_doc_root){
int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
efree(env_doc_root);
if (res_root == 0) {
return 0;
}
if (res_root == -2) {
errno = EPERM;
return -1;
}
}
// add by anxsoft.com
pathbuf = estrdup(PG(open_basedir));
ptr = pathbuf;
while (ptr && *ptr) {
end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
if (end != NULL) {
*end = '\0';
end++;
}
if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
efree(pathbuf);
return 0;
}
ptr = end;
}
if (warn) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
}
efree(pathbuf);
errno = EPERM; /* we deny permission to open it */
return -1;
}
/* Nothing to check... */
return 0;
}
/* }}} */
然后在 php.in的open_basedir配置
open_basedir = "/tmp/:/var/tmp/"
---------------------------
出现错误:
PHP Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s): (/www/:/tmp/) in Unknown on line 0
下载eaccelerator 0.9.6后先不要安装,解包后找到eaccelerator.c这个文件,打开第1156行,这样的:
if (PG(open_basedir) && php_check_open_basedir(realname TSRMLS_CC)) {
修改成:
if (PG(open_basedir) && php_check_open_basedir(file_handle->filename TSRMLS_CC)) {