30 Dec

sed学习

分类:电脑技术 » linux shell   出处:本站原创   
sed缓冲区
sed 处理文件时,会把文件的每一行保存在一个临时缓冲区,即模式空间。
sed处理完一行后,该模式空间就被清空,下一行等待处理。因此可把模式空间内容用命令h复制并
保存在一个暂存缓冲区(holding buffer)内,然后可用命令G把它从暂存缓冲区读出一行,并放回模式空间缓冲区,
追加在模式空间内当前行的后面。
1. sed '/north/p' datafile
缺省情况下,sed会把输入的所有行都打印在标准输出上;如果某行匹配了north,则sed将该行再打印一遍。

2. sed -n '/north/p' datafile
只打印匹配north的行.

3.删除d
sed '3d' datafile   删除第3行
sed '3,$d' datafile  删除从第3行到结束
sed '$d' datafile  删除最后一行
sed '/north/d' file  删除匹配north的行

4.替换命令s
sed 's/west/north/g' datafile 全局替换
sed 's/[0-9][0-9]$/&.5/g' datafile
所有以两位数字结尾的行,后面加上.5(点5)

sed -n 's/\(Mar\)got/\1lianne/p' datafile
Mar作为标签1,将Margot 替换成Marianne

sed 's#3#88#g' datafile等价于 sed 's/3/88/g' datafile

指定行范围:逗号
sed -n '/west/,/east/p' datafile 指定在模式west和east之间的行,打印
sed -n '5,/^northeast/p' datafile 打印从第5行到第一个以northeast开头的行之间的所有行
sed '/west/,/east/s/$/**VACA**/' datafile修改从模式east和west之间的所有行,并将行尾$替换成**VACA**

多重编辑e
sed -e '1,3d' -e 's/Mike/Jones/' datafile
删除1到3行,然后再替换Mike为Jones(先全部执行完第一重编辑,再进行第二重编辑)

读入r
sed '/suan/r newfile' datafile
如果文件datafile中某一行匹配到模式suan,则在该行后读入newfile的内容。

写文件w
sed -n '/north/w newfile' datafile
如果文件datafile中某一行匹配到模式north,则把该行写入newfile文件中

追加
sed '/^north /a\\
----->THE NORTH SALES<------

插入
sed '/eastern/i\\
NEW ENGLAND REGION\\
----------------' datafile
下一行命令n
sed '/eastern/{n;s/AM/Archie/;}' datafile
如果某一行匹配到模式eastern,  命令n指示sed用下一输入行,即包含AM的那一行,
替换模式空间中的当前行,并用Archie替换AM,然后打印该行,再继续向下处理

转换y
sed '1,3y/abcdef/ABCDEF/' datafile
  把第1到3行中abcedf字母转换成大写字母

退出q
sed '5q' datafile打印5行后退出
sed '/Lewis/{s/Lewid/Joseph/;q;} datafile
  某行匹配到Lewis时,先用Joseph替换Lewis,然后立即退出

暂存和取用(h和g命令)
sed -e '/WE/{h;d;}' -e '/CT/{G;}' datafile
找到某一行匹配模式WE,用命令h将该行从模式缓冲区拷贝到一个暂存缓冲区,再用命令d把
该模式空间缓冲区那份拷贝删除。找到模式CT后,再用G命令取出保存在暂存缓冲区中的副本,
用其替换模式空间当前行。

暂存和互换命令x
sed -e '/Patricia/h' -e '/Margot/x' datafile
x命令将暂存区的内容和模式空间内的当前行互换
sed脚本编程:把sed组成一个文本文件,执行脚本时,sed 先将输入文件中第一行拷贝到模式缓冲区
,然后执行脚本中的所有命令;每行处理完毕后,sed再拷贝文件中下一行到模式缓冲区,
执行脚本中的所有命令。
如:
/Lewis/a\
     Lewis is TOP salesperson for April!!!\
     Lewis is moving to the southern district next month.\
/Margot/c\
    ********************
    MARGOT HAS RETIRED\
    ********************
/i\
   mployer database\
   _________________

$d

%sed -f filename datafile
sed -n '/sentimeatal/p' filename
sed '1,3d' filename > newfile
sed '/[Dd]aniel/d' filename
sed -n '15,20p' filename
sed '/1,10s/Montana/MT/g' filename
sed '/March/!d' filename
sed '/March/\!d' filename
sed 's/\([Oo]cuur\)ence/\1rence' file
sed '/^....//' file删除每行前4个字符
sed '/....$//' file删除每行后4个字符
sed '/east/,/west/s/North/South/' filename
把从east到west范围内出现的第一个North替换成South,只一次


sed 's/%//g'  把%换成空格

sed 's/^0*//g' 把以0开头的数字换成空格

sed /^$/d  删除空行

sed $d 删除最后一行

sed ld 删除第一行

sed 's/[0-9][0-9]*/&  password/g'  file.txt   把password连接到
24 Sep

Linux SHELL if 命令参数说明

分类:电脑技术 » linux shell   出处:本站原创   
放着备查

–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
UNIX Shell 里面比较字符写法:

-eq   等于
-ne    不等于
-gt    大于
-lt    小于
-le    小于等于
-ge   大于等于
-z    空串
=     两个字符相等
!=    两个字符不等
-n    非空串
zz from http://blog.penner.cn/2007/03/25/linux-shell-if.html
Tags: ,
4 Aug

apache Rewrite 二级域名设定

分类:电脑技术 » 综合知识   出处:本站原创   
在httpd.conf中,对某个主机进行以下操作:


        rewriteengine on
        rewritecond %{HTTP_HOST} [^.]+\.域名\.com$
        rewriterule ^(.+) %{HTTP_HOST}$1 [C]
        rewriterule ([^.]+)\.域名\.com(.*) /$1$2
        其他配置文件


接着在DNS中开设一个泛解析到对应的IP地址。
就可以实现下面的方案。

域名:domain.com
绝对路径:/home/domain.com/
www.domain.com 自动解析到 /home/domain.com/www/
abc.domain.com 自动解析到 /home/domain.com/abc/
等等子域名都可以自动解析到 /home/domains.com/对应子域名名称的文件夹

直接建立子域名名称的文件夹即可使用。不需重启apache。

泛域名解析就是将客户的域名全部解析到同一个IP地址。
例如客户的域名a.com,之下所设的*.a.com全部解析到同一个IP地址上去。
比如客户设b.a.com就会自已自动解析到与a.com同一个IP地址上去。

泛域名是指  *  IN  A   123.123.123.123 或  *   IN  CNAME www.aaa.com

泛域名解析的用途:

1.可以让域名支持无限的子域名(这也是泛域名解析最大的用途)。
2.防止用户错误输入导致的网站不能访问的问题。

在DNS服务器里面设置泛域名解析有2种方式

1. 在域名解析里面设置 *.a.com的A记录或者CName 记录指向某一个IP/服务器名(这种方式 虚拟主机用户是不支持的)
2. 在域名转发里面设置 *.a.com 转发到 http://www.a.com( 虚拟主机可以支持这种转发方式,用户在自己的程序中可以判断访问者要访问的域名),我们会在程序技术文档里面讲解

例子二:
http://www.xuega.com/klein/blog/article_321.html

实现动态二级域名解析的一个关键就是,把特有的名字怎么能够提出来,因为RewriteRule中的匹配,是不包括域名的匹配的,其实这其中就是一层窗户纸,把域名先重写放到“路径”中,再对“路径”重写一次就可以了,也就是说加一步过渡。这样说大概还一头雾水,给个实例。

首先按我上次写的文章的那个需求写一个,假设动态解析*.iecn.cn。

注意要先做一个所谓的范域名解析,就是说把所有*.iecn.cn解析到某个IP上去,这不是本文章讨论范围就不细说了。

Apache中相关配置如下:


ServerAdmin yourmail@domain.com
DocumentRoot /YourWwwRoot/.default
ServerName all-sites
ErrorLog logs/all-sites-error_log
CustomLog logs/all-sites-access_log common
# 下面三行实现动态解析
RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$
RewriteRule ^/(.*)$ /%{SERVER_NAME}/$1 ##注##
RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/(.*)$ /YourWwwRoot/$1/$2 [L]
# 没有解析到的情况下扔到自己的一个PHP中做一下处理
RewriteRule ^.*$ /index.php [L]


注意我标注的地方,那一步就是一个过渡,说一下过程吧,假设现在访问:
http://zhong.iecn.cn/xxx
经第一步重写,变成 /zhong.iecn.cn/xxx
经第二步重写就是 /YourWwwRoot/zhong/xxx 了,其他的操作与我行前说的基本就差不多了。

再举一个可能更常见的实例,假设一个博客系统,要求把
http://xxx.iecn.cn
隐式的重写成
http://blog.iecn.cn/blog.php?u=xxx
这里面的xxx可以看做是一个用户名,想必类似这样的需求大家一定都见过很多了,不过多解释了。

同意先做范域名解析这里不多说。在Apache中做如下重写(只写Rewrite部分了):

RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$
RewriteRule ^/?$ /%{HTTP_HOST}
RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/?$ /blog.php?u=$1 [L]

zz from http://blog.iecn.net/blog.php?do=showone&tid=1013


Apache下用rewrite实现任意域名的动态解析

Apache的mod_rewrite模块功能非常强大,我以后会写更多的实例出来。

关于mod_rewrite的使用,不想多说,提供两个相关文档的地址:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html
http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html

如果你只是想用一个现成的你可以直接把我的copy过去改改,如果想从技术上搞清楚,那么首先要掌握两方面的技术:
Apache下mod_rewrite的使用(可参照我上面提供的两个地址)
正则表达式(这是一门在很多地方都非常有用的技术)

废话不多说,说一下我在IECN.NET服务器的实际配置。

我习惯使用NameVirtualHost,如果你的服务器中只想用这种动态的解析,直接在配置文件中做是一样的,如果想保留自己一些特殊站点的配置,还是用NameVirtualHost吧。

在Apache中,如果启用了NameVirtualHost,在没有匹配到的解析的情况下,会默认到第一组VirtualHost中,所以我们的动态解析自然是放到第一组VirtualHost(有关apache的一些配置这里就不多说,自己查阅相关文档。),如下:

    ServerAdmin yourmail@domain.com
    DocumentRoot /YourWwwRoot/.default
    ServerName all-sites
    ErrorLog logs/all-sites-error_log
    CustomLog logs/all-sites-access_log common
    # 下面两行实现动态解析
    RewriteCond /YourWwwRoot/%{SERVER_NAME} -d
    RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]
    # 没有解析到的情况下扔到自己的一个PHP中做一下处理
    RewriteRule ^.*$ /index.php [L]


把YourWwwRoot换成你自己的路径,注意这里的ServerName没有让它起作用,关建看这两行:
RewriteCond /YourWwwRoot/%{SERVER_NAME} -d
RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]

第一行是一个rewrite条件,这里的条件是:如果存在路径/YourWwwRoot/%{SERVER_NAME},%{SERVER_NAME}就是你访问站点的域名,-d就表示存在这个路径的意思(如果是文件则是-f);
第二行是一个rewrite规则,这个规则执行的前提是:符合规则的正则表达式匹配;符合它前面(也就是刚才说的第一行)rewrite条件。这里面是的匹配的是.*,也就是所有了,也就是说只要第一行的条件成立,它就会被重写到/YourWwwRoot/%{SERVER_NAME}/$1,% {SERVER_NAME}是站点的域名,$1则是匹配到的.*。

OK,现在就很清楚了,假设现在有www.domain.com指向到这个服务器,当你访问它时(这里假设没有在其他VirtualHost解析这个域名),看看它是如何工作的:
首先它在没有找到匹配的解析时,就来到了这组默认的VirtualHost;
判断 /YourWwwRoot/www.domain.com 是否存在;
如果存在,重定向到 /YourWwwRoot/www.domain.com。

假设你访问 http://www.domain.com/test.html,就会重定向到系统的 /YourWwwRoot/www.domain.com/test.html。

那也就是说你在 YourWwwRoot 下建一个与域名同名的目录(并具备apache访问的权限),就实现了这个域名的解析。

23 Jul

查找某时间段修改的文件

分类:电脑技术 » linux shell   出处:本站原创   
需要查找某目录下某个时间段的文件,考虑到目录的特殊性(例如含有空格),做了一些特别的处理(感谢阿阿飛兄弟)

#!/bin/bash

find "$1" | while read name; do
  iname=`file "$name"|awk -F: '{print $2}'| sed -e 's/ //g'`
  if [ ! "$iname" == 'directory' ] && [ ! "$iname" == 'symbolic' ]; then
    filetime=`ls -l "$name" --time-style +%Y%m%d | awk '{print $6}'`
    if [ $2 -le $filetime ] && [ $filetime -le $3 ]; then
      echo $name
    fi
  fi
done


执行:
./findfile  /root 20080710 20080720

对于含有空格的目录如根目录下的test test
可以用./findfile  /test\ test/ 20080701 20080723 这样来执行


有任何意见欢迎提出:)
Tags:
14 Jul

帮朋友写的一个脚本

分类:电脑技术 » linux shell   出处:本站原创   
要求:
1、目录/FTP/下有很多用户目录,分别是某一个公司的英文缩写,FTP目录结构为
/FTP/AAA/DOWNLOAD
/FTP/BBB/DOWNLOAD
......
2、在每一个公司的DOWNLOAD下,每天会有很多文本文件上传过来,但为了便于数据统计,导入到XML乃至数据库中,需要对上传的文件进行批量重命名,命名的格式如:CCO_AAA_SZ2008071401_SZ_V04.test1.txt,其中2008071401是文件修改日期。

3、文件内容如:
引用
AAA公司|上传数据|A经理
0012|560|jack|2006
1323|7787|rose|2008
abcd|yes|35|88


重新命名文件之后,需要对每个文件的内容进行修改,修改要求如下:
以|为分隔符分割字段,删除文件的第一行,将剩下内容每一行|之前的字符删除(包括|符号),然后将|替换成||,最后判断剩下的内容,如果剩下文件内容的第一行不是以13开头,删除!

初步代码如下,还不完善,有不妥的地方希望大家批评指正。

#!/bin/bash
#
for path in /FTP/*/DOWNLOAD ; do
    cd $path
    compay=`pwd | awk -F/ '{print $(NF-1)}'`

    ls -l $1 | grep ^[^d] | awk '{print $9}' | sed -e '/^$/d' | while read name;do
    if [ ! `echo $name | awk '/^CCO/'` ]; then
        modifytime=`ls -l $name --time-style +%Y%m%d | awk '{print $6}'`
        newname=CCO_"$compay"_SZ"$modifytime"01_SZ_V04."$name".txt
        echo "rename $path/$name to $path/$newname ..."
        mv $path/$name $path/$newname
        echo "modify the content of $newname"
        sed -i '1d; s/[^|]*|//; s/|/||/g' $newname
        sed -i '1{/^13/!d}' $newname
    fi
    done
done
Tags:
分页: 1/6 第一页 1 2 3 4 5 6 下页 最后页 [ 显示模式: 摘要 | 列表 ]