NFS缓存对带宽的影响

2009年4月29日

下面我们用这幅图做对比
192.168.10.11 2G内存
192.168.10.12 4G内存

192.168.10.21 NFS服务器

以往为了得到更好的性能和更低的网络占用 通常会使用cachefs,而在LINUX上这种方式已经过时,LINUX的VFS(Virtual File System)通过使用缓存来缓存经常读写的文件达到减少磁盘读写的目的,同样适用基于网络的文件系统,例如NFS,而我们平常内存中大量占用的buffers就是由于这个原因,而我们不需要去考虑buffers的使用,因为这些内存会根据内存的使用需求自动释放

e69caae591bde5908d

通过这张图明显的对比,2G内存的NFS Client网络流量几乎是4G内存的2倍有多!而NFS的数据量达30G,同样体现了NFS的高性能及内存对NFS的影响

作者: admin 分类: Linux&Unix 标签:

LINUX下用iptables来实现NAT

2009年4月29日

(一)Iptables 的使用语法
在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项::
1. 对规则的操作
加入(append) 一个新规则到一个链 (-A)的最后。
在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
在链内某个位置替换(replace) 一条规则 (-R)。
在链内某个位置删除(delete) 一条规则 (-D)。
删除(delete) 链内第一条规则 (-D)。
2. 指定源地址和目的地址
通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:
a. 使用完整的域名,如“www.linuxaid.com.cn”;
b. 使用ip地址,如“192.168.1.1”;
c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。
缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
3. 指定网络接口
可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。
4. 指定协议及端口
可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。

(二)iptabls的使用实例:
假如有一个广域网的ip地址为a.b.c.d 网关a.b.c.x 掩码 255.255.255.252
局域网ip地址为192.168.0.1-192.168.0.255 网关 192.168.0.1
软件环境为:Linux7.2 选择server安装
指定eth0:a.b.c.d eth1:192.168.0.1
添加路油表
vi /etc/sysconfig/static-routes
etho net a.b.c.d netmask 255.255.255.252 gw a.b.c.x
eth1 net 192.168.0.1netmask 255.255.255.0 gw 192.168.0.1
指定网关
vi /etc/sysconfig/network
NETWORKING=yes
GATEWAYDEV=eth0
GATEWAY=a.b.c.x
HOSTNAME=(主机名字)
起用路油
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter=1
kernel.core_uses_pid=1
kernel.sysrq=0
配置iptables的脚本
建立rc.fw
#for this to run iptables firewall
!/bin/sh
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT
上面这些是没有任何限制的iptables要想有些安全限制可以自行
新的联接
(三)端口的转发
假如内部有一个www 服务器 一个ftp服务器
地址分别是192.168.0.8(www)
192.168.0.9(ftp)
在上面的脚本里最后添加
iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 80 –j DNAT --to 192.168.0.8:80
iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 21 -j DNAT --to 192.168.0.9:21
附录:
-p 指定协议(--protocol)
--dport 指明端口(--source-port/--sport和 --destination-port)
-i 或者-o 指定网络接口(PREROUTING链用-i POSTROUTING 用-o)
-s 指明源地址(--source/--src/源地址destination/--dst/目的地址)
-A 加入一个新规则到一个链(一般写到最后面)(append)
-I 在链内某个位置插入(insert)一般最后面
-R 在链内某个位置替换一条规则
-D 删除链内第一条规则(delete)
-d 指明目的地址
——————————————————————————————————————
下面是一个iptable的脚本没有安全性能
touch /var/lock/subsys/local
#for this to run iptables firewall
!/bin/sh
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/sbin/iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT

————————————————————————————————————————
iptables 过滤规则
# 过滤表规则

*filter

# 默认彻略
:FORWARD DROP [ ]
:INPUT DROP [ ]
:OUTPUT ACCEPT [ ]

# 定义新链
-N ICMP_FORWARD
-N TCP_FORWARD
-N UDP_FORWARD
-N ICMP_INPUT
-N TCP_INPUT
-N UDP_INPUT

# Fix a bug
-A OUTPUT -p icmp -m state --state INVALID -j DROP

# 以下是FORWARD链的规则
# 若是ICMP协议则跳到 ICMP_FORWARD
-A FORWARD -p icmp -j ICMP_FORWARD
# 若是TCP协议则跳到 TCP_FORWARD
-A FORWARD -p tcp -j TCP_FORWARD
# 若是UDP协议则跳到 UDP_FORWARD
-A FORWARD -p udp -j UDP_FORWARD
# 允许碎片通过的速率200个/s,从200开始计数
-A FORWARD -f -m limit --limit 200/s --limit-burst 200 -j ACCEPT
# 不匹配FORWARD链的所有规则,丢弃数据包,结束FORWARD链
-A FORWARD -j DROP

# 以下是FORWARD链中针对ICMP协议的规则
# 从内网到外网的放行
-A ICMP_FORWARD -p icmp -s 192.168.0.0/24 -i eth0 -o ppp+ -j ACCEPT
# 从外网进来的回应包放行
-A ICMP_FORWARD -p icmp -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 丢弃所有不匹配的ICMP数据包,结束FORWARD链
-A ICMP_FORWARD -p icmp -j DROP

# 以下是FORWARD链中针对TCP协议的规则
# 允许内网1024以上的端口连接外网
-A TCP_FORWARD -p tcp -s 192.168.0.0/24 -m tcp --sport 1024: -i eth0 -o ppp+ -j ACCEPT
# 允许内网进行主动式的FTP
-A TCP_FORWARD -p tcp -m tcp --sport 21 --dport 1024: -m state --state ESTABLISHED -i ppp+ -j ACCEPT
-A TCP_FORWARD -p tcp -m tcp --sport 20 --dport 1024: -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 允许外网进来的回应包通过
-A TCP_FORWARD -p tcp -m state --state ESTABLISHED -m tcp --dport 1024: -i ppp+ -j ACCEPT
# 丢弃所有不匹配的TCP数据包,结束FORWARD链
-A TCP_FORWARD -p tcp -j DROP

# 以下是FORWARD链中针对UDP协议的规则
# 允许内网1024以上的端口连接外网
-A UDP_FORWARD -p udp -s 192.168.0.0/24 -m udp --sport 1024: -i eth0 -o ppp+ -j ACCEPT
# 允许外网中指明的DNS服务器进行域名解析
-A UDP_FORWARD -p udp -s 202.96.96.68 -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
-A UDP_FORWARD -p udp -s 202.96.*.* -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
# 开放IRC OICQ 端口
-A UDP_FORWARD -p udp -m multiport --source-port 4000,8000 -m udp --dport 1024: -i ppp+ -j ACCEPT
# 允许从外网进来的UDP回应包通行
-A UDP_FORWARD -p udp -m state --state ESTABLISHED,RELATED -m udp --dport 1024: -i ppp+ -j ACCEPT
# 丢弃所有不匹配的UDP数据包,结束FORWARD链
-A UDP_FORWARD -p udp -j DROP

# 以下开始是对网关服务器的匹配规则

# 允许数据包进入本地回环接口
-A INPUT -p all -i lo -j ACCEPT

# 若是ICMP协议则跳到ICMP_INPUT进行规则匹配
-A INPUT -p icmp -j ICMP_INPUT
# 若是TCP协议则跳到TCP_INPUT进行规则匹配
-A INPUT -p tcp -j TCP_INPUT
# 若是UDP协议则跳到UDP_INPUT进行规则匹配
-A INPUT -p udp -j UDP_INPUT
# 允许碎片通过的速率200个/s,从200开始计数
-A INPUT -f -m limit --limit 200/s --limit-burst 200 -j ACCEPT
# 不匹配INPUT链的所有规则,丢弃数据包,结束INPUT链
-A INPUT -j DROP

# 以下是INPUT链中针对ICMP协议的规则
# 允许从内网来的ICMP数据包
-A ICMP_INPUT -p icmp -i eth0 -j ACCEPT
# 允许从外网来的ICMP回应包通行
-A ICMP_INPUT -p icmp -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 丢弃所有不匹配的ICMP数据包,结束INPUT链
-A ICMP_INPUT -p icmp -j DROP

# 以下是INPUT链中针对TCP协议的规则
# 对内网机器提供 http https 网上邻居 透明代理服务
-A TCP_INPUT -p tcp -s 192.168.0.0/24 -m multiport --destination-port 80,443,137,138,139,8080 -i eth0 -j ACCEPT
# 允许服务器以主动方式连接外网的FTP服务器
-A TCP_INPUT -p tcp -m tcp --sport 21 --dport 1024: -m state --state ESTABLISHED -i ppp+ -j ACCEPT
-A TCP_INPUT -p tcp -m tcp --sport 20 --dport 1024: -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 提供 ssh smtp pop3 http https 服务
-A TCP_INPUT -p tcp -m multiport --destination-port 22,25,110,80,443 -j ACCEPT
# 拒绝外网主动连接本服务器
-A TCP_INPUT -p tcp -m tcp --syn -i ppp+ -j DROP
# 允许进来的回应包通过
-A TCP_INPUT -p tcp -m state --state ESTABLISHED -m tcp --dport 1024: -j ACCEPT
# 丢弃所有不匹配的TCP数据包,结束INPUT链
-A TCP_INPUT -p tcp -j DROP

# 以下是INPUT链中针对UDP协议的规则
# 允许外网中指明的DNS服务器进行域名解析
-A UDP_INPUT -p udp -s 202.96.96.68 -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
-A UDP_INPUT -p udp -s 202.96.*.* -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT
# 为内网的机器提供DNS和SAMBA服务
-A UDP_INPUT -p udp -s 192.168.0.0/24 -m multiport --destination-port 53,137,138,139 -i eth0 -j ACCEPT
# 允许服务器作为samba client
-A UDP_INPUT -p udp -s 192.168.0.0/24 -m udp --sport 137:139 --dport 1024: -i eth0 -j ACCEPT
# 允许进来的回应包通过
-A UDP_INPUT -p udp -m state --state ESTABLISHED,RELATED -m udp --dport 1024: -j ACCEPT
# 为内网的机器提供DHCP服务
-A UDP_INPUT -p udp -m udp --sport 68 --dport 67 -i eth0 -j ACCEPT
# 丢弃所有不匹配的UDP数据包,结束INPUT链
-A UDP_INPUT -p udp -j DROP

COMMIT

# 路由表规则

*nat

# 默认彻略
:PREROUTING ACCEPT [ ]
:POSTROUTING ACCEPT [ ]
:OUTPUT ACCEPT [ ]

# 为内网机器使用squid透明代理进行端口重定向
-A PREROUTING -i eth0 -p tcp -d ! 192.168.0.1 -m tcp --dport 80 -j REDIRECT --to-ports 8080
# 对内网机器应用IP伪装
-A POSTROUTING -o ppp+ -j MASQUERADE

COMMIT

作者: admin 分类: Linux&Unix 标签:

LINUX下取得字符的字节码

2009年4月15日

With iso8859-1 encoding:

Code:
test ~ $ echo -e "ö" | od -t oC -An
366 012

With utf8 encoding:

Code:
test ~ $ echo -e "ö" | od -t oC -An
303 266 012

作者: admin 分类: Shell 标签:

Nginx 文件防盗链

2009年4月4日

比如我的 download 目录下有一个 file.zip 的文件。对应的URI 是http://example.com/download/file.zip
使用ngx_http_accesskey_module  模块后http://example.com/download/file.zip?key=09093abeac094. 只有给定的key值正确了,才能够下载 download 目录下的 file.zip
而且 key 值是根据用户的 IP 有关的,这样就可以避免被盗链了。

 下载源文件:
nginx-accesskey-2.0.3.tar.gz
解压,然后在编译nginx的时候加上:
./configure --add-module=path/to/nginx-accesskey

配置方法
 
需要在nginx的配置文件里面添加

location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}

  
语法:
accesskey [on|off]
默认是off。
用 on 开启这个功能。
 
accesskey_arg "string"
默认是 key,就是用于http://example.com/download/file.zip?key=09093abeac094 里面的 key。
如果使用 accesskey_arg "string"
要下载就应该是 http://example.com/download/file.zip?string=09093abeac094
 
accesskey_hashmethod [md5|sha1]
默认是 md5.
这里是选择哈希的类型。随便用哪个都可以。不过在生成下载 url 的时候需要使用相应的哈希方法。
 
accesskey_signature "string"
默认是accesskey_signature "$remote_addr"
这里是被签名(哈希)的字符串。
$remote_addr 表示用户的 ip。
为了很好的防盗链,这里应该给用户ip加上噪声。让别人无法猜到。
比如accesskey_signature " myPassWord $remote_addr" 
 
生成下载URL 的方法。
假设

location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}

Php自动跳转下载:

header("Location:http://example.com/download/"."$_REQUEST[file]"."?key=".md5("mypass".$_SERVER['REMOTE_ADDR']));
?>

当启动nginx出现unknown directive "Accesskey" 错误时

修改config文件  将

"$HTTP_ACCESSKEY_MODULE"替换成

"ngx_http_accesskey_module"

然后重新编译

nginxiftop

作者: admin 分类: Linux&Unix 标签:

Linux vsftp 安全 (centos5.2)

2009年3月29日

一、安装应用程序文件包
yum install db4
yum install db4-utils
yum install vsftpd

二、配置用户
创建文本文件loguser.txt 格式如下:
user_id
password
于是,我们/home/loguser.txt文件的内容为

db1
db100
db2
db200
db3
db300

三、生成数据库
db_load -T -t hash -f /home/loguser.txt /etc/vsftpd_login.db
最后设置一下数据库文件的访问权限
chmod 600 /etc/vsftpd_login.db

配置PAM文件
新建/etc/pam.d/vsftpd 内容如下:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

我们上一步建立的数据库 vsftpd_login 在此处被使用
我们建立的虚拟用户将采用PAM进行验证,这是通过/etc/vsftpd.conf文件中的 语句pam_service_name=vsftpd.vu来启用的,稍后你将发现。
如果系统内核是x86_64,那么相关文件路径需要变更到/lib64/security/下

四、为虚拟用户创建本地系统用户
新建一个系统用户virtual,用户家目录为/home/ftp, 用户登录终端设为/bin/false(即使之不能登录系统)

useradd vftpuser -d /home/ftp -s /bin/false
chown vftpuser:vftpuser /home/ftp

/etc/vsftpd.conf
根据需要创建/etc/vsftpd.conf,一般要确保含有一下设置:

listen=YES
anonymous_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
chroot_local_user=YES
guest_enable=YES
guest_username=vftpuser
user_config_dir=/etc/vsftpd_user_conf
pam_service_name=vsftpd
local_enable=YES
secure_chroot_dir=/var/run/vsftpd

现在为止,我们的3个用户都可以工作了,可是它们的根目录现在都是/home/ftp,权限也都一样。 那么怎么才能完成我们预定的目标呢?
五、配置/etc/vsftpd_user_conf
在上面的配置中,有这么一行
user_config_dir=/etc/vsftpd_user_conf
现在,我们要把各个用户的配置文件放到目录/etc/vsftpd_user_conf中

mkdir /etc/vsftpd_user_conf
cd /etc/vsftpd_user_conf
touch db1 db2 db3
db1文件中的内容如下
local_root=/home/ftp/dbzh1
同样,db2文件中的内容
local_root=/home/ftp/dbzh2
那么,db3的内容呢? 其实也很简单

write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/ftp/dbzh1

重启vsftpd我们就可以看到效果了
/etc/init.d/vsftpd start|restart

1. umask
需要参考的其他文件umask 用法:umask决定目录和文件被创建时得到的初始权限umask = 022时新建的目录权限是755 文件的权限是 644777-022=755666-022=644为了能够上传覆盖,umask=000777-000=777666-000=666
用umask命令查看或设置当前的umask
$ umask000
$ umask 022
你可以改变一下umask,建立目录和文件,观察一下还有,umask是unix操作系统的概念,vsftpd的local_umask借鉴了它http://hi.baidu.com/flowaters/blog/item/196e18f744bb9b23730eec5c.html可以在百度 hi 中搜索一下,有很多配置文章。

作者: admin 分类: Linux&Unix 标签:

解决 umount 时出现的 "Device is busy"

2009年3月24日

在Linux下umount挂载共享磁盘时候,经常会出现"Device is busy"的提示,

假设无法卸载的设备为/dsg,运行下列命令即可:

$ fuser -m -v /dsg
                      USER       PID ACCESS COMMAND

/dsg                oracle9i  5947 ..c.. bash
                    oracle9i  6277 f.ce. vagentd
                    oracle9i  6280 f.ce. vagentd
                    oracle9i  6281 f.ce. vagentd
                    oracle9i  6282 f.ce. sender
                    oracle9i  6283 f.ce. sender
                    oracle9i  6284 f.ce. vagentd
                    oracle9i  6291 f.ce. vagentd
                    oracle9i  6292 f.... oracle
                    oracle9i  6294 f.... oracle

-m参数表明指定的路径是一个挂载点显示所有使用指定文件系统的进程,后面可以跟挂载点,-v参数给出详细的输出

 用下面这个命令可以将占用目录/dsg所有进程给kill掉:

$ fuser -m –k /dsg

 这样umount: /dsg: device is busy这个问题就可以解决.

作者: admin 分类: Linux&Unix 标签:

2009年3月11日
sed 学习笔记(与大家共勉)
声明:这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位拍砖
参考资料:<sed&awk.pdf>等
一. 替换

1.神奇变换(y命令的使用)

sed 'y/ori_letter_list/target_letter_list/' filename
cat filename
1234567890
2345678901
3456789012
4567890123

测试
将文件中1换成A
将文件中2换成B
...
将文件中0换成J

sed 'y/1234567890/ABCDEFGHIJ/' filename
ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC

注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/g
list1:1234567890
list2:ABCDEFGHIJ
下面再作一个与前例相反的变换

sed 'y/0987654321/ABCDEFGHIJ/' filename
JIHGFEDCBA
IHGFEDCBAJ
HGFEDCBAJI
GFEDCBAJIH

2.替换每行第一个匹配

sed 's/regexpr/anyword/' filename
sed 's/regexpr/anyword/1' filename

举例:

QUOTE:
cat filename
1234567890 2345678901
3456789012 4567890123
sed 's/5/五/' filename
1234五67890 2345678901
34五6789012 4567890123

3.替换每行第n(如果有的话)个匹配

sed "s/regexpr/anyword/${n}" filename
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444

4.替换每行所有匹配

cat filename
1234567890 2345678901
3456789012 4567890123
举例:
sed 's/3/三/g' filename
12三4567890 2三45678901
三456789012 456789012三

二.行号处理

1.为文件加行号

sed = filename|sed 'N;s/\n/:/'
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444

举例

sed = filename|sed 'N;s/\n/:/' filename
1:111111111111111111
2:222222222222222222
3:333333333333333333
4:444444444444444444

2.仅为文件中的正文行加行号

sed /./= a|sed '/./N;s/\n/:/'

举例

cat filename
111111111111111111

222222222222222222
333333333333333333

444444444444444444

sed /./= a|sed '/./N;s/\n/:/' filename
1:111111111111111111

3:222222222222222222
4:333333333333333333

6:444444444444444444

三.字串翻转

sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

举例

echo 1234567890|sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
0987654321

四.选择性输出

1.打印文档奇数行(隔行输出)

sed 'n;d'
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7

2.打印偶数行(隔行输出)

sed -n 'n;p'
sed '1d;n;d;'
2
4
6
8

3.删除连续重复行(大量使用了pattern space 文件太大时要注意)

sed '$!N; /^\(.*\)\n\1$/!P; D'     
#使用 $!N 要当心内存溢出

举例

cat file
111111111111111111
222222222222222222
222222222222222222
333333333333333333
444444444444444444
444444444444444444
444444444444444444
444444444444444444
444444444444444444

sed '$!N; /^\(.*\)\n\1$/!P; D' filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444

4.合并上下行并以空格相分隔

sed '$!N;s/\n/ /'

举例

cat file
1234567890
0987654321
执行命令后
1234567890 0987654321

5.将以\符号结尾的行与下行合并并以空格分隔(拼接断行)

sed -e :a -e '/\\$/N; s/\\\n/ /; ta'

举例

cat filename
1 111111111111111111\
2 222222222222222222
3 333333333333333333\
4 444444444444444444

sed -e :a -e '/\\$/N; s/\\\n/ /; ta' filename
1 111111111111111111 2 222222222222222222
3 333333333333333333 4 444444444444444444

6.按关键字拼接行
  如果某行以=开始,则合并到上一行并替代=为空格

sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

举例

cat file
111111111111111111
222222222222222222
=333333333333333333
444444444444444444

sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' filename
111111111111111111
222222222222222222 333333333333333333
444444444444444444

7.输出匹配行的下一行

sed -n '/regexpr/{n;p;}' filename

举例

cat filename
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -n '/^3/{n;p;}' filename
4 444444444444444444

8.显示匹配行的行号并输出匹配行的上行、匹配行、下行

sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}' -e h
举例

cat filename
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h  filename
3                                       #匹配行的行号
2 222222222222222222  #上一行
3 333333333333333333  #匹配行
4 444444444444444444  #下一行

9.删除文档中某标志区域内的关键字匹配行

     删除文档中从being开到end结束的块中包含myword的行

sed '/^begin/,/^end/{/myword/d;}' filename
QUOTE:
cat filename
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!

end
myword
Number!

测试

QUOTE:
myword
begin
Number!
Number!
Number!
Number!

end
myword
Number!

五.字串解析

1.从字串中解析出两个子串(前2各字符和后9个字符)

echo "WeLoveChinaUnix"|sed -e 'H;s/\(..\).*/\1/;x;s/.*\(.\{9\}\)$/\1/;x;G;s/\n/ /'
We ChinaUnix

2.分解日期串

echo 20030922|sed 's/\(....\)\(..\)\(..\)/\1 \2 \3/'|read year month day
echo $year $month $day
2003 09 22



作者: admin 分类: Shell 标签:

swappiness的值的大小对如何使用swap分区

2009年3月10日

在ubuntu 里面,swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端,对于ubuntu的默认设置,这个值等于60,建议修改为10。具体这样做:
1.查看你的系统里面的swappiness
$ cat /proc/sys/vm/swappiness
不出意外的话,你应该看到是 60
2.修改swappiness值为10
$ sudo sysctl vm.swappiness=10
但是这只是临时性的修改,在你重启系统后会恢复默认的60,所以,还要做一步:
$ gksudo gedit /etc/sysctl.conf
在这个文档的最后加上这样一行:
vm.swappiness=10
然后保存,重启。ok,你的设置就生效了。你会发现,现在乌斑兔儿跑得更快了!
当然,你可以用其他编辑器进行修改,如kate,vi,vim,nano……只需要把gedit替换成它们就ok了!因为考虑到大多数人都用的gnome桌面,就写的gedit。

作者: admin 分类: Linux&Unix 标签:

VIM中粘贴格式错乱的解决方法

2009年2月21日

设置

:set paste

如果想要下次使用生效写入/etc/vimrc文件里

作者: admin 分类: Shell 标签:

或许脚本与执行目录的相对位置

2009年1月25日

 有时候脚本需要根据脚本位操作或生成文件 可使用以下方法

#! /bin/bash
md=`dirname $0`
echo $md

作者: admin 分类: Shell 标签: