关于作者

用户名:chenbin
笔名:chenbin
地区:

日历  

快速登录

+ 用户名:
+ 密 码:

我的博采 我的论坛 我的RSS

在线留言



访问统计:7230
文章个数:34
评论个数:5
留言条数:0



Powered by BlogDriver 2.1

太湖蟹

 

文章

常用脚本命令集
如何用脚本实现分割文件
代码:
#!/bin/bash

if [ $# -ne 2 ]; then
        echo 'Usage: split file size(in bytes)'
        exit
fi

file=$1
size=$2

if [ ! -f $file ]; then
        echo "$file doesn't exist"
        exit
fi

#TODO: test if $size is a valid integer

filesize=`/bin/ls -l $file | awk '{print $5}'`
echo filesize: $filesize

let pieces=$filesize/$size
let remain=$filesize-$pieces*$size
if [ $remain -gt 0 ]; then
        let pieces=$pieces+1
fi
echo pieces: $pieces

i=0
while [ $i -lt $pieces ];
do
        echo split: $file.$i:
        dd if=$file of=$file.$i bs=$size count=1 skip=$i
        let i=$i+1
done

echo "#!/bin/bash" > merge

echo "i=0" >> merge
echo "while [ $i -lt $pieces ];" >> merge
echo "do" >> merge
echo " echo merge: $file.$i" >> merge
echo " if [ ! -f $file.$i ]; then" >> merge
echo " echo merge: $file.$i missed" >> merge
echo " rm -f $file.merged" >> merge
echo " exit" >> merge
echo " fi" >> merge
echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge
echo " let i=$i+1" >> merge
echo "done" >> merge
chmod u+x merge'


如何查找日期为某一天的文件
代码:

#!/bin/sh
# The right of usage, distribution and modification is here by granted by the author.
# The author deny any responsibilities and liabilities related to the code.
#
OK=0
A=`find $1 -print`
if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi
if expr $3 == 2 >/dev/null ; then M=Feb ; OK=1 ; fi
if expr $3 == 3 >/dev/null ; then M=Mar ; OK=1 ; fi
if expr $3 == 4 >/dev/null ; then M=Apr ; OK=1 ; fi
if expr $3 == 5 >/dev/null ; then M=May ; OK=1 ; fi
if expr $3 == 6 >/dev/null ; then M=Jun ; OK=1 ; fi
if expr $3 == 7 >/dev/null ; then M=Jul ; OK=1 ; fi
if expr $3 == 8 >/dev/null ; then M=Aug ; OK=1 ; fi
if expr $3 == 9 >/dev/null ; then M=Sep ; OK=1 ; fi
if expr $3 == 10 >/dev/null ; then M=Oct ; OK=1 ; fi
if expr $3 == 11 >/dev/null ; then M=Nov ; OK=1 ; fi
if expr $3 == 12 >/dev/null ; then M=Dec ; OK=1 ; fi
if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi
if expr $OK == 1 > /dev/null ; then
ls -l --full-time $A 2>/dev/null | grep "$M $4" | grep $2 ;
else
  echo Usage: $0 path Year Month Day;
  echo Example: $0 ~ 1998 6 30;
fi

如何计算当前目录下的文件数和目录数
代码:

# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l ----- to count dir

如何只列子目录?
代码:

ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)

ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)

如何实现取出文件中特定的行内容
代码:

如果你只想看文件的前5行,可以使用head命令,
如: head -5 /etc/passwd

如果你想查看文件的后10行,可以使用tail命令,
如: tail -10 /etc/passwd

你知道怎么查看文件中间一段吗?你可以使用sed命令
如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行。

如何查找含特定字符串的文件
代码:

例如查找当前目录下含有"the string you want find..."字符串的文件:
$find . -type f -exec grep “the string you want find...” {} ; -print

如何列出目录树
代码:

下面的短小的shell程序可以列出目录树, 充分利用了sed强大的模式匹配能力.
目录树形式如下:
.
`----shellp
`----updates
`----wu-ftpd-2.4
| `----doc
| | `----examples
| `----src
| | `----config
| | `----makefiles
| `----support
| | `----makefiles
| | `----man
| `----util
脚本如下:
#!/bin/sh
# dtree: Usage: dtree [any directory]
dir=${1:-.}
(cd $dir; pwd)
find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"

如何实现取出文件中特定的列内容
代码:

我们经常会遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通过“:”分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段。
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段

在vim中实现批量加密
代码:

密码中还是不能带空格,不管了,能加密就好,先这么用着。

============================================================
#!/bin/bash
# Encrypt file with vim

if (test $# -lt 2) then
    echo Usage: decrypt password filename
else
    vim -e -s -c ":set key=$1" -c ':wq' $2
    echo "$2 encrypted."
fi
============================================================
[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done
test2.txt encrypted.
test4.txt encrypted.
test9.txt encrypted.
kick.txt encrypted.
    echo "$2 encrypted."
fi
[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done
test2.txt encrypted.
test4.txt encrypted.
test9.txt encrypted.
kick.txt encrypted.
too_old.txt encrypted.
too_old_again.txt encrypted.
bg5.txt encrypted.
[weeder@SMTH weeder]$

$@等特定shell变量的含义
代码:

在shell脚本的实际编写中,有一些特殊的变量十分有用:
$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的进程ID号

$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数

$- 显示shell使用的当前选项,与set命令功能相同

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

如何使程序的执行结果同时定向到屏幕和文件
代码:

program_name |tee logfile
这样程序执行期间的显示都记录到logfile同时显示到标准输出(屏幕)。

如何用sendmail给系统所有用户送信
代码:

首先在aliases文件里面建立一个alias:
alluser: :include:/etc/mail/allusers
并执行newaliases使之生效,然后在/etc/mail/allusers里面列出所有用户,可以使用下面的命令:
awk -F: '$3 > 100 { print $1 }' /etc/passwd > /etc/mail/allusers

如何查找某条命令的相关库文件
代码:

在制作自己的发行版时经常需要判断某条命令需要哪些库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行。
在Linux环境下通过ldd命令即可实现,在控制台执行:
ldd /bin/ls
即可得到/bin/ls命令的相关库文件列表。

如何使用host命令获得更多信息
代码:

Host能够用来查询域名,然而它可以得到更多的信息。host -t mx linux.com可以查询出Linux.com的MX记录,以及处理Mail的Host的名字。Host -l linux.com会返回所有注册在linux.com下的域名。host -a linux.com则会显示这个主机的所有域名信息。

如何停止终端多个进程
代码:

以下是脚本:
echo "系统当前用户"
echo "---------------"
who | awk '{print $2}'
echo "---------------"
echo "输入要杀死终端的终端号:"
read $TTY
kill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'`

- 作者: chenbin 2004年08月13日, 星期五 16:26  回复(0) |  引用(0) 加入博采

整合Apache+Tomcat
Tomcat是Sun和Apache合作, 做出来的JSP Server, 支持Servlet 和JSP.Tomcat本身可以做为Web Server, 当处理静态页面时,Tomcat不如Apache迅速,不象Apache一样可配置,强壮. Apache做为最流行的Web服务器功能强大,高效,但并不支持JSP及servlet,所以通常的做法是把它们整合起来,让Apache处理静态页面,而把动态页面的请求交给Tomcat处理,发挥各自的优势. 通过在Apache中加载整合模块和进行设置,Apache就能够根据URL,把不属于自己的请求转给Tomcat.
要让Apache和Tomcat联合工作,还必需有一个连接器把它们联系起来.Connector对于性能、配置的方便性有很重要的影响,目前大致上有JK1.x,JK2,mod_webapp三种connector可以使用.JK使用比较广泛.JK2是JK1.x的改进,比较新。这三种Connector的配置方法大相径庭,在参考别人的整合方法时一定要注意.
另外,Tomcat是用Java写的,所以你的系统必须有JDK或JRE.
我的OS是Solaris9,用到的版本分别是Apache 2.0.47 ; Tomcat 5.0.27 ; Jk2 2.0.4; J2sdk 1.4.2_05
现在开始:
好了,先去下载要用到了软件,它们都是for free的.
Apache ,Tomcat ,Jk2在Apache的官方网站上都可以下的到.
http://www.apache.org
JDK 在Sun的网站上.
http://www.sun.com
以下是我下载到的: httpd-2.0.47.tar.gz
jakarta-tomcat-5.0.27.tar.gz
jakarta-tomcat-connectors-jk2-src-current.tar.gz
j2sdk-1_4_2_05-solaris-sparc.tar.Z
(32bit的, 先安装这 个再安装下面64bit的)
j2sdk-1_4_2_05-solaris-sparcv9.tar.Z(最后两个是Solaris的Package,对于其他的系统下可用,不过可以下载相应的版本.)
安装Apache
对于Apache的安装,有很多帖子都介绍过, 安装时注意一点:一定要有 --enable-so 加载so模块,这是整合要用到的.
gzip –d httpd-2.0.47.tar.gz
tar xvf httpd-2.0.47.tar
cd httpd-2.0.47
./configure – with-layout=Apache2 -prefix=/path to install directory -enable-so
make
make install
好了,Apache的安装完成了.我的安装目录是/usr/local/apahce2.修改apache的http.conf
ServerName name OfYourServer
Group nogroup
进入/usr/local/apache2/bin 执行 ./apachectl start 启动apache (./apachectl stop 停止)
如果成功,通过浏览器就可以看到Apche的默认主页了 http://ServerIp
(httpd –l 可以列出已经加载的模块)
安装JDK
Java是SUN开发的,所以它在自家的OS上预装了java的运行环境.
java -version
可以看到java的版本号.Soaris9是1.4.1_01a
uncompress j2sdk-1_4_2_05-solaris-sparc.tar.Z
tar xvf j2sdk-1_4_2_05-solaris-sparc.tar
解压后得到几个SUNW开头的文件,把它们放到一个目录下
先要将以前的java包删除!
pkgrm SUNWj3dmo SUNWj3man SUNWj3dev SUNWj3rt
pkgrm SUNWlj3dv SUNWlj3rt
(如果有的话,pkginfo | grep SUNWj3 查看)
添加新包, pkgadd –d ./ (在刚才放解压的几个SUNW目录)
再安装64bit的包, 同样
uncompress j2sdk-1_4_2_05-solaris-sparcv9.tar.Z
tar xvf j2sdk-1_4_2_05-solaris-sparcv9.tar
pkgadd –d ./
好了,安装完了. java –version ,看版本号变了!
详细的说明,参考SUN网站上的文档!
安装Tomcat
在安装Tomcat之前,要设置两个环境变量:
JAVA_HOME =/usr/j2se
CLASSPATH =/usr/j2se/lib:/usr/j2se/jre/lib
(这是针对Solaris9的,Solaris8 /usr/java1.2; Solaris7 /usr/java1.1)
(其他的系统下,是你安装JDK的目录)
export JAVA_HOME CLASSPATH
有了,这两个变量,Tomcat才能安装.
jakarta-tomcat-5.0.27.tar.gz 是个二进制文件解压后解可用.
我把它解压到了,/usr/local/ src/jakarta-tomcat-5.0.27 建一个链接
ln –s /usr/local/ src/jakarta-tomcat-5.0.27 /usr/local/tomcat
这样以后升级就方便了,刚才的apache也应该这么做.
设置相应的变量:
CATALINA_HOME=/usr/local/tomcat
CATALINA_BASE=/usr/local/tomcat
export CATALINA_HOME CATALINA_BASE
进入/usr/local/tomcat/bin
./startup.sh 启动tomcat
通过浏览器 http://SeverIP:8080 看到了一只猫!(5.0才有吧,4.X没看到)
port 8080 是Tomcat的默认端口
安装JK2
如果以上安装顺利的话,继续安装JK2吧
先解压到/usr/local/src下得到了, jakarta-tomcat-connectors-jk2-2.0.4-src
进入目录, cd jk/native2
./buildconf.sh (我没成功,跳过了)
./configure&--with-apxs2=/usr/local/apache2/bin/apxs&
make
make install (如果不成功,把mod_jk2.so&拷贝到Apache得modules下)
cp&jk/build/jk2/apache2/mod_jk2.so& /usr/local/apache2/modules
还有一个jkjni.so&,说是用来启动Apache 时自动启动Tomcat的,如果就也拷贝吧.我没有看到!
cp&jk/build/jk2/apache2/jkjni.so&/usr/local/apache2/modules
整合
步入正题了,整合涉及到了4个配置文件
Apache 的 httpd.conf 和 workers2.properties (创建)
Tomcat 的 server.xml 和 jk2.properties (不过这两个文件,我没改过也成功了)
&httpd.conf
在Apache中添加mod_jk2.so模块:
LoadModule&jk2_module&modules/mod_jk2.so

workers2.properties:
这是我的workers2.properties
#&Example&socket&channel,&override&port&and&host
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
#&define&the&worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
#&Uri&mapping
[uri:/jsp-examples/*]
worker=ajp13:localhost:8009
好了,重启Apache和Tomcat
http://ServerIp/jsp-examples 如果看到的效果和 http://ServerIp:8080/jsp-examples 一样就说明整合成功.


- 作者: chenbin 2004年08月2日, 星期一 17:32  回复(3) |  引用(0) 加入博采

Windows组策略应用全攻略
一、什么是组策略
  (一)组策略有什么用?

  说到组策略,就不得不提注册表。注册表是Windows系统中保存系统、应用软件配置的数据库,随着Windows功能的越来越丰富,注册表里的配置项目也越来越多。很多配置都是 可以自定义设置的,但这些配置发布在注册表的各个角落,如果是手工配置,可想是多么困难和烦杂。而组策略则将系统重要的配置功能汇集成各种配置模块,供管理人员直接使用,从而达到方便管理计算机的目的。

  简单点说,组策略就是修改注册表中的配置。当然,组策略使用自己更完善的管理组织方法,可以对各种对象中的设置进行管理和配置,远比手工修改注册表方便、灵活,功能也更加强大。

  (二)组策略的版本

  大部分Windows 9X/NT用户可能听过“系统策略”的概念,而我们现在大部分听到的则是“组策略”这个名字。其实组策略是系统策略的更高级扩展,它是由Windows 9X/NT的“系统策略”发展而来的,具有更多的管理模板和更灵活的设置对象及更多的功能,目前主要应用于Windows 2000/XP/2003系统。

  早期系统策略的运行机制是通过策略管理模板,定义特定的.POL(通常是Config.pol)文件。当用户登录的时候,它会重写注册表中的设置值。当然,系统策略编辑器也支持对当前注册表的修改,另外也支持连接网络计算机并对其注册表进行设置。而组策略及其工具,则是对当前注册表进行直接修改。显然,Windows 2000/XP/2003系统的网络功能是其最大的特色之处,其网络功能自然是不可少的,因此组策略工具还可以打开网络上的计算机进行配置,甚至可以打开某个Active Directory 对象(即站点、域或组织单位)并对它进行设置。这是以前“系统策略编辑器”工具无法做到的。

  无论是系统策略还是组策略,它们的基本原理都是修改注册表中相应的配置项目,从而达到配置计算机的目的,只是它们的一些运行机制发生了变化和扩展而已。

  二、组策略中的管理模板

  在Windows 2000/XP/2003目录中包含了几个 .adm 文件。这些文件是文本文件,称为“管理模板”,它们为组策略管理模板项目提供策略信息。

  在Windows 9X系统中,默认的admin.adm管理模板即保存在策略编辑器同一个文件夹中。而在Windows 2000/XP/2003的系统文件夹的inf文件夹中,包含了默认安装下的4个模板文件,分别为:

  1)System.adm:默认情况下安装在“组策略”中,用于系统设置。
  2)Inetres.adm:默认情况下安装在“组策略”中;用于Internet Explorer策略设置。
  3)Wmplayer.adm:用于Windows Media Player 设置。
  4)Conf.adm:用于NetMeeting 设置。

  在Windows 2000/XP/2003的组策略控制台中,可以多次添加“策略模板”,而在Windows 9X下,则只允许当前打开一个策略模板。下面介绍使用策略模板的方法。首先在Windows 2000/XP/2003组策略控制台中使用如下:
首先运行“组策略”程序,然后选择“计算机配置”或者“用户配置”下的“管理模板”,按下鼠标右键,在弹出的菜单中选择“添加/删除模板”.

然后单击“添加”按钮,在弹出的对话框中选择相应的.adm文件。单击“打开”按钮,则在系统策略编辑器中打开选定的脚本文件,并等待用户执行。

  返回到“组策略”编辑器主界面后,依次打开目录“本地计算机策略→用户配置→管理模板”,再点击相应的目录树,就会看到我们新添加的管理模板所产生的配置项目了(为了便于本文后面的实例大家能一起动手操作,建议添加除默认模板文件的其它模板文件)。

  再来看Windows 9X下的组策略编辑器。首先在组策略编辑器中的“文件”菜单中选择“关闭”,以便将当前脚本关闭,然后再在“选项”菜单中选择“模板”

然后单击“打开模板”按钮,在弹出的对话框中选择相应的.adm文件并单击“打开”按钮,则在编辑器中打开选定的脚本文件并等待用户执行。

  三、运行组策略

  (一)Windows 9X策略编辑器

  按操作系统的不同,策略编辑工具分为两种,一种为Windows 2000/XP/2003组策略管理控制台,它在系统安装时已经默认安装上了;另外一种就是Windows 9X的系统策略编辑器,它在系统安装时并不被安装,程序文件在Windows安装盘上的 ools eskit etadminpoledit目录下,它包括Poledit.exe、Poledit.inf、Windows.adm等文件。

  如果是Windows 9X系统通过下面的方法,则可以进行正规的安装过程。

  1.在控制面板中,双击“添加/删除程序”图标,单击“安装Windows”标签,然后单击“从磁盘安装”选项。
  2.在从磁盘安装对话框中,单击“浏览”按钮并指定Windows 9X安装光盘的tools eskit etadminpoledit目录。
  3.单击“确认”按钮,然后再次单击对话框中的“确认”按钮。
  4.在从磁盘安装对话框中,选择“系统策略编辑器”和“组策略”复选框,然后单击“安装”按钮。

  安装完成后,单击“运行”命令项,输入poledit,然后单击“确认”按钮,管理员可以以两种不同的方式使用系统策略编辑器:注册表方式和策略文件方式。

 1.以注册表方式使用系统策略编辑器。在系统策略编辑器中的文件菜单中,单击打开注册表编辑器,然后双击相应的本地用户或本地计算机图标。这取决于要编辑注册表中的哪个部分。在使用注册表方式时,可以直接编辑本地或远程计算机的注册表。这样,所做的改变将立即反映出来。在做出修改之后,必须关机并重新启动计算机以使所做修改生效。

  2.以策略文件方式使用系统策略编辑器。在系统策略编辑器中的文件菜单中,单击新建或打开来打开一个策略文件。在使用策略文件方式时,可以创建和修改用于其它计算机的系统策略文件(POL),在这种方式下,注册表被间接地修改。这项改变将在用户登录时策略文件被下载后反映出来。当以策略文件方式编辑设置值时,单击一个注册表选项,可以看到三种可能状态之一:选中、清除、变灰。每当选择一个选项时,将会循环显示下一个可能的状态,这与选择一个标准的复选框不同。标准的复选框只有选中或清除两个选项。

  如果一个设置值需要附加信息,那么缺省用户属性对话框的底部将出现一个编辑控制。通常,如果选中了一个策略,而又不想强制使用它,应当清除该复选框来取消该策略。

  (二)Windows 2000/XP/2003组策略控制台

  如果是Windows 2000/XP/2003系统,那么系统默认已经安装了组策略程序,在“开始”菜单中,单击“运行”命令项,输入gpedit.msc并确定,即可运行程序

使用上面的方法,打开的组策略对象就是当前的计算机,而如果需要配置其他的计算机组策略对象的话,则需要将组策略作为独立的控制台管理程序来打开,具体步骤如下:

  1)打开 Microsoft 管理控制台(可在“开始”菜单的“运行”对话框中直接输入MMC并回车,运行控制台程序)。
  2)在“文件”菜单上,单击“添加/删除管理单元”。
  3)在“独立”选项卡上,单击“添加”。
  4)在“可用的独立管理单元”对话框中,单击“组策略”,然后单击“添加”。
  5)在“选择组策略对象”对话框中,单击“本地计算机”编辑本地计算机对象,或通过单击“浏览”查找所需的组策略对象。
  6)单击“完成”,单击“关闭”,然后单击“确定”。组策略管理单元即打开要编辑的组策略对象。

  对于不包含域的计算机系统来说,在上面第5步的界面中,只有“计算机”标签,而没有其他标签项目。

  通过上面的方法,我们就可以使用Windows 2000/XP/2003组策略系统强大的网络配置功能,让管理员的工作更轻松和高效。

  在上面我们介绍了Windows 9X下的策略编辑器配置项目有“选中、清除、变灰”三种状态,Windows 2000/XP/2003组策略管理控制台同样也有三种状态,只不过名字变了。它们分别是:已启用、未配置、已禁用。

  四、“桌面”设置

  Windows的桌面就像我们的办公桌一样,需要经常进行整理和清洁,而组策略就如同我们的贴身秘书,让桌面管理工作变得易如反掌。下面就让我们来看看几个实用的配置实例:

  位置:“组策略控制台→用户配置→管理模板→桌面”

  1.隐藏桌面的系统图标(Windows 2000/XP/2003)

  虽然通过修改注册表的方式可以实现隐藏桌面上的系统图标的功能,但这样比较麻烦,也有一定的风险。而采用组策略配置的方法,可以方便快捷地达到此目的。

  比如要隐藏桌面上的“网上邻居”和“Internet Explorer”图标,只要在右侧窗格中将“隐藏桌面上‘网上邻居’图标”和“隐藏桌面上的Internet Explorer图标”两个策略选项启用即可;如果隐藏桌面上的所有图标,只要将“隐藏和禁用桌面上的所有项目”启用即可;当启用了“删除桌面上的‘我的文档’图标”和“删除桌面上的‘我的电脑’图标”两个选项以后,“我的电脑”和“我的文档”图标将从你的电脑桌面上消失;同样如果要让“回收站”图标消失,只须将“从桌面删除回收站”策略项启用即可。

2.退出时不保存桌面设置(Windows 2000/XP/2003)

  此策略可以防止用户保存对桌面的某些更改。如果你启用这个策略,用户仍然可以对桌面做更改,但有些更改,如图标的位置、任务栏的位置及大小,在用户注销后都无法保存,不过任务栏上的快捷方式总可以被保存。

  在右侧窗格中将“退出时不保存设置”这个策略选项启用即可。

  3.屏蔽“清理桌面向导”功能(Windows XP/2003)

  “清理桌面向导”会每隔 60 天自动在用户的电脑上运行,以清除那些用户不经常使用或者从不使用的桌面图标。如果启用此策略设置,则可以屏蔽“清理桌面向导”,如果你禁用或不配置此设置,“清理桌面向导”会按照默认设置每隔60天运行一次。

  打开右侧窗格中的“删除清理桌面向导”,根据需要设置策略选项即可。

  4.启用/禁用“活动桌面”(Windows 2000/XP/2003)

  “活动桌面”是Windows 98(及以后版本)或安装了IE 4.0的系统中自带的高级功能,最大的特点是可以设置各种图片格式的墙纸,甚至可以将网页作为墙纸显示。但出于对安全和性能的考虑,有时候我们需要禁用这一功能(并且禁止用户启用它),通过策略设置可以轻松达到这一要求。具体操作方法:打开右侧窗格中的“禁用活动桌面”并启用此策略。

  提示:如果同时启用“启用 Active Desktop”设置和“禁用 Active Desktop”设置,则“禁用 Active Desktop”设置会被忽略。如果 “禁用 Active Desktop 和 Web 视图”设置(在“用户配置→管理模板→Windows组件→Windows资源管理器”中)被启用,Active Desktop 就会被禁用,并且这两个策略都会被忽略。

  以上介绍了几个关于桌面的组策略配置项目,在“组策略控制台→用户配置→管理模板→桌面”下还有其他若干组策略配置项目,读者可根据需要进行配置,这里不再赘述。

  五、个性化“任务栏”和“开始”菜单

 显示了“任务栏”和“开始”菜单的有关组策略配置项目。下面我们来看具体的实例:
位置:“组策略控制台→用户配置→管理模板→任务栏和开始菜单”

  1.给“开始”菜单减肥(Windows 2000/XP/2003)

  如果觉得Windows的“开始”菜单太臃肿的话,可以将不需要的菜单项从“开始”菜单中删除。在组策略右侧窗格中,提供了“从开始菜单删除用户文件夹”、“删除到‘Windows Update’的访问和链接”、“从开始菜单删除公用程序组”、“从开始菜单中删除‘我的文档’图标”等多种组策略配置项目。你只要将不需要的菜单项所对应的策略启用即可。

  2.保护好“任务栏”和“开始”菜单(Windows 2000/XP/2003)

  如果你不想随意让他人更改“任务栏”和“开始”菜单的设置,你只要将组策略控制台右侧窗格中的“阻止更改‘任务栏和开始菜单’设置”和“阻止访问任务栏的上下文菜单”两个策略项启用即可。这样,当你用鼠标右键单击任务栏并单击“属性”时,系统会出现一个错误消息,且当鼠标右键单击任务栏及任务栏上的项目时,例如“开始”按钮、时钟和“任务栏”按钮,弹出菜单会隐藏。

3.禁止“注销”和“关机”(Windows 2000/XP/2003)

  当计算机启动以后,如果你不希望这个用户再进行“关机”和“注销”操作,那么可将组策略控制台右侧窗格中的“删除开始菜单上的‘注销’”和“删除和阻止访问‘关机’命令”两个策略启用。

  这个设置会从开始菜单删除“关机”选项,并禁用“Windows 任务管理器”对话框按“Ctrl+Alt+Del”会出现这个对话框中的“关机”选项 。另外需要注意的是,此设置虽然可防止用户用 Windows界面来关机,但无法防止用户用其他第三方工具程序来将 Windows 关闭。

  提示:如果启用了“删除开始菜单上的‘注销’”,则会从“开始菜单选项”删除“显示注销”项目。用户无法将“注销<用户名>”项目还原到开始菜单(只能通过手工修改注册表的方法)。这个设置只影响开始菜单,它不影响 “Windows 任务管理器”对话框上的“注销”项目(因此需要同时启用“删除和阻止访问‘关机’命令”),而且不妨碍用户用其它方法注销。

 4.利用组策略保护个人文档隐私(Windows 2000/XP/2003)

  Windows有个高级智能功能,即可以记录你曾经访问过的文件。虽然这个功能可以方便用户再次打开该文件,但出于安全和性能的考虑(例如不想让人知道自己浏览过哪些网页和打开过哪些文件),有时需要屏蔽此功能。利用组策略,只要在右侧窗格中将“不要保留最近打开文档的记录”和“退出时清除最近打开的文档的记录”两个策略启用即可。

  另外需要注意的是,如果启用此策略设置但不启用“从开始菜单中删除文档菜单”策略设置,“文档”菜单还会出现在“开始”菜单上,但是该菜单为空菜单。如果启用此策略设置,后来又禁用它并将它设置为“未配置”,则启用策略设置之前保存的文档快捷方式会重新出现在“文档”菜单和应用程序的“文件”菜单中。

  六、IE设置手到擒来

  微软的Internet Explorer让我们可以轻松地在互联网上遨游,但要想用好Internet Explorer,则必须将它配置好。在IE浏览器的“Internet选项”窗口中,提供了比较全面的设置选项(例如:“首页”、“临时文件夹”、“安全级别”和“分级审查”等项目),但部分高级功能没有提供,而通过组策略即可轻松实现这些功能。下面来看具体实例:

  位置:“组策略控制台→用户配置→管理模板→Windows 组件→Internet Explorer(需添加inetres.adm模板文件)”

  1.禁用“在新窗口中打开”菜单项(Windows 2000/XP/2003)

  出于对安全的考虑,有时候我们有必要屏蔽IE的一些功能菜单,组策略提供了丰富的设置项目,比如禁用“另存为...”、“文件”、“新建”等。下面以“禁用‘在新窗口中打开’菜单项”为例介绍具体的设置方法。

  打开“组策略控制台→用户配置→管理模板→Windows 组件→Internet Explorer→浏览器菜单”,然后打开“禁用‘在新窗口中打开’菜单项”并设置为“启用”。启用该策略后,用户在某个链接上单击鼠标右键,然后单击“在新窗口中打开”时,该命令将不起作用。该策略可与“‘文件’菜单禁用‘新建’菜单项”一起使用,后者禁止用户通过单击“文件”菜单,指向“新建”,然后单击“窗口”在新窗口中打开浏览器。

  提示:启用该策略后,单击“在新窗口中打开”命令,将无法在新窗口中打开链接,系统会提示用户该命令无效,网页自动打开的窗口也全部被禁止,其实这样也可达到屏蔽弹出广告窗口的效果。

  2.限制IE浏览器的保存功能(Windows 2000/XP/2003)

  在使用IE浏览网页过程中,当遇到好的图片、文章等资源时可以使用“另存为”功能将它保存到本地硬盘中,当多人共用一台计算机时,为了保持硬盘的整洁,需要对浏览器的保存功能进行限制。那么如何才能实现呢?可以这样操作:打开“组策略控制台→用户配置→管理模板→Windows组件→Internet Explorer→浏览器菜单”,然后将右侧窗格中的“‘文件’菜单:禁用‘另存为...’菜单项”、“‘文件’菜单:禁用另存为网页菜单项”、“‘查看’菜单:禁用‘源文件’菜单项”和“禁用上下文菜单”等策略项目全部启用即可。

  如果不希望别人对IE浏览器的设置随意更改,可以将“‘工具’菜单:禁用‘Internet选项...’”策略启用。另外,根据个人的需要,在该窗格中还可以禁用其他项目。

  3.禁用“Internet 选项”控制面板(Windows 2000/XP/2003)

  上面提到了“禁用Internet选项”的功能,使用该功能可以达到阻止别人对IE随便设置的目的。而这种方法无法具体禁用Internet选项中的控制模板项目,因此给具体应用带来麻烦。通过下面的组策略设置方法,则可以实现这一要求:

  打开“组策略控制台→用户配置→管理模板→Windows组件→Internet Explorer→Internet 控制面板”,在右边窗格中我们可以看到“禁用常规页”、“禁用安全页”等组策略项目。下面以“禁用常规页”为例进行说明:打开右边窗格中的“禁用常规页”并设置为“启用”。然后我们再打开Internet选项控制面板,会发现“常规”项目已经没有了,这样一来用户将无法看到和更改主页、缓存、历史记录、网页外观以及辅助功能的设置,因为该策略将删除界面上的“常规”选项卡,所以如果设置了该策略,则无须设置位于 “用户配置→管理模板→Windows 组件→Internet Explorer”中的诸如“禁用更改主页设置”、“禁用更改颜色设置”等策略。

4.禁止修改IE浏览器的主页(Windows 2000/XP/2003)

  如果不希望他人对自己设定的IE浏览器主页进行随意更改的话,可以打开“组策略控制台→用户配置→管理模板→Windows组件→Internet Explorer→工具栏”,然后选择“禁用更改主页设置”组策略并启用即可。另外在这个窗格中,还提供了“更改历史记录设置”、“更改颜色设置”和“更改Internet临时文件设置”等项目的禁用功能。

  启用此策略后,在IE浏览器的“Internet 选项”对话框中,其“常规”选项卡的“主页”区域的设置将变灰。

  提示:如果设置了位于“组策略控制台→用户配置→管理模板→Windows组件→Internet Explorer→Internet Explorer控制面板”中的“禁用常规页”策略,则无须设置该策略,因为“禁用常规页”策略将删除界面上的“常规”选项卡。

  5.自定义IE工具栏(Windows 2000/XP/2003)

  IE工具栏的背景和上面的按钮都是可以自定义的,以前我们大多使用手动修改注册表的方法,不过并不直观,现在我们用“组策略”可以更方便地达到效果,打造属于我们自己的IE。

  打开“组策略控制台→用户配置→Windows设置→Internet Explorer维护→浏览器用户界面”下的“浏览器工具栏按钮自定义”策略配置项目,在这里,可以自定义浏览器工具栏的背景图片,点击“浏览”选择一个BMP的位图文件即可(注意:工具栏背景应该与工具栏大小相同,而亮度应该足以显示黑色文字,否则实际效果并不理想)。

  接下来,我们要在IE的工具栏上添加自己的快捷方式,比如添加“我的QQ”,在这里也可以很轻松地完成。

  点击“添加”,在“工具栏标题”中输人“我的QQ”,在“工具栏操作”中选择QQ程序的路径,最后再选择好“颜色图标”和“灰度图标”的路径(如果你不知道怎么提取这两个图标,可以请EXeScope这个软件来帮忙,在各大站点都可以下载)。设置完成后点“确定”,再次打开IE后就可以看到修改的效果了。

  七、轻松实现Windows高级功能

  1.设置并锁定Windows Media Player外观(Windows 2000/XP/2003)

  Windows Media Player是目前最流行的多媒体播放器之一,如果不希望其他用户随意更改其界面外观的话,利用组策略可以轻松实现。打开“组策略控制台→用户配置→管理模板→Windows 组件→Windows Media Player→用户界面中的设置并锁定外观”启用此策略。

  启用此策略后,将使 Windows Media Player 只以指定的外观模式显示,具体可以使用在“策略”选项卡上的“外观”框中指定的外观。你必须为外观使用完整的文件名例如miniplayer.wmz。如果外观文件在用户的计算机上没有安装,播放器将以Windows Media Player外观打开。

  提示:本策略设置软件版本至少为Windows Media Player v8.00,ADM文件为wmplayer.adm。

  2.禁止Windows Media Player播放时运行屏保(Windows 2000/XP/2003)

  屏幕保护程序可以有效地保护我们的显示器,但是当我们使用播放器观看精彩影片时,经常会出现屏幕保护程序突然运行而中断观看的尴尬局面。现在我们可以通过组策略来解决屏幕保护程序使Windows Media Player播放中断的麻烦问题了。打开“组策略控制台→用户配置→管理模板→Windows组件→Windows Media Player→播放中的允许运行屏幕保护程序”并将它设置为“已禁用”状态。

  3.优化配置Windows Media Player网络缓冲(Windows 2000/XP/2003)

  当我们使用Windows Media Player播放流式媒体时,播放器会在播放前对流式媒体进行缓冲处理,以便可以流畅地进行播放。在实际应用中,根据网络带宽和服务器的连接速度,缓存的时间长短并不一样,但Windows Media Player却是在使用同一设置,这无疑与实际网络情况不匹配,因此我们可以根据具体的网络带宽情况自己优化配置网络缓冲。打开“组策略控制台→用户配置→管理模板→Windows组件→Windows Media Player→网络中的配置网络缓冲”并设置为启用状态,在出现的缓冲时间(秒数)配置选项中,根据网络的带宽情况进行自定义(最多 60 秒)。

  提示:如果此策略已启用,那么Windows Media Player“性能”选项卡上的缓存选项将不能再配置。

4.屏蔽使用所有 Windows Update 功能的访问(Windows 2000/XP/2003)

  Windows Update可以自动连接Microsoft网站并下载更新内容,这对大部分用户来说是比较实用的,但对于不需要更新或者带宽紧张的电脑用户来说,此功能就显得多余了,而且经常传闻Windows Update会将计算机用户信息“秘密”发往Microsoft,因此也可以屏蔽这一“智能”高级功能。打开“组策略控制台→用户配置→管理模板→Windows 组件→Windows Update”中的“删除使用所有 Windows Update 功能的访问”组策略并启用此策略。

  提示:如果你启用此设置,所有 Windows Update功能(其中包括阻止访问Windows Update网站http//windowsupdate.microsoft.com、开始菜单上的 Windows Update的超链接和Internet资源管理器上的工具菜单)将被删除。Windows自动更新也被禁用,你将不会收到有关更新的通知,也不会接到Windows Update的重要更新。此设置还会阻止设备管理器自动从Windows Update网站下载安装驱动程序的更新。

  5.在Windows XP/2003中实现远程关机(Windows XP/2003)

  在Windows XP/2003中,新增了一条命令行工具“shutdown”,它可以关闭或重新启动本地或远程计算机。利用它,我们不但可以注销用户、关闭或重新启动计算机,还可以实现定时关机、远程关机。该命令的语法格式如下:

shutdown [-i |-l|-s |-r |-a][-f][-m[\ComputerName]][-t xx][-c ″message″][-d[u][p]icon_mad.gifx:yy]

  该命令具体的使用参数和技巧请参考Windows的帮助系统,帮助系统里面有全面的资料。我们现在简单地看一下该命令的一些基本用法:

  1)注销当前用户

  shutdown - l

  该命令只能注销本机用户,对远程计算机不适用。

  2)关闭本地计算机

  shutdown - s

  3)重启本地计算机

  shutdown - r

  4)定时关机

  shutdown - s -t 30

  指定在30秒之后自动关闭计算机。

  5)中止计算机的关闭。有时我们设定了计算机定时关机后,如果出于某种原因又想取消这次关机操作,就可以用shutdown - a来中止。

  在该命令的格式中,有一个参数[-m [\ComputerName],用它可以指定将要关闭或重启的计算机名称,若省略的话则默认为对本机操作。你可以用以下命令来试一下:

  shutdown -s -m \Anyes-solon -t 30

  在30秒内关闭计算机名为Anyes-solon(Anyes-solon为局域网内一台同样装有Windows XP/2003)的电脑。

  该命令执行后,计算机Anyes-solon一点反应都没有,屏幕上却提示“Access is denied (拒绝访问)”。

  出现这种情况是因为Windows XP默认的安全策略中,只有管理员组的用户才有权从远端关闭计算机,而一般情况下我们从局域网内的其他电脑访问该计算机时,则只有guest用户权限,所以当我们执行上述命令时,便会出现“拒绝访问”的情况。

  而我们利用组策略即可赋予guest用户远程关机的权限。打开“组策略控制台→计算机配置→Windows 设置→安全设置→本地策略→用户权利指派中的从远端系统强制关机”,在弹出的对话框中显示目前只有“Administrators”组的成员才有权从远程关机;单击对话框下方的“添加用户或组”按钮,然后在新弹出的对话框中输入“guest”,再单击“确定”按钮。

  通过上述操作后,我们便给计算机Anyes-solon的guest用户授予了远程关机的权限。以后,倘若你要远程关闭计算机Anyes-solon,只要在网络中其他装有Windows XP/2003的计算机中输入以下命令shutdown -s -m \Anyes-solon -t 60即可。

这时,在Anyes-solon计算机的屏幕上将显示一个“系统关机”的对话框,在对话框下方还有一个计时器,显示离关机还有多少时间。在等待关机的时间里,用户还可以执行其他的任务,如关闭程序、打开文件等,但无法关闭该对话框,除非你用shutdown -a命令来中止关机任务。

  八、用组策略提升系统性能

  1.让Windows 的上网速率提升20%(Windows XP/2003)

  默认情况下,Windows网络连接数据包调度程序将系统限制在80%的连接带宽之内,这对带宽较小的网络来说,无疑是笔不小的开支。我们可以通过组策略设置来替代默认值,让我们的上网速率提高20%!

  打开“组策略控制台→计算机配置→管理模板→网络”中的“QoS数据包调度程序”并启用此策略,然后使用下面“带宽限制”框来调整系统可保留的带宽比例,将它设置为0%即可,然后按确定退出,之后我们就可以使用另外20%的带宽了。

  2.关闭缩略图的缓存(Windows XP/2003)

  Windows XP/20003系统具有缩略图视图功能,且为了加快那些被频繁浏览的缩略图显示速度,系统会将这些被显示过的图片进行缓存,以便下次打开时直接读取缓存中的信息,从而达到快速显示的目的。但如果我们不希望系统进行缓冲的话(比如只浏览一次的图片),则可以利用组策略关闭缩略图缓存的功能,这样第一次浏览速度反而会大大加快(因为不进行缓存处理)。

  打开“组策略控制台→用户配置→管理模板→Windows组件→Windows资源管理器”中的“关闭缩略图的缓存”并启用此策略。

  3.屏蔽系统自带的CD刻录功能(Windows XP/2003)

  Windows XP/2003系统自带CD刻录功能,如果你有CD刻录机接在计算机上,Windows 资源管理器允许你制作并修改可重写式CD。但这样无疑会影响系统性能和资源管理器的执行速度,因此我们可以利用组策略来屏蔽此功能(大部分用户都使用专用的CD刻录软件)。

  打开“组策略控制台→用户配置→管理模板→网络→”中的“删除CD刻录功能”并启用此策略。

  4.关闭系统还原功能(Windows XP/2003)

  系统还原是Windows XP/2003中集成的强大功能,它在系统运行的同时,备份那些被更改的文件和数据,如果出现问题,系统还原使用户能够在不丢失个人数据文件的情况下,将计算机还原到以前的状态。默认情况下,系统还原处于打开状态。

  但为这一功能付出的代价也是相当大的,系统性能会明显下降,磁盘空间也会被占用很多。对于配置不高的计算机来说,强烈建议关闭此功能。

  打开“组策略控制台→计算机配置→管理模板→系统→系统还原”中的“关闭系统还原”并启用此策略。启用此设置后即可关闭系统还原功能,并且不能访问“系统还原向导”和“配置界面”。

  5.禁止Windows Messenger自动运行(Windows XP/2003)

  在Windows系统中集成的优秀应用软件越来越多,但这些系统内置的软件都没有卸载选项,引起很多电脑用户的不满。比如Windows XP自带的Windows Messenger,不但卸载不方便而且还随系统一起自动运行。对于不上网的计算机用户或者根本就不用Windows Messenger的用户来说,当然要屏蔽此软件的自动运行功能。

  打开“组策略控制台→计算机配置→管理模板→Windows组件→Windows Messenger”中的“不允许运行Windows Messenger ”并启用此策略。

  提示:这个设置出现在“计算机配置”和“用户配置”文件夹中。如果两个设置都配置,“计算机配置”中的设置比“用户配置”中的设置优先。

  九、用组策略打造系统铜墙铁壁级功能

  1.隐藏“我的电脑”中指定的驱动器(Windows XP/2003)

  此组策略可以从“我的电脑”和“Windows 资源管理器”上删除代表所选硬件驱动器的图标。并且驱动器号代表的所有驱动器不出现在标准的打开对话框上。

  打开“组策略控制台→用户配置→管理模板→Windows组件→Windows资源管理器”中的“隐藏‘我的电脑’中的这些指定的驱动器”并启用此策略,并在下面列表框中选择一个驱动器或几个驱动器。

  提示:这项策略只删除驱动器图标。用户仍可通过使用其它方式继续访问驱动器的内容。同时这项策略不会防止用户使用程序访问这些驱动器或其内容。并且也不会防止用户使用磁盘管理即插即用来查看并更改驱动器特性。

  2.防止从“我的电脑”访问驱动器(Windows 2000/XP/2003)

  此策略让用户无法查看在“我的电脑”或“Windows 资源管理器”中所选驱动器的内容。同时它也禁止使用运行对话框、镜像网络驱动器对话框或Dir命令查看在这些驱动器上的目录。

  打开“组策略控制台→用户配置→管理模板→Windows组件→Windows资源管理器”中的“防止从‘我的电脑’访问驱动器”并启用此策略,并在下面列表框中选择一个驱动器或几个驱动器。

提示:这些代表指定驱动器的图标仍旧会出现在“我的电脑”中,但是如果用户双击图标,会出现一条消息解释设置防止这一操作。同时这些设置不会防止用户使用其它程序访问本地和网络驱动器。并且不防止他们使用磁盘管理即插即用查看和更改驱动器特性。

  3.禁止使用命令提示符(Windows 2000/XP/2003)

  在Windows 2000/XP/2003下,我们可以运行cmd.exe进入命令提示符状态,并可以继续运行一些DOS命令和其他命令行程序。出于对安全的考虑,有些系统应该屏蔽此功能。

  打开“组策略控制台→用户配置→管理模板→系统”中的“阻止访问命令提示符”并启用此策略,并在下面列表框中选择是否“也停用命令提示符脚本处理”,这个设置还决定批处理文件 .cmd和.bat是否可以在计算机上运行。

  如果启用这个设置,在用户试图打开命令窗口时,系统会显示一条消息,解释设置阻止这一操作。

  4.禁止更改显示属性(Windows 2000/XP/2003)

  选择“控制面板”中的“显示”或在Windows桌面的空白处单击右键选择“属性”,可进入“显示设置”对话框,可以对桌面主题、桌面背景、屏保程序、显示设置等各项进行设置,如果你不想让别人随意更改各项设置,可以通过组策略将它隐藏起来。

  打开“组策略控制台→用户配置→管理模板→控制面板→显示”,然后可以看到隐藏桌面选项卡、隐藏主题选项卡、隐藏保护程序选项卡、隐藏设置选项卡等策略配置,可根据需要对这些项目进行配置。比如启用了“隐藏‘桌面’选项卡”策略后,再打开“显示属性”对话框,就看不到“桌面”标签了,这样自然就无法再对桌面属性进行更改了。

  5.禁用注册表编辑器(Windows 2000/XP/2003)

  为了防止他人进入电脑后对注册表文件进行修改,可以在组策略中对注册表编辑器做禁止访问设置。具体操作方法:打开“组策略控制台→用户配置→系统”中的“阻止访问注册表编辑工具”并启用此策略。

  此策略被启用后,用户试图启动注册表编辑器(Regedit.exe 及 Regedt32.exe)的时候,系统会禁止这类操作并弹出警告消息。

  6.彻底禁止访问“控制面板”(Windows 2000/XP/2003)

  如果不希望其他用户访问计算机的“控制面板”,同样可以使用组策略来实现。打开“组策略控制台→用户配置→管理模板→扩展面板”中的“禁止访问控制面板”并启用此策略。

  此策略启用后可以防止“控制面板”程序文件(Control.exe)的启动。他人将无法启动“控制面板”(或运行任何“控制面板”项目)。另外,这个设置将从“开始”菜单中删除“控制面板”。同时这个设置还从“Windows资源管理器”中删除“控制面板”文件夹。

  7.禁止建立新的拨号连接(Windows 2000/XP/2003)

  如果不想让别人在计算机中建立新连接来拨号上网的话,组策略也可以做到。打开“组策略控制台→用户配置→管理模板→网络→网络连接”中的“禁止访问新建连接向导”并启用此策略。

  启用此策略后,在“网络连接”文件夹和“开始菜单”中就不会出现“建立新连接”。

  提示:此设置无法阻止用户使用诸如 Internet Explorer 这样的其它程序来绕过此设置。另外此设置必须重新启动计算机后才能生效。

  8.禁用“添加/删除程序”(Windows 2000/XP/2003)

  “控制面板”中“添加或删除程序”项目允许你安装、卸载、修复并添加和删除 Windows 的功能和组件以及种类很多的 Windows 程序。如果你想阻止其他用户安装或卸载程序,可利用组策略来实现。

  打开“组策略控制台→用户配置→管理模板→控制面板→添加→删除程序”中的“删除‘添加/删除程序’程序”并启用此策略,当我们再打开“控制面板”中“添加/删除程序”模块的时候,会自动弹出警告窗口,而“添加/删除程序”则无法运行。

  此外,在“添加/删除程序”分支中还可以对Windows“添加/删除程序”项中的“添加新程序”、“从CD-ROM或软盘添加程序”、“从Microsoft添加程序”、“从网络添加程序”等项进行隐藏,通过这些策略项目的设置,起到了保护计算机中系统文件及应用程序的作用。

  9.限制使用应用程序(Windows 2000/XP/2003)

  如果你的电脑设置了多个用户,有些程序我们可能不希望其他用户随意运行,也能在组策略中设置。

  打开“组策略控制台→用户配置→管理模板→系统”中的“只运行许可的Windows应用程序”并启用此策略,然后点击下面的“允许的应用程序列表”边的“显示”按钮,弹出一个“显示内容”对话框,在此单击“添加”按钮来添加允许运行的应用程序即可。以后一般用户只能运行“允许的应用程序列表”中的程序。


- 作者: chenbin 2004年08月2日, 星期一 13:10  回复(1) |  引用(0) 加入博采

在Windows server2003下创建软RAID完全手册
一、概述

  大家知道,硬件RAID解决方案速度快、稳定性好,可以有效地提供高水平的硬盘可用性和冗余度,但是居高不下的价格实在令人可畏。不过可庆幸的是,Windows 2003提供了内嵌的软件RAID功能,并且软RAID可以实现RAID-0、RAID-1、RAID-5。软RAID不仅实现上非常方便,而且还大量地节约了宝贵的资金,确实是Windows 2003 Server的一个很实用的新功能。RAID-5 卷是数据和奇偶校验间断分布在三个或更多物理磁盘的容错卷。如果物理磁盘的某一部分失败,我们可以用余下的数据和奇偶校验重新创建磁盘上失败的那一部分上的数据。对于多数活动由读取数据构成的计算机环境中的数据冗余来说,RAID-5 卷是一种很好的解决方案。可使用基于硬件或基于软件的解决方案来创建 RAID-5 卷。通过基于硬件的 RAID,智能磁盘控制器处理组成 RAID-5 卷的磁盘上的冗余信息的创建和重新生成。Windows Server 2003 家族操作系统提供基于软件的 RAID,其中 RAID-5 卷中的磁盘上的信息的创建和重新生成将由“磁盘管理”来处理,两种情况下数据都将跨磁盘阵列中的所有成员进行存储。当然,软RAID的性能和效率是不能与硬RAID相提并论的。下面我们首先从动态磁盘的创建谈起,然后说明在Windows 2003 Server 实现如何实现软RAID,最后讲一下软RAID的管理。

二、创建动态磁盘

  在安装Windows 2003 Server时,硬盘将自动初始化为基本磁盘。我们不能在基本磁盘分区中创建新卷集、条带集或者RAID-5组,而只能在动态磁盘上创建类似的磁盘配置。也就是说,如果想创建RAID-0、RAID-1或RAID-5卷,就必须使用动态磁盘。在Windows 2003 Server安装完成后,可使用升级向导将它们转换为动态磁盘。

  在将一个磁盘从基本磁盘转换为动态磁盘后,磁盘上包含的将是卷,而不再是磁盘分区。其中的每个卷是硬盘驱动器上的一个逻辑部分,还可以为每个卷指定一个驱动器字母或者挂接点。但是要注意的是只能在动态磁盘上创建卷。动态磁盘有以下几个优于基本磁盘的特点:

卷可以扩展到包含非邻接的空间,这些空间可以在任何可用的磁盘上。
对每个磁盘上可以创建的卷的数目没有任何限制。
  Windows 2003将动态磁盘配置信息存储在磁盘上,而不是存储在注册表中或者其他位置。同时,这些信息不能被准确地更新。Windows 2003将这些磁盘配置信息复制到所有其他动态磁盘中。因此,单个磁盘的损坏将不会影响到访问其他磁盘上的数据。

  一个硬盘既可以是基本的磁盘,也可以是动态的磁盘,但不能二者兼是,因为在同一磁盘上不能组合多种存储类型。但是,如果计算机有多个硬盘,就可以将各个硬盘分别配置为基本的或动态的。

  1、从基本磁盘升级到动态磁盘:

  ①依次单击“开始”->“所有程序”->“管理工具”->“计算机管理”选项,显示“计算机管理”窗口。
  ②在左侧控制台中依次展开“存储”->“磁盘管理”选项,以显示计算机中安装的所有磁盘。
  ③右击要设置为动态磁盘的硬盘,并在弹出的快捷菜单中选择“升级到动态磁盘”选项,将显示“升级到动态磁盘”对话框。
  ④选中要升级的磁盘,然后单击“确定”:按钮,将显示“要升级的磁盘”对话框,在这里要求用户对要升级为动态磁盘的硬盘进行确认。这样做的原因很简单,因为这一升级操作是不可逆的。也就是说,基本磁盘可以升级为动态磁盘,但动态磁盘却不能恢复为基本磁盘。
  ⑤单击“升级”按钮,将显示“磁盘管理”提示框,系统再次要求用户对磁盘升级予以确认。当将该磁盘升级为动态磁盘后,Windows98/Me等操作系统将不能再从该磁盘引导启动。
  ⑥单击“是”按钮,将显示“升级磁盘”警告框。在这里提示要升级磁盘上的文件系统将被强制卸下,并要求用户对该操作进一步予以确认。
  ⑦单击“是”按钮,系统将开始磁盘的升级过程。当升级完成后,将显示 “确认”警告框,单击“确定”按钮将重新启动计算机,以完成磁盘的升级过程。

  在升级到动态磁盘时,应该注意以下几个方面的问题:

必须以管理员或管理组成员的身份登录才能完成该过程。如果计算机与网络连接,则网络策略设置也可能阻止我们完成此步骤。
将基本磁盘升级到动态磁盘后,就再也不能将动态卷改回到基本分区。这时惟一的方法就是,必须删除磁盘上的所有动态卷,然后使用“还原为基本磁盘”命令。
在升级磁盘之前,应该关闭在那些磁盘上运行的程序。
为保证升级成功,任何要升级的磁盘都必须至少包含1MB的未分配空间。在磁盘上创建分区或卷时,“磁盘管理”工具将自动保留这个空间,但是带有其他操作系统创建的分区或卷的磁盘上可能就没有这个空间。
扇区大小超过512字节的磁盘,不能从基本磁盘升级为动态磁盘。
一旦升级完成,动态磁盘就不能包含分区或逻辑驱动器,也不能被非Windows 2003的其他操作系统所访问。
  2、将新磁盘设置为动态磁盘

  ①计算机安装新硬盘后,当第一次访问“计算机管理”中的“磁盘管理”工具时,将自动运行“写入签名和升级磁盘向导”窗口。
  ②单击“下一步”按钮,将显示“选择要写入签名的磁盘”页面,在该列表中选择要写入签名的磁盘。需要注意的是,磁盘在安装到系统前必须进行签名。
  ③单击“下一步”按钮,将显示“选择要升级的磁盘”页面,选择要升级为动态磁盘的磁盘。
  ④单击“下一步”按钮,将显示“完成写入签名和升级磁盘向导”页面,在这里要求确认签名并升级的磁盘。如果有任何不妥,可单击“上一步”按钮返回并重新进行设置。
  ⑤单击“完成”按钮,动态磁盘升级过程完成。

  三、实现软RAID

  软RAID也必须在多磁盘系统中才能实现。实现RAID-1最少要拥有两块硬盘,而实现RAID-5则最少要拥有三块硬盘。通常情况下,操作系统所在磁盘采用RAID-1,而数据所在磁盘采用RAID-5。

  1、卷的类型

  ①简单卷

  简单卷由单个物理磁盘上的磁盘空间组成,它可以由磁盘上的单个区域或链接在一起的相同磁盘上的多个区域组成。可以在同一磁盘中扩展简单卷或把简单卷扩展到其他磁盘。如果跨多个磁盘扩展简单卷,则该卷就是跨区卷。

  只能在动态磁盘上创建简单卷。简单卷不能包含分区或逻辑驱动器,也不能由MS-DOS 或Windows 2003以外的其他Windows操作系统访问。如果网络中的计算机还在运行Windows98或更早版本,那么应该创建分区而不是动态卷。

  如果想在创建简单卷后增加它的容量,则可通过磁盘上剩余的未分配空间来扩展这个卷。要扩展一个简单卷,则该卷必须使用Windows 2003中所用的NTFS版本格式化。同时不能扩展基本磁盘上作为以前分区的简单卷。也可将简单卷扩展到同一计算机的其他磁盘的区域中。当将简单卷扩展到一个或多个其他磁盘时,它会变成为一个跨区卷。在扩展跨区卷之后,不删除整个跨区卷便不能将它的任何部分删除。要注意的是跨区卷不能是镜像卷或带区卷。

  ②条带卷

  利用条带卷,可以将两个或者更多磁盘(最多为32块硬盘)的空余空间组成为一个卷。在向条带卷中写入数据时,数据被分割为64KB的块,并均衡地分布在阵列中的所有磁盘上。一个阵列是两个或者多个磁盘的集合。条带卷可以有效地提高磁盘的读取性能,但是它并不提供容错功能,任何一块硬盘的损坏都会导致全部数据的丢失。条带卷类似于RAID-0。

  ③跨越卷

  利用跨越卷,也可以将来自两个或者更多磁盘(最多为32块硬盘)的空余磁盘空间组成为一个卷。与条带卷所不同的是,将数据写入跨越卷时,首先填满第一个磁盘上的空余部分,然后再将数据写入下一个磁盘,依次类推。虽然利用跨越卷可以快速增加卷的空量,但是跨越卷既不能提高对磁盘数据的读取性能,也不提供任何容错功能。当跨越卷中的某个磁盘出现故障时,存储在该磁盘上的所有数据将全部丢失。

  ④镜像卷

  利用镜像卷即RAID-1卷,可以将用户的相同数据同时复制到两个物理磁盘中。如果其中的一个物理磁盘出现故障,虽然该磁盘上的数据将无法使用,但系统能够继续使用尚未损坏而仍继续正常运转的磁盘进行数据的读写操作,从而通过另一磁盘上保留完全冗余的副本,保护磁盘上的数据免受介质故障的影响。由此可见,镜像卷的磁盘空间利用率只有50%(即每组数据有两个成员),所以镜像卷的成本相对较高。要创建一个镜像卷,必须使用另一磁盘上的可用空间。动态磁盘中现有的任何卷(甚至是系统卷和引导卷),都可以使用相同的或不同的控制器镜像到其他磁盘上大小相同或更大的另一个卷。最好使用大小、型号和制造厂家都相同的磁盘作镜像卷,以避免可能产生的兼容性错误。

  镜像卷可以大大地增强读性能,因为容错驱动程序同时从两个磁盘成员中同时读取数据,所以读取数据的速度会有所增加。当然,由于容错驱动程序必须同时向两个成员写数据,所以它的写性能会略有降低。镜像卷可包含任何分区(包括启动分区或系统分区),但是镜像卷中的两个硬盘都必须是Windows 2003动态磁盘。

  ⑤RAID-5卷

  在RAID-5卷中,Windows 2003通过给该卷的每个硬盘分区中添加奇偶校验信息带区来实现容错。如果某个硬盘出现故障,Windows 2003便可以用其余硬盘上的数据和奇偶校验信息重建发生故障的硬盘上的数据。

  由于要计算奇偶校验信息,所以RAID-5卷上的写操作要比镜像卷上的写操作慢一些。但是,RAID-5卷比镜像卷提供更好的读性能。其中的原因很简单,Windows 2003可以从多个磁盘上同时读取数据。与镜像卷相比RAID-5卷的性价比较高,而且RAID-5卷中的硬盘数量越多,冗余数据带区的成本越低。但是RAID-5卷也有一些限制。第一,RAID-5卷至少需要3个硬盘才能实现,但最多也不能超过32个硬盘;第二,RAID-5卷不能包含根分区或系统分区;RAID-1卷与RAID-5卷的区别如下表1所示:

  2、实现软RAID

  ①在“磁盘管理”中,右击要设置软RAID的硬盘,并在快捷菜单中选择“创建卷”选项,将显示“创建卷向导”窗口。
  ②单击“下一步”按钮,将显示“选择卷类型”页面,在这里选择要创建的卷类型。通常情况下,为了保障数据的安全,应当选择采用RAID-1或RAID-5卷。
  ③单击“下一步”按钮,将显示“选择磁盘”页面。在左侧“所有可用的动态磁盘”列表框中选择要添加的磁盘,并单击“添加”按钮,即可将其添加至该RAID-5卷,并显示在“选定的动态磁盘”列表框中。
  ④动态磁盘添加安毕后,单击“下一步”按钮,将显示“指派驱动器号和路径”页面。选中“指派驱动器号”选项,并为该RAID-5卷指派驱动器号,以便于管理和访问。
  ⑤单击“下一步”按钮,显示“卷区格式化”页面。选择“按下面提供的信息格式化这个卷”选项,并采用默认的NTFS文件系统和分配单位大小。可以为该RAID-5卷指定一个卷标,以用于与其他卷相区别。
  ⑥单击“下一步”按钮,将显示“完成创建卷向导”页面,此时卷的创建完成。
  ⑦单击“完成”按钮,系统将自动格式化新创建的卷。至此,RAID-5卷已创建完成。

  四、RAID卷的管理

  1、添加镜像卷

  对于已有的动态磁盘,可以简单地通过添加镜像卷的方式来提高数据的安全性。

  在“磁盘管理”中,右击要添加镜像磁盘的动态磁盘,并在快捷菜单中选择“添加镜像”选项,此时将显示“添加镜像”对话框。在磁盘列表中选择要设置为镜像的动态磁盘,然后单击“添加镜像”按钮,至此镜像添加完成,需要注意的是,添加为镜像的磁盘空间必须大于或等于现存卷。

  2、测试镜像系统或启动卷

  关闭计算机,然后断开或关闭某个磁盘以模拟磁盘故障,使用剩余镜像来重新启动计算机。验证 Windows 可正确启动后,请关闭计算机然后重新连接磁盘,重新启动计算机。启动菜单出现时,选择仍保持连接状态的磁盘上的镜像。打开计算机管理(本地),在控制台树中单击“磁盘管理”,右键单击具有任一标有“失败的重复”的卷的磁盘,然后单击“重新激活磁盘。

  3、重新激活 RAID-5 磁盘

  如果 I/O 错误是暂时的,则可以尝试重新激活磁盘;打开计算机管理(本地),在控制台树中单击”磁盘管理“。右键单击局部出现故障的磁盘,然后单击”重新激活磁盘“,RAID-5 卷的状态应变为”正在重新生成“,然后变为”良好“。

  4、软RAID的恢复

  磁盘冗余的目的就在于当磁盘出现故障时,系统能够保存数据的完整性。虽然在RAID-1和RAID-5中某个磁盘成员的失败不会导致丢失数据,其他成员仍然可以继续运转,但是如果失败不能得到及时恢复,那么磁盘卷将不再拥有冗余的特性。因此,必须及时恢复失败的RAID-1和RAID-5。

  1)修复镜像卷和RAID-5卷

  在”磁盘管理“中,失败卷的状态将显示为”失败的冗余“,磁盘之一将显示为”脱机“、”丢失“或”联机(错误)“。可以通过下述操作来恢复镜像卷:

  ①确保该磁盘已连接到了计算机,并且已经加电。
  ②在”磁盘管理“中,右击标识为”脱机“、”丢失“或”联机(错误)“的磁盘,然后在快捷菜单中单击”重新激活磁盘“选项。此时该磁盘的状态应当回到”良好“,同时镜像卷应该自动重新生成。

  如果磁盘被严重破坏或者不可能修复,在弹出的快捷菜单中将只能看到”删除“命令,此时Windows 2003将无法再修复该镜像卷。另外,如果磁盘连续显示”联机(错误)“,则有可能表明该磁盘很快就要发生故障了,应当尽可能快地替换该磁盘。

  2)替换磁盘和创建新的镜像卷

  如果经修复仍未能重新激活镜像磁盘,或者镜像卷的状态没有恢复到”良好“状态,就必须替换失败磁盘,并创建新的镜像卷。

  ①在失败的卷上右击鼠标,并选择”删除镜像“选项,将显示”删除镜像“对话框。
  ②从磁盘列表中选择丢失的磁盘,然后单击”删除镜像“按钮,将显示”磁盘管理“警告框,以提示用户确认。
  ③单击”是“按钮,将删除该镜像卷。然后右击该丢失的磁盘,并在弹出的快捷菜单中选择”删除磁盘“选项,将该磁盘删除。
  ④更换新的磁盘,并将磁盘设置为动态磁盘。
  ⑤创建新的镜像卷。新镜像卷的创建过程请参见前述”添加镜像卷“。

  3)替换磁盘和重新生成RAID-5卷

  ①更换故障磁盘,并将它设置为动态磁盘。
  ②在”磁盘管理“中,右击失败磁盘的RAID-5卷,在弹出的快捷菜单中选择”恢复卷“选项,将显示”修复RAID-5卷“对话框。
  ③选择要在RAID-5卷中替换失败磁盘的磁盘,并单击”确定“按钮。此时RAID-5卷开始自动修复。
  ④右击失败的磁盘,并在弹出的快捷菜单中选择”删除磁盘“选项,并从系统中删除该磁盘。

- 作者: chenbin 2004年07月27日, 星期二 17:18  回复(0) |  引用(0) 加入博采

六大软件伤硬盘
硬盘是计算机中最重要的存储介质,关于硬盘的维护保养,相信每个电脑用户都有所了解。不过,以前的很多文章都是针对拨号时代的单机用户,在宽带逐渐普及、大硬盘不断降价的今天,很多人一打开电脑就会让硬盘满负荷运转:看高清晰的DVDRip影片、进行不间断的BT下载、使用Windows的系统还原功能……不过,你可能并不清楚,这些新软件带来的新的应用模式,会给硬盘带来新的伤害!
  
  新应用模式带来的隐患
  
  1.编码错误的DVDRip
  
  现在网上由DVD转录压缩的DVDRip格式的影片相当受欢迎。这种格式的影片清晰度和DVD相差无几,但下载一部影片只有700MB~1.3GB大小,因此很多用户喜欢将DVDRip格式的影片下载到硬盘上慢慢欣赏。不过,播放这种格式的影片对系统有较高的要求:除了CPU、显卡要求足够强劲以保证播放流畅外,硬盘负荷也非常大——因为播放DVDRip就是一个不断解码解压缩,再输送到显示系统的过程。笔者发现,在遇到有编码错误的DVDRip文件时,Windows会出现磁盘占用率非常高的现象:系统不断想要把编码转换为视频信号,但编码错误的文件索引和相应的信号段是不匹配的——此时,硬盘灯会不断地闪烁,整个系统对用户的操作响应极慢,用户点击菜单但几乎没有反应。如果编码错误较多,系统有时候甚至会死机。很多用户在此时非常不耐烦,直接按下机箱上的RESET键甚至是直接关闭计算机电源,在硬盘磁头没有正常复位的情况下,这种操作相当危险!
  
  提示:Windows XP的用户需要特别注意,当我们在Windows XP中自动预览一些体积较大的ASF、WMV等文件时,虽然没有进行正式播放,但也会出现计算机速度突然变慢、硬盘灯不断闪烁等现象,其罪魁祸首仍然是视频文件错误编码!
  
  2. Bittorrent下载
  
  Bittorrent下载是宽带时代新兴的P2P交换文件模式,各用户之间共享资源,互相当种子和中继站,俗称BT下载。由于每个用户的下载和上传几乎是同时进行,因此下载的速度非常快。不过,它会将下载的数据直接写进硬盘(不像FlashGet等下载工具可以调整缓存,到指定的数据量后才写入硬盘),因此对硬盘的占用率比FTP下载要大得多!
  
  此外,BT下载事先要申请硬盘空间,在下载较大的文件的时候,一般会有2~3分钟时间整个系统优先权全部被申请空间的任务占用,其他任务反应极慢。有些人为了充分利用带宽,还会同时进行几个BT下载任务,此时就非常容易出现由于磁盘占用率过高而导致的死机故障。
  
  因此,除非你的电脑硬件配置相当高(尤其是内存,至少要在256MB以上),否则在BT下载作出改进以前,如果要进行长时间、多任务的下载应用,最好还是采用传统的FTP软件。
  
  3. PQMAGIC转换的危险
  
  PQMAGIC是大名鼎鼎的分区魔术师,能在不破坏数据的情况下自由调整分区大小及格式。不过,PQMAGIC刚刚推出的时候,一般用户的硬盘也就 2GB左右,而现在60~80GB的硬盘已是随处可见,PQMAGIC早就力不从心了:调整带数据的、5GB以上的分区,通常都需要1小时以上!
  
  除了容量因素影响外,PQMAGIC调整硬盘分区时,大量的时间都花在校验数据和检测硬盘上,可以看出,在这种情况下“无损分区”是很难保证的:由于转换的速度很慢,耗时过长,转换调整过程中,很容易因为计算机断电、死机等因素造成数据丢失。这种损失通常是一个或数个分区丢失,或是容量变得异常,严重时甚至会导致整个硬盘的数据无法读取。
  
  4.硬盘保护软件造成的异常
  
  容易造成硬盘异常的,还有硬盘保护软件。比如“还原精灵”,由于很多人不注意在重装系统或是重新分区前将它正常卸载,往往会发生系统无法完全安装等情况。此时再想安装并卸载“还原精灵”,却又提示软件已经安装,无法继续,陷入死循环中。这种故障是由于“还原精灵”接管了INT13中断,在操作系统之前就控制了硬盘的引导,用FDISK/MBR指令也无法解决。本来这只是软件的故障,但很多人经验不足,出了问题会找各种分区工具“试验”,甚至轻率地低级格式化,在这样的折腾之下,硬盘很可能提前夭折!
  
  5.频繁地整理磁盘碎片
  
  磁盘碎片整理和系统还原本来是Windows提供的正常功能,不过如果你频繁地做这些操作,对硬盘是有害无利的。磁盘整理要对硬盘进行底层分析,判断哪些数据可以移动、哪些数据不可以移动,再对文件进行分类排序。其实,对现在的大硬盘而言,文档和邮件占用的空间比例非常小,多数人买大硬盘是用来装电影和音乐的,这些分区根本无需频繁整理——因为播放多媒体文件的效果和磁盘结构根本没有关系,播放速度是由显卡和CPU决定的。
  
  6. Windows XP的自动重启
  
  Windows XP的自动重启功能可以自动关闭无响应的进程,自动退出非法操作的程序,从而减少用户的操作步骤。不过,这个功能也有一个很大的问题:它会在自动重新启动前关闭硬盘电源,在重新启动机器的时候再打开硬盘电源!这样一来,硬盘在不到10秒的时间间隔内,受到电流两次冲击,很可能会发生突然“死亡”的故障。为了节省一些能源设置成让系统自动关闭硬盘,对硬盘来说也是弊大于利的.


- 作者: chenbin 2004年07月27日, 星期二 17:16  回复(0) |  引用(0) 加入博采

Zeus+php+Zend Optimizer for Linux安装指南

本文是Crossday第一篇unix作文,基于linux而写出。zeus是一个著名的web服务器软件,其效能远在apache1/2之上,是整台服务器用户跑论坛的首选,对内存小于1G而流量非常大的用户,换用zeus会比apache多获得一倍的负载能力。
本文提供方法在redhat linux 7.3及以上各版本,PHP 4.3.0及以上版本,Zend Optimizer 2.1.0验证通过,所配置参数为适应每15分钟在线1000人以上的,使用Discuz! 2.0/3.0的中大型论坛所优化

进入一个目录 如
cd /usr/local/src

找一个zeus 4.2 r3 for linux的破解版本下载
wget http://download.discuz.net/zeus_linux.tgz

tar xvzf zeus_linux.tgz
cd Zeus.Web.Server.v4.2r3.Linux.x86/
tar xvzf Zeus_42r3_Linux-glibc2.1.tgz
cd Zeus_42r3_Linux-glibc2.1/

开始安装
./zinstall

按CTRL+C 打入accept

Where should the product be installed? [/usr/local/zeus]: 回车

Installation options:

1. Full install of both admin server & web server
2. Stand-alone install of admin server
3. Clustered install of web server
H. Help

Choose installation option [1]: 回车

Enter the key filename, or leave blank for unlicensed mode: /usr/local/src/Zeus.Web.Server.v4.2r3.Linux.x86/license.key (输入密匙位置)

Please choose a password for the admin server: ****** (输入管理员密码)
Re-enter: ****** (重新输入密码)

Would you like Zeus to start at boot time? Y/N [Y]: (回车)

以上是安装过程 很容易的就装好了 如果有apache在跑 先把他停掉 避免80端口冲突
/usr/local/apache/bin/apachectl stop

若安装中提示libdb.so.2不存在 先进入压缩包的libdb.so.2目录中
rpm -ivh db1-1.85-8.i386.rpm

安装php
cd /usr/local/src
从小日本网站下载php
wget http://cn2.php.net/get/php-4.3.4.tar.gz/from/jp2.php.net/mirror
tar xvzf php-4.3.4.tar.gz
cd php-4.3.4/
./configure --prefix=/usr/local/php --enable-fastcgi --enable-force-cgi-redirect --with-config-file-path=/etc --with-zlib --with-mysql --with-xml
make
make install
cp php.ini-dist /etc/php.ini

安装Zend Optimizer
cd /usr/local/src
wget http://download.discuz.net/ZendOptimizer-2%5B1%5D.1.0b-Linux_glibc21-i386.tar.gz
tar xvzf ZendOptimizer-2%5B1%5D.1.0b-Linux_glibc21-i386.tar.gz
cd ZendOptimizer-2.1.0b-Linux_glibc21-i386/
./install.sh
一阵回车 问Confirm the location of your php.ini file的时候打入/etc
问Are you using Apache web server?的时候选No

设置Zeus
访问 http://your.com:9090 (你的域名地址或IP地址)
用户名 admin 密码:刚才设定的密码

进入Zeus管理控制台,点Create a Virtual Server 把相关的六个选项填好 不多说
提交后出现刚才加入的virtual server,点FastCGI

Enabling Support for FastCGI Programs 选 Enabled
Restricting FastCGI locations 选 Enable FastCGI programs to be located anywhere
Configuring Directories for FastCGI Local Responders 不用写他 因为我们用remote方式连接fastcgi

Configuring FastCGI Remote Responders 中填入以下配置
Directory name : /usr/local/php/bin/php
Location: Machine name: localhost
Port: 8002
Additional methods supported?:None

其他都不用管,点Apply changes

点左边Url Handling下面的Handlers
File Extension : php
Specify the path and filename of the handler, relative to the document root : /usr/local/php/bin/php
点Apply changes

点左边Url Handling下面的Directory Requests
Index Files中加入一个 index.php 和一分隔逗号
Directory Listing选Disabled
点Apply changes

再点上面的 This configuration has been modified. Click here for details or to make it take effect.
出来的页面点Commit

配置php-fastcgi
cd /usr/local/zeus/rc.d
建立一个S05php的文件 内容为


Code: [Copy to clipboard]
#!/bin/sh

# Script to start and stop the persistent PHP runner for FastCGI.
# Please check paths before use.

# FastCGI PHP binary
FPHPBIN=/usr/local/php/bin/php

# Location to place semaphore
SEMFILE=/tmp/php.pid
PHP_FCGI_CHILDREN=200
PHP_FCGI_MAX_REQUESTS=1000
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS

# This is Linux - use /proc to increase the local (ephemeral) port range
#echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range

if [ -z "$ZEUSHOME" ]
then
cd `dirname $0`/..
ZEUSHOME=`pwd`
export ZEUSHOME
fi

case "$1" in
'start')

if [ -e $SEMFILE ]
then
echo FastCGI PHP error: already running.Restart FastCGI PHP now
kill `cat $SEMFILE`
sleep 5
fi

if [ ! -x $FPHPBIN ]
then
echo FastCGI PHP error: please check that $FPHPBIN is executable and exists.
exit 1
fi

echo Starting FastCGI PHP.
$ZEUSHOME/web/bin/fcgirunner --user=99 --group=99 --pidfile=$SEMFILE 8002 $FPHPBIN
;;

'stop')
if [ -e $SEMFILE ]
then
echo Stopping FastCGI PHP.
kill `cat $SEMFILE`
rm $SEMFILE
exit 0
fi
;;
'restart')
if [ -e $SEMFILE ]
then
echo Stopping FastCGI PHP.
kill `cat $SEMFILE`
sleep 5
fi
echo Starting FastCGI PHP.
$ZEUSHOME/web/bin/fcgirunner --user=99 --group=99 --pidfile=$SEMFILE 8002 $FPHPBIN
;;
*)
echo "usage: $0 {start|stop|restart}"
;;

esac
exit 1

注意--user=65534 --group=65534 为php进程运行的用户和组,一般设置为nobody用户和组FreeBSD是65534/65534,Linux是99/99

如不会建文件 可看下面范例
vi S05php
(打一个小写的i)
(把上面的内容复制到剪贴板 然后按SHIFT+INSERT粘贴过去)
(按ESC)
(输入 :wq 然后回车)

改写属性使其可执行
chmod 755 S05php

回到Zeus的9090端口管理界面 把刚才设置的虚拟主机Start

启动Zeus的命令为 /usr/local/zeus/start-zeus
停止Zeus的命令为 /usr/local/zeus/stop-zeus
重启Zeus的命令为 /usr/local/zeus/restart-zeus

编辑/etc/rc.local
加入一行
/usr/local/zeus/start-zeus
使得Zeus在开机时自动运行

如果现在无法访问web,多半是因为没有把apache停掉造成的,注意要将启动时候的apache自启动给去掉 否则zeus无法绑定到80端口进而无法访问 如没有上述问题 安装后仍然无法访问 可能为web服务器没有正确安装 例如第一次安装后中断退出 第二次又以升级方式安装 等等 这样的情况建议先把zeus停掉 然后将其目录rm -fr删除 重新安装一次即可正常 个人以为这是zeus安装脚本设计的不合理所致

结束:zeus实在是太强大了,无以言表,在不需任何外挂模块的情况下实现多线程的高效服务 IP并发限制 来路限制 带宽限制等如此多丰富而实用的功能,确实是unix世界中极为强悍和高效的web服务器软件

S05php脚本为CCF的坛主hunrea所作


- 作者: chenbin 2004年07月27日, 星期二 17:15  回复(0) |  引用(0) 加入博采

AWK:Linux 管理员的智能工具包

AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

AWK 是什么?

最简单地说,AWK 是一种用于处理文本的编程语言工具。AWK 实用工具的语言在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。

尽管操作可能会很复杂,但命令的语法始终是:

其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

了解字段

实用工具将每个输入行分为记录和字段。记录是单行的输入,而每条记录包含若干字段。默认的字段分隔符是空格或制表符,而记录的分隔符是换行。虽然在默认情况下将制表符和空格都看作字段分隔符(多个空格仍然作为一个分隔符),但是可以将分隔符从空格改为任何其它字符。

为了进行演示,请查看以下保存为 emp_names 的员工列表文件:


46012   DULANEY     EVAN        MOBILE   AL
46013   DURHAM      JEFF        MOBILE   AL
46015   STEEN       BILL        MOBILE   AL
46017   FELDMAN     EVAN        MOBILE   AL
46018   SWIM        STEVE       UNKNOWN  AL
46019   BOGUE       ROBERT      PHOENIX  AZ
46021   JUNE        MICAH       PHOENIX  AZ
46022   KANE        SHERYL      UNKNOWN  AR
46024   WOOD        WILLIAM     MUNCIE   IN
46026   FERGUS      SARAH       MUNCIE   IN
46027   BUCK        SARAH       MUNCIE   IN
46029   TUTTLE      BOB         MUNCIE   IN

 


当 AWK 读取输入内容时,整条记录被分配给变量 $0。每个字段以字段分隔符分开,被分配给变量 $1、$2、$3 等等。一行在本质上可以包含无数个字段,通过字段号来访问每个字段。因此,命令


awk '{print $1,$2,$3,$4,$5}' names

 


将会产生的打印输出是


46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
46015 STEEN BILL MOBILE AL
46017 FELDMAN EVAN MOBILE AL
46018 SWIM STEVE UNKNOWN AL
46019 BOGUE ROBERT PHOENIX AZ
46021 JUNE MICAH PHOENIX AZ
46022 KANE SHERYL UNKNOWN AR
46024 WOOD WILLIAM MUNCIE IN
46026 FERGUS SARAH MUNCIE IN
46027 BUCK SARAH MUNCIE IN
46029 TUTTLE BOB MUNCIE IN

 


值得注意的一项重要内容是,AWK 解释由空格分隔的五个字段,但当它打印显示内容时,在每个字段间只有一个空格。利用为每个字段指定了唯一号码的功能,您可以选择只打印特定的字段。例如,只打印每条记录的姓名时,只需选择第二个和第三个字段进行打印:


$ awk '{print $2,$3}' emp_names
DULANEY EVAN
DURHAM JEFF
STEEN BILL
FELDMAN EVAN
SWIM STEVE
BOGUE ROBERT
JUNE MICAH
KANE SHERYL
WOOD WILLIAM
FERGUS SARAH
BUCK SARAH
TUTTLE BOB
$

 


您还可以指定按任何顺序打印字段,而无论它们在记录中是如何存在的。因此,只需要显示姓名字段,并且使其顺序颠倒,先显示名字再显示姓氏:


$ awk '{print $3,$2}' emp_names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
ROBERT BOGUE
MICAH JUNE
SHERYL KANE
WILLIAM WOOD
SARAH FERGUS
SARAH BUCK
BOB TUTTLE
$

 


使用模式

通过包含一个必须匹配的模式,您可以选择只对特定的记录而不是所有的记录进行操作。模式匹配的最简单形式是搜索,其中要匹配的项目被包含在斜线 (/pattern/) 中。例如,只对那些居住在阿拉巴马州的员工执行前面的操作:


$ awk '/AL/ {print $3,$2}' emp_names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
$

 


如果您不指定要打印的字段,则会打印整个匹配的条目:


$ awk '/AL/' emp_names
46012   DULANEY     EVAN     MOBILE     AL
46013   DURHAM      JEFF     MOBILE     AL
46015   STEEN       BILL     MOBILE     AL
46017   FELDMAN     EVAN     MOBILE     AL
46018   SWIM        STEVE    UNKNOWN    AL
$

 


对同一数据集的多个命令可以用分号 (;) 分隔开。例如,在一行中打印姓名,而在另一行中打印城市和州名:


$ awk '/AL/ {print $3,$2 ; print $4,$5}' emp_names
EVAN DULANEY
MOBILE AL
JEFF DURHAM
MOBILE AL
BILL STEEN
MOBILE AL
EVAN FELDMAN
MOBILE AL
STEVE SWIM
UNKNOWN AL
$

 


如果没有使用分号 (print $3,$2,$4,$5),则会在同一行中显示所有内容。另一方面,如果分别给出两个打印语句,则会产生完全不同的结果:


$ awk '/AL/ {print $3,$2} {print $4,$5}' emp_names
EVAN DULANEY
MOBILE AL
JEFF DURHAM
MOBILE AL
BILL STEEN
MOBILE AL
EVAN FELDMAN
MOBILE AL
STEVE SWIM
UNKNOWN AL
PHOENIX AZ
PHOENIX AZ
UNKNOWN AR
MUNCIE IN
MUNCIE IN
MUNCIE IN
MUNCIE IN
$

 


只有在列表中找到 AL 时才会给出字段三和字段二。但是,字段四和字段五是无条件的,始终打印它们。只有第一组花括号中的命令对前面紧邻的命令 (/AL/) 起作用。

结果非常不便于阅读,可以使其稍微更清晰一些。首先,在城市与州之间插入一个空格和逗号。然后,在每两行显示之后放置一个空行:


$ awk '/AL/ {print $3,$2 ; print $4", "$5" "}' emp_names
EVAN DULANEY
MOBILE, AL

JEFF DURHAM
MOBILE, AL

BILL STEEN
MOBILE, AL

EVAN FELDMAN
MOBILE, AL

STEVE SWIM
UNKNOWN, AL
$

 


在第四和第五个字段之间,添加一个逗号和一个空格(在引号之间),在第五个字段后面,打印一个换行符 ( )。在 AWK 打印语句中还可以使用那些可在 echo 命令中使用的所有特殊字符,包括:


(换行)
(制表)
(退格)
f(进纸)
(回车)
因此,要读取全部五个最初由制表符分隔开的字段,并且也利用制表符打印它们,您可以编程如下


$ awk '{print $1" "$2" "$3" "$4" "$5}' emp_names
46012   DULANEY     EVAN     MOBILE    AL
46013   DURHAM      JEFF     MOBILE    AL
46015   STEEN       BILL     MOBILE    AL
46017   FELDMAN     EVAN     MOBILE    AL
46018   SWIM        STEVE    UNKNOWN   AL
46019   BOGUE       ROBERT   PHOENIX   AZ
46021   JUNE        MICAH    PHOENIX   AZ
46022   KANE        SHERYL   UNKNOWN   AR
46024   WOOD        WILLIAM  MUNCIE    IN
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
46029   TUTTLE      BOB      MUNCIE    IN
$

 


通过连续设置多项标准并用管道 (|) 符号将其分隔开,您可以一次搜索多个模式匹配:


$ awk '/AL|IN/' emp_names
46012   DULANEY     EVAN     MOBILE    AL
46013   DURHAM      JEFF     MOBILE    AL
46015   STEEN       BILL     MOBILE    AL
46017   FELDMAN     EVAN     MOBILE    AL
46018   SWIM        STEVE    UNKNOWN   AL
46024   WOOD        WILLIAM  MUNCIE    IN
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
46029   TUTTLE      BOB      MUNCIE    IN
$

 


这样可找到每个阿拉巴马州和印第安那州居民的匹配记录。但是在试图找出居住在亚利桑那州的人时,出现了一个问题:


$ awk '/AR/' emp_names
46019   BOGUE       ROBERT   PHOENIX   AZ
46021   JUNE        MICAH    PHOENIX   AZ
46022   KANE        SHERYL   UNKNOWN   AZ
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
$

 


员工 46026 和 46027 没有住在亚利桑那州;但是他们的名字中包含所搜索的字符序列。切记,当在 AWK 中进行模式匹配时,例如 grep、sed 或者大部分其他 Linux/Unix 命令,将在记录(行)中的任何位置查找匹配,除非指定进行其他操作。为解决这一问题,必须将搜索与特定字段联系起来。通过利用代字号 (?) 以及对特定字段的说明,可以达到这一目的,如下例所示:


$ awk '$5 ? /AR/' emp_names
46019   BOGUE       ROBERT   PHOENIX   AZ
46021   JUNE        MICAH    PHOENIX   AZ
46022   KANE        SHERYL   UNKNOWN   AZ
$

 


代字号(表示匹配)的对应符号是一个前面带有感叹号的代字号 (!?)。这些字符通知程序,如果搜索序列没有出现在指定字段中,则找出与搜索序列相匹配的所有行:


$ awk '$5 !? /AR/' names
46012   DULANEY     EVAN     MOBILE    AL
46013   DURHAM      JEFF     MOBILE    AL
46015   STEEN       BILL     MOBILE    AL
46017   FELDMAN     EVAN     MOBILE    AL
46018   SWIM        STEVE    UNKNOWN   AL
46024   WOOD        WILLIAM  MUNCIE    IN
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
46029   TUTTLE      BOB      MUNCIE    IN
$

 


在这种情况下,将显示第五个字段中没有 AR 的所有行 — 包括两个 Sarah 条目,这两个条目确实包含 AR,但却是在第三个字段而不是第五个字段中。

花括号和字段分隔符

括号字符在 AWK 命令中起着很重要的作用。出现在括号之间的操作指出将要发生什么以及何时发生。当只使用一对括号时:


{print $3,$2}

 


括号间的所有操作同时发生。当使用多于一对的括号时:


{print $3}{print $2}

 


执行第一组命令,在该命令完成后执行第二组命令。注意以下两列清单的区别:


$ awk '{print $3,$2}' names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
ROBERT BOGUE
MICAH JUNE
SHERYL KANE
WILLIAM WOOD
SARAH FERGUS
SARAH BUCK
BOB TUTTLE
$

$ awk '{print $3}{print $2}' names
EVAN
DULANEY
JEFF
DURHAM
BILL
STEEN
EVAN
FELDMAN
STEVE
SWIM
ROBERT
BOGUE
MICAH
JUNE
SHERYL
KANE
WILLIAM
WOOD
SARAH
FERGUS
SARAH
BUCK
BOB
TUTTLE
$

 


要利用多组括号进行重复查找,执行第一组中的命令直到完成为止;然后处理第二组命令。如果有第三组命令,则在第二组命令完成后执行它,以此类推。在所生成的打印输出中,有两个分隔的打印命令,因此先执行第一个命令,随后执行第二个命令,这样导致每个条目显示在两行而不是一行中。

区分两个字段的字段分隔符不一定始终是空格;它可以是任何可识别的字符。为进行演示,假定 emp_names 文件利用冒号而不是制表符来分隔字段:


$ cat emp_names
46012:DULANEY:EVAN:MOBILE:AL
46013:DURHAM:JEFF:MOBILE:AL
46015:STEEN:BILL:MOBILE:AL
46017:FELDMAN:EVAN:MOBILE:AL
46018:SWIM:STEVE:UNKNOWN:AL
46019:BOGUE:ROBERT:PHOENIX:AZ
46021:JUNE:MICAH:PHOENIX:AZ
46022:KANE:SHERYL:UNKNOWN:AR
46024:WOOD:WILLIAM:MUNCIE:IN
46026:FERGUS:SARAH:MUNCIE:IN
46027:BUCK:SARAH:MUNCIE:IN
46029:TUTTLE:BOB:MUNCIE:IN
$

 


如果试图通过指定所需要的第二个字段来打印姓氏


$ awk '{print $2}' emp_names

 


您最后会得到十二个空行。因为文件中没有空格,除了第一个字段之外没有可认别的字段。为解决这一问题,必须通知 AWK 是空格之外的另一个字符作为分隔符,有两种方法可通知 AWK 使用新的字段分隔符:使用命令行参数 -F,或在程序中指定变量 FS。两种方法的效果相同,只有一种例外情况,如下例所示:


$ awk '{FS=":"}{print $2}' emp_names

DURHAM
STEEN
FELDMAN
SWIM
BOGUE
JUNE
KANE
WOOD
FERGUS
BUCK
TUTTLE
$

$ awk -F: '{print $2}' emp_names
DULANEY
DURHAM
STEEN
FELDMAN
SWIM
BOGUE
JUNE
KANE
WOOD
FERGUS
BUCK
TUTTLE
$

 


在第一个命令中,头一条记录返回不正确的空行,而其他结果正确。直到读取第二条记录时,才识别字段分隔符并正确地执行。通过使用 BEGIN 语句可以纠正这一缺点(在后文详述)。-F 的功能非常类似于 BEGIN,能够正确地读取第一条记录并按要求执行。

在本文开始处我曾提到,默认的显示/输出字段分隔符是空格。通过使用输出字段分隔符 (OFS) 变量,可以在程序中更改此特性。例如,要读取文件(由冒号分隔)并以短划线显示,则命令是


$ awk -F":" '{OFS="-"}{print $1,$2,$3,$4,$5}' emp_names
46012-DULANEY-EVAN-MOBILE-AL
46013-DURHAM-JEFF-MOBILE-AL
46015-STEEN-BILL-MOBILE-AL
46017-FELDMAN-EVAN-MOBILE-AL
46018-SWIM-STEVE-UNKNOWN-AL
46019-BOGUE-ROBERT-PHOENIX-AZ
46021-JUNE-MICAH-PHOENIX-AZ
46022-KANE-SHERYL-UNKNOWN-AR
46024-WOOD-WILLIAM-MUNCIE-IN
46026-FERGUS-SARAH-MUNCIE-IN
46027-BUCK-SARAH-MUNCIE-IN
46029-TUTTLE-BOB-MUNCIE-IN
$

 


FS 和 OFS 是(输入)字段分隔符和输出字段分隔符,它们只是一对可以在 AWK 实用工具中使用的变量。例如,要在打印时为每行编号,可以采用以下方式使用 NR 变量:


$ awk -F":" '{print NR,$1,$2,$3}' emp_names
1 46012 DULANEY EVAN
2 46013 DURHAM JEFF
3 46015 STEEN BILL
4 46017 FELDMAN EVAN
5 46018 SWIM STEVE
6 46019 BOGUE ROBERT
7 46021 JUNE MICAH
8 46022 KANE SHERYL
9 46024 WOOD WILLIAM
10 46026 FERGUS SARAH
11 46027 BUCK SARAH
12 46029 TUTTLE BOB
$

 


找出员工号码处于 46012 和 46015 之间的所有行:


$ awk -F":" '/4601[2-5]/' emp_names
46012   DULANEY EVAN  MOBILE AL
46013   DURHAM  JEFF  MOBILE AL
46015   STEEN   BILL  MOBILE AL
$

 


添加文本

可以按照添加控制序列或其他字符的相同方式将文本添加到显示中。例如,要将分隔符从空格改为冒号,则命令是


awk '{print $1":"$2":"$3":"$4":"$5}' emp_names > new_emp_names

 


在这种情况下,字符 (:) 包含在引号 ("/") 中,它被添加到每个字段之间。在引号之间的值可以是任何内容。例如,创建一个关于居住在阿拉巴马州的员工的外观类似数据库的显示:


$ awk '$5 ~ /AL/ {print "NAME: "$2", "$3" CITY-STATE:
  "$4", "$5" "}' emp_names

NAME: DULANEY, EVAN
CITY-STATE: MOBILE, AL

NAME: DURHAM, JEFF
CITY-STATE: MOBILE, AL

NAME: STEEN, BILL
CITY-STATE: MOBILE, AL

NAME: FELDMAN, EVAN
CITY-STATE: MOBILE, AL

NAME: SWIM, STEVE
CITY-STATE: UNKNOWN, AL
$

 


数学操作

AWK 除了提供文本功能,还提供全部范围的算术操作符,包括以下符号:

+ 将数字相加
- 减
* 乘
/ 除
^ 执行指数运算
% 提供模
++ 将变量值加一
+= 将其他操作的结果分配给变量
— 将变量减一
-= 将减法操作的结果分配给变量
*= 分配乘法操作的结果
/= 分配除法操作的结果
%= 分配求模操作的结果

例如,假定您的机器上存在以下的文件,详细地列出硬件商店中的物品:


$ cat inventory
hammers 5       7.99
drills  2      29.99
punches 7       3.59
drifts  2       4.09
bits   55       1.19
saws  123      14.99
nails 800        .19
screws 80        .29
brads 100        .24
$

 


第一项业务定单是通过将第二个字段(数量)的值乘以第三个字段(价格)的值,计算每种物品的库存价值:


$ awk '{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}' inventory
hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77
nails QTY: 800 PRICE: .19 TOTAL: 152
screws QTY: 80 PRICE: .29 TOTAL: 23.2
brads QTY: 100 PRICE: .24 TOTAL: 24
$

 


如果这些行本身并不重要,您只是希望确定商店中有多少件物品,则可以分配一个普通变量,按照每条记录中的物品数量增加:


$ awk '{x=x+$2} {print x}' inventory
5
7
14
16
71
194
994
1074
1174
$

 


根据这一数据,商店中有 1174 件物品。第一次执行时,变量 x 没有值,因此它采用第一行第二个字段的值。第二次执行时,它保留了第一行的值并加上第二行的值,以此类推,直到达到累计的总合。

可以应用相同的过程来确定现有库存的总价值:


$ awk '{x=x+($2*$3)} {print x}' inventory
39.95
99.93
125.06
133.24
198.69
2042.46
2194.46
2217.66
2241.66
$

 


因此,1174 件物品的价值是 $2,241.66。虽然这一过程可以获得总计值,但它的外观很差,需要加工成实际的报表。利用一些附加项,很容易使显示变得更整洁:


$ awk '{x=x+($2*$3)}{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3,"BAL: "x}' inventory
hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95 BAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98 BAL: 99.93
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13 BAL: 125.06
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18 BAL: 133.24
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45 BAL: 198.69
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77 BAL: 2042.46
nails QTY: 800 PRICE: .19 TOTAL: 152 BAL: 2194.46
screws QTY: 80 PRICE: .29 TOTAL: 23.2 BAL: 2217.66
brads QTY: 100 PRICE: .24 TOTAL: 24 BAL: 2241.66
$

 


该过程提供了每条记录的清单,同时将总价值分配给库存值,并保持商店资产的运作平衡。

BEGIN 和 END

使用 BEGIN 和 END 语句可以分别指定在处理实际开始之前或者完成之后进行操作。BEGIN 语句最常用于建立变量或显示标题。另一方面,END 语句可用于在程序结束后继续进行处理。

在前面的示例中,利用以下例程生成了物品的总价值:


awk '{x=x+($2*$3)} {print x}' inventory

 


该例程在运行总计累加时显示了文件中的每一行。没有其他方法可以指定它,而不让在每一行进行打印也导致它始终不打印出来。但是,利用 END 语句可以避免这一问题:


$ awk '{x=x+($2*$3)} END {print "Total Value of Inventory:"x}' inventory
Total Value of Inventory: 2241.66
$

 


定义了变量 x,它对每一行进行处理;但是,在所有处理完成之前不会生成显示。尽管可以作为独立例程使用,它也可以置入到先前的代码列表,添加更多信息并生成更完整的报表:


$ awk '{x=x+($2*$3)} {print $1,"QTY: "$2,"PRICE:
    "$3,"TOTAL: "$2*$3} END {print "Total Value of Inventory: " x}' inventory

hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77
nails QTY: 800 PRICE: .19 TOTAL: 152
screws QTY: 80 PRICE: .29 TOTAL: 23.2
brads QTY: 100 PRICE: .24 TOTAL: 24
Total Value of Inventory: 2241.66
$

 


BEGIN 命令与 END 的工作方式相同,但它建立了那些需要在完成其他工作之前所做的项目。该过程最常见的目的是创建报表的标题。此例程的语法类似于


$ awk 'BEGIN {print "ITEM   QUANTITY   PRICE   TOTAL"}'

 


输入、输出和源文件

AWK 工具可以从文件中读取其输入,正如在此之前所有示例所做的那样,它也可以从其他命令的输出中获取输入。例如:


$ sort emp_names | awk '{print $3,$2}'

 


awk 命令的输入是排序操作的输出。除了 sort,还可以使用任何其他的 Linux 命令 — 例如 grep。该过程允许您在离开所选定字段前对文件执行其他操作。

类似于解释程序,AWK 使用输出改向操作符 > 和 >> 将其输出放入文件中而不是标准输出设备。这些符号的作用类似于它们在解释程序中的对应符号,因此 > 在不存在文件时创建文件,而 >> 追加到现有文件的尾部。请看以下的示例:


$ awk '{print NR, $1 ) > "/tmp/filez" }' emp_names
$ cat /tmp/filez
1 46012
2 46013
3 46015
4 46017
5 46018
6 46019
7 46021
8 46022
9 46024
10 46026
11 46027
12 46029
$

 


检查该语句的语法,您会看到输出改向是在打印语句完成后进行的。必须将文件名包含在引号中,否则它只是一个未初始化的 AWK 变量,而将指令联接起来会在 AWK 中产生错误。(如果不正确地使用改向符号,则 AWK 无法了解该符号意味着“改向”还是一个关系操作符。)

在 AWK 中输出到管道也类似于解释程序中所实现的相同操作。要将打印命令的输出发送到管道中,可以在打印命令后附加管道符号以及命令的名称,如下所示:


$ awk '{ print $2 | "sort" }' emp_names
BOGUE
BUCK
DULANEY
DURHAM
FELDMAN
FERGUS
JUNE
KANE
STEEN
SWIM
TUTTLE
WOOD
$

 


这是输出改向的情况,必须将命令包含在引号中,而管道的名称是被执行命令的名称。

AWK 所使用的命令可以来自两个地方。首先,可以在命令行中指定它们,如示例中所示。其次,它们可以由源文件提供。如果是这种情况,通过 -f 选项将这种情况向 AWK 发出警告。演示如下:


$ cat awklist
{print $3,$2}
{print $4,$5," "}
$

$ awk -f awklist emp_names
EVAN DULANEY
MOBILE AL

JEFF DURHAM
MOBILE AL

BILL STEEN
MOBILE AL

EVAN FELDMAN
MOBILE AL

STEVE SWIM
UNKNOWN AL

ROBERT BOGUE
PHOENIX AZ

MICAH JUNE
PHOENIX AZ

SHERYL KANE
UNKNOWN AR

WILLIAM WOOD
MUNCIE IN

SARAH FERGUS
MUNCIE IN

SARAH BUCK
MUNCIE IN

BOB TUTTLE
MUNCIE IN

$

 


注意,在源文件中的任何地方或者在命令行中调用它时,不使用单引号。单引号只用于区别命令行中的命令与文件名称。

如果简单的输出不能处理您的程序中所需要的复杂信息,则可以尝试由 printf 命令获得的更加复杂的输出,其语法是


printf( format, value, value ...)

 


该语法类似于 C 语言中的 printf 命令,而格式的规格是相同的。通过插入一项定义如何打印数值的规格,可以定义该格式。格式规格包含一个跟有字母的 %。类似于打印命令,printf 不必包含在圆括号中,但是可以认为使用圆括号是一种良好的习惯。

下表列出 printf 命令提供的各种规格。

规格 说明
%c 打印单个 ASCII 字符
%d 打印十进制数
%e 打印数字的科学计数表示
%f 打印浮点表示
%g 打印 %e 或 %f;两种方式都更简短
%o 打印无符号的八进制数
s 打印 ASCII 字符串
%x 打印无符号的十六进制数
%% 打印百分号;不执行转换

可以在 % 与字符之间提供某些附加的格式化参数。这些参数进一步改进数值的打印方式:

参数 说明
- 将字段中的表达式向左对齐
,width 根据需要将字段补齐到指定宽度(前导零使用零将字段补齐) 
.prec 小数点右面数字的最大字符串宽度或最大数量

printf 命令能够控制并将数值从一种格式转换为另一种格式。当需要打印变量的值时,只需提供一种规格,指示 printf 如何打印信息(通常包含在双引号中)即可。必须为每个传递到 printf 的变量包含一个规格参数;如果包含过少的参数,则 printf 不会打印所有的数值。

处理错误

AWK 工具报告所发生错误的方式很令人恼火。一个错误会阻碍任何操作的进行,所提供的错误信息非常含混不清:


awk: syntax error near line 2
awk: bailing out near line 2

 


您可能会花几小时的时间查看第 2 行,试图找出它为什么阻碍程序运行;这就是支持使用源文件的一个有力论据。

切记有两条规则可以帮助您避免出现语法错误:

1. 确保命令位于括号中,而括号位于单引号中。没有使用这些字符之一必然导致程序无法运行。

2. 搜索命令需要位于斜线之间。要找出住在印第安那州的员工,您必须使用“/IN/”而不是“IN”。

结论

尽管 AWK 完全代表另外的含意,但它应该是管理员智能工具包的首字母缩写。连同 SED 一起,AWK 实用工具是 Linux 管理员所拥有的功能最强大和灵活的

工具之一。通过了解其语言的一些特性,您可以开辟出能够简化任务的领域,否则这些任务将会是非常费时和困难的。


- 作者: chenbin 2004年07月26日, 星期一 11:02  回复(1) |  引用(0) 加入博采

AWK:Linux 管理员的智能工具包

AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

AWK 是什么?

最简单地说,AWK 是一种用于处理文本的编程语言工具。AWK 实用工具的语言在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。

尽管操作可能会很复杂,但命令的语法始终是:


awk '{pattern + action}' {filenames}

 


其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

了解字段

实用工具将每个输入行分为记录和字段。记录是单行的输入,而每条记录包含若干字段。默认的字段分隔符是空格或制表符,而记录的分隔符是换行。虽然在默认情况下将制表符和空格都看作字段分隔符(多个空格仍然作为一个分隔符),但是可以将分隔符从空格改为任何其它字符。

为了进行演示,请查看以下保存为 emp_names 的员工列表文件:


46012   DULANEY     EVAN        MOBILE   AL
46013   DURHAM      JEFF        MOBILE   AL
46015   STEEN       BILL        MOBILE   AL
46017   FELDMAN     EVAN        MOBILE   AL
46018   SWIM        STEVE       UNKNOWN  AL
46019   BOGUE       ROBERT      PHOENIX  AZ
46021   JUNE        MICAH       PHOENIX  AZ
46022   KANE        SHERYL      UNKNOWN  AR
46024   WOOD        WILLIAM     MUNCIE   IN
46026   FERGUS      SARAH       MUNCIE   IN
46027   BUCK        SARAH       MUNCIE   IN
46029   TUTTLE      BOB         MUNCIE   IN

 


当 AWK 读取输入内容时,整条记录被分配给变量 $0。每个字段以字段分隔符分开,被分配给变量 $1、$2、$3 等等。一行在本质上可以包含无数个字段,通过字段号来访问每个字段。因此,命令


awk '{print $1,$2,$3,$4,$5}' names

 


将会产生的打印输出是


46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
46015 STEEN BILL MOBILE AL
46017 FELDMAN EVAN MOBILE AL
46018 SWIM STEVE UNKNOWN AL
46019 BOGUE ROBERT PHOENIX AZ
46021 JUNE MICAH PHOENIX AZ
46022 KANE SHERYL UNKNOWN AR
46024 WOOD WILLIAM MUNCIE IN
46026 FERGUS SARAH MUNCIE IN
46027 BUCK SARAH MUNCIE IN
46029 TUTTLE BOB MUNCIE IN

 


值得注意的一项重要内容是,AWK 解释由空格分隔的五个字段,但当它打印显示内容时,在每个字段间只有一个空格。利用为每个字段指定了唯一号码的功能,您可以选择只打印特定的字段。例如,只打印每条记录的姓名时,只需选择第二个和第三个字段进行打印:


$ awk '{print $2,$3}' emp_names
DULANEY EVAN
DURHAM JEFF
STEEN BILL
FELDMAN EVAN
SWIM STEVE
BOGUE ROBERT
JUNE MICAH
KANE SHERYL
WOOD WILLIAM
FERGUS SARAH
BUCK SARAH
TUTTLE BOB
$

 


您还可以指定按任何顺序打印字段,而无论它们在记录中是如何存在的。因此,只需要显示姓名字段,并且使其顺序颠倒,先显示名字再显示姓氏:


$ awk '{print $3,$2}' emp_names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
ROBERT BOGUE
MICAH JUNE
SHERYL KANE
WILLIAM WOOD
SARAH FERGUS
SARAH BUCK
BOB TUTTLE
$

 


使用模式

通过包含一个必须匹配的模式,您可以选择只对特定的记录而不是所有的记录进行操作。模式匹配的最简单形式是搜索,其中要匹配的项目被包含在斜线 (/pattern/) 中。例如,只对那些居住在阿拉巴马州的员工执行前面的操作:


$ awk '/AL/ {print $3,$2}' emp_names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
$

 


如果您不指定要打印的字段,则会打印整个匹配的条目:


$ awk '/AL/' emp_names
46012   DULANEY     EVAN     MOBILE     AL
46013   DURHAM      JEFF     MOBILE     AL
46015   STEEN       BILL     MOBILE     AL
46017   FELDMAN     EVAN     MOBILE     AL
46018   SWIM        STEVE    UNKNOWN    AL
$

 


对同一数据集的多个命令可以用分号 (;) 分隔开。例如,在一行中打印姓名,而在另一行中打印城市和州名:


$ awk '/AL/ {print $3,$2 ; print $4,$5}' emp_names
EVAN DULANEY
MOBILE AL
JEFF DURHAM
MOBILE AL
BILL STEEN
MOBILE AL
EVAN FELDMAN
MOBILE AL
STEVE SWIM
UNKNOWN AL
$

 


如果没有使用分号 (print $3,$2,$4,$5),则会在同一行中显示所有内容。另一方面,如果分别给出两个打印语句,则会产生完全不同的结果:


$ awk '/AL/ {print $3,$2} {print $4,$5}' emp_names
EVAN DULANEY
MOBILE AL
JEFF DURHAM
MOBILE AL
BILL STEEN
MOBILE AL
EVAN FELDMAN
MOBILE AL
STEVE SWIM
UNKNOWN AL
PHOENIX AZ
PHOENIX AZ
UNKNOWN AR
MUNCIE IN
MUNCIE IN
MUNCIE IN
MUNCIE IN
$

 


只有在列表中找到 AL 时才会给出字段三和字段二。但是,字段四和字段五是无条件的,始终打印它们。只有第一组花括号中的命令对前面紧邻的命令 (/AL/) 起作用。

结果非常不便于阅读,可以使其稍微更清晰一些。首先,在城市与州之间插入一个空格和逗号。然后,在每两行显示之后放置一个空行:


$ awk '/AL/ {print $3,$2 ; print $4", "$5" "}' emp_names
EVAN DULANEY
MOBILE, AL

JEFF DURHAM
MOBILE, AL

BILL STEEN
MOBILE, AL

EVAN FELDMAN
MOBILE, AL

STEVE SWIM
UNKNOWN, AL
$

 


在第四和第五个字段之间,添加一个逗号和一个空格(在引号之间),在第五个字段后面,打印一个换行符 ( )。在 AWK 打印语句中还可以使用那些可在 echo 命令中使用的所有特殊字符,包括:


(换行)
(制表)
(退格)
f(进纸)
(回车)
因此,要读取全部五个最初由制表符分隔开的字段,并且也利用制表符打印它们,您可以编程如下


$ awk '{print $1" "$2" "$3" "$4" "$5}' emp_names
46012   DULANEY     EVAN     MOBILE    AL
46013   DURHAM      JEFF     MOBILE    AL
46015   STEEN       BILL     MOBILE    AL
46017   FELDMAN     EVAN     MOBILE    AL
46018   SWIM        STEVE    UNKNOWN   AL
46019   BOGUE       ROBERT   PHOENIX   AZ
46021   JUNE        MICAH    PHOENIX   AZ
46022   KANE        SHERYL   UNKNOWN   AR
46024   WOOD        WILLIAM  MUNCIE    IN
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
46029   TUTTLE      BOB      MUNCIE    IN
$

 


通过连续设置多项标准并用管道 (|) 符号将其分隔开,您可以一次搜索多个模式匹配:


$ awk '/AL|IN/' emp_names
46012   DULANEY     EVAN     MOBILE    AL
46013   DURHAM      JEFF     MOBILE    AL
46015   STEEN       BILL     MOBILE    AL
46017   FELDMAN     EVAN     MOBILE    AL
46018   SWIM        STEVE    UNKNOWN   AL
46024   WOOD        WILLIAM  MUNCIE    IN
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
46029   TUTTLE      BOB      MUNCIE    IN
$

 


这样可找到每个阿拉巴马州和印第安那州居民的匹配记录。但是在试图找出居住在亚利桑那州的人时,出现了一个问题:


$ awk '/AR/' emp_names
46019   BOGUE       ROBERT   PHOENIX   AZ
46021   JUNE        MICAH    PHOENIX   AZ
46022   KANE        SHERYL   UNKNOWN   AZ
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
$

 


员工 46026 和 46027 没有住在亚利桑那州;但是他们的名字中包含所搜索的字符序列。切记,当在 AWK 中进行模式匹配时,例如 grep、sed 或者大部分其他 Linux/Unix 命令,将在记录(行)中的任何位置查找匹配,除非指定进行其他操作。为解决这一问题,必须将搜索与特定字段联系起来。通过利用代字号 (?) 以及对特定字段的说明,可以达到这一目的,如下例所示:


$ awk '$5 ? /AR/' emp_names
46019   BOGUE       ROBERT   PHOENIX   AZ
46021   JUNE        MICAH    PHOENIX   AZ
46022   KANE        SHERYL   UNKNOWN   AZ
$

 


代字号(表示匹配)的对应符号是一个前面带有感叹号的代字号 (!?)。这些字符通知程序,如果搜索序列没有出现在指定字段中,则找出与搜索序列相匹配的所有行:


$ awk '$5 !? /AR/' names
46012   DULANEY     EVAN     MOBILE    AL
46013   DURHAM      JEFF     MOBILE    AL
46015   STEEN       BILL     MOBILE    AL
46017   FELDMAN     EVAN     MOBILE    AL
46018   SWIM        STEVE    UNKNOWN   AL
46024   WOOD        WILLIAM  MUNCIE    IN
46026   FERGUS      SARAH    MUNCIE    IN
46027   BUCK        SARAH    MUNCIE    IN
46029   TUTTLE      BOB      MUNCIE    IN
$

 


在这种情况下,将显示第五个字段中没有 AR 的所有行 — 包括两个 Sarah 条目,这两个条目确实包含 AR,但却是在第三个字段而不是第五个字段中。

花括号和字段分隔符

括号字符在 AWK 命令中起着很重要的作用。出现在括号之间的操作指出将要发生什么以及何时发生。当只使用一对括号时:


{print $3,$2}

 


括号间的所有操作同时发生。当使用多于一对的括号时:


{print $3}{print $2}

 


执行第一组命令,在该命令完成后执行第二组命令。注意以下两列清单的区别:


$ awk '{print $3,$2}' names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
ROBERT BOGUE
MICAH JUNE
SHERYL KANE
WILLIAM WOOD
SARAH FERGUS
SARAH BUCK
BOB TUTTLE
$

$ awk '{print $3}{print $2}' names
EVAN
DULANEY
JEFF
DURHAM
BILL
STEEN
EVAN
FELDMAN
STEVE
SWIM
ROBERT
BOGUE
MICAH
JUNE
SHERYL
KANE
WILLIAM
WOOD
SARAH
FERGUS
SARAH
BUCK
BOB
TUTTLE
$

 


要利用多组括号进行重复查找,执行第一组中的命令直到完成为止;然后处理第二组命令。如果有第三组命令,则在第二组命令完成后执行它,以此类推。在所生成的打印输出中,有两个分隔的打印命令,因此先执行第一个命令,随后执行第二个命令,这样导致每个条目显示在两行而不是一行中。

区分两个字段的字段分隔符不一定始终是空格;它可以是任何可识别的字符。为进行演示,假定 emp_names 文件利用冒号而不是制表符来分隔字段:


$ cat emp_names
46012:DULANEY:EVAN:MOBILE:AL
46013:DURHAM:JEFF:MOBILE:AL
46015:STEEN:BILL:MOBILE:AL
46017:FELDMAN:EVAN:MOBILE:AL
46018:SWIM:STEVE:UNKNOWN:AL
46019:BOGUE:ROBERT:PHOENIX:AZ
46021:JUNE:MICAH:PHOENIX:AZ
46022:KANE:SHERYL:UNKNOWN:AR
46024:WOOD:WILLIAM:MUNCIE:IN
46026:FERGUS:SARAH:MUNCIE:IN
46027:BUCK:SARAH:MUNCIE:IN
46029:TUTTLE:BOB:MUNCIE:IN
$

 


如果试图通过指定所需要的第二个字段来打印姓氏


$ awk '{print $2}' emp_names

 


您最后会得到十二个空行。因为文件中没有空格,除了第一个字段之外没有可认别的字段。为解决这一问题,必须通知 AWK 是空格之外的另一个字符作为分隔符,有两种方法可通知 AWK 使用新的字段分隔符:使用命令行参数 -F,或在程序中指定变量 FS。两种方法的效果相同,只有一种例外情况,如下例所示:


$ awk '{FS=":"}{print $2}' emp_names

DURHAM
STEEN
FELDMAN
SWIM
BOGUE
JUNE
KANE
WOOD
FERGUS
BUCK
TUTTLE
$

$ awk -F: '{print $2}' emp_names
DULANEY
DURHAM
STEEN
FELDMAN
SWIM
BOGUE
JUNE
KANE
WOOD
FERGUS
BUCK
TUTTLE
$

 


在第一个命令中,头一条记录返回不正确的空行,而其他结果正确。直到读取第二条记录时,才识别字段分隔符并正确地执行。通过使用 BEGIN 语句可以纠正这一缺点(在后文详述)。-F 的功能非常类似于 BEGIN,能够正确地读取第一条记录并按要求执行。

在本文开始处我曾提到,默认的显示/输出字段分隔符是空格。通过使用输出字段分隔符 (OFS) 变量,可以在程序中更改此特性。例如,要读取文件(由冒号分隔)并以短划线显示,则命令是


$ awk -F":" '{OFS="-"}{print $1,$2,$3,$4,$5}' emp_names
46012-DULANEY-EVAN-MOBILE-AL
46013-DURHAM-JEFF-MOBILE-AL
46015-STEEN-BILL-MOBILE-AL
46017-FELDMAN-EVAN-MOBILE-AL
46018-SWIM-STEVE-UNKNOWN-AL
46019-BOGUE-ROBERT-PHOENIX-AZ
46021-JUNE-MICAH-PHOENIX-AZ
46022-KANE-SHERYL-UNKNOWN-AR
46024-WOOD-WILLIAM-MUNCIE-IN
46026-FERGUS-SARAH-MUNCIE-IN
46027-BUCK-SARAH-MUNCIE-IN
46029-TUTTLE-BOB-MUNCIE-IN
$

 


FS 和 OFS 是(输入)字段分隔符和输出字段分隔符,它们只是一对可以在 AWK 实用工具中使用的变量。例如,要在打印时为每行编号,可以采用以下方式使用 NR 变量:


$ awk -F":" '{print NR,$1,$2,$3}' emp_names
1 46012 DULANEY EVAN
2 46013 DURHAM JEFF
3 46015 STEEN BILL
4 46017 FELDMAN EVAN
5 46018 SWIM STEVE
6 46019 BOGUE ROBERT
7 46021 JUNE MICAH
8 46022 KANE SHERYL
9 46024 WOOD WILLIAM
10 46026 FERGUS SARAH
11 46027 BUCK SARAH
12 46029 TUTTLE BOB
$

 


找出员工号码处于 46012 和 46015 之间的所有行:


$ awk -F":" '/4601[2-5]/' emp_names
46012   DULANEY EVAN  MOBILE AL
46013   DURHAM  JEFF  MOBILE AL
46015   STEEN   BILL  MOBILE AL
$

 


添加文本

可以按照添加控制序列或其他字符的相同方式将文本添加到显示中。例如,要将分隔符从空格改为冒号,则命令是


awk '{print $1":"$2":"$3":"$4":"$5}' emp_names > new_emp_names

 


在这种情况下,字符 (:) 包含在引号 ("/") 中,它被添加到每个字段之间。在引号之间的值可以是任何内容。例如,创建一个关于居住在阿拉巴马州的员工的外观类似数据库的显示:


$ awk '$5 ~ /AL/ {print "NAME: "$2", "$3" CITY-STATE:
  "$4", "$5" "}' emp_names

NAME: DULANEY, EVAN
CITY-STATE: MOBILE, AL

NAME: DURHAM, JEFF
CITY-STATE: MOBILE, AL

NAME: STEEN, BILL
CITY-STATE: MOBILE, AL

NAME: FELDMAN, EVAN
CITY-STATE: MOBILE, AL

NAME: SWIM, STEVE
CITY-STATE: UNKNOWN, AL
$

 


数学操作

AWK 除了提供文本功能,还提供全部范围的算术操作符,包括以下符号:

+ 将数字相加
- 减
* 乘
/ 除
^ 执行指数运算
% 提供模
++ 将变量值加一
+= 将其他操作的结果分配给变量
— 将变量减一
-= 将减法操作的结果分配给变量
*= 分配乘法操作的结果
/= 分配除法操作的结果
%= 分配求模操作的结果

例如,假定您的机器上存在以下的文件,详细地列出硬件商店中的物品:


$ cat inventory
hammers 5       7.99
drills  2      29.99
punches 7       3.59
drifts  2       4.09
bits   55       1.19
saws  123      14.99
nails 800        .19
screws 80        .29
brads 100        .24
$

 


第一项业务定单是通过将第二个字段(数量)的值乘以第三个字段(价格)的值,计算每种物品的库存价值:


$ awk '{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}' inventory
hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77
nails QTY: 800 PRICE: .19 TOTAL: 152
screws QTY: 80 PRICE: .29 TOTAL: 23.2
brads QTY: 100 PRICE: .24 TOTAL: 24
$

 


如果这些行本身并不重要,您只是希望确定商店中有多少件物品,则可以分配一个普通变量,按照每条记录中的物品数量增加:


$ awk '{x=x+$2} {print x}' inventory
5
7
14
16
71
194
994
1074
1174
$

 


根据这一数据,商店中有 1174 件物品。第一次执行时,变量 x 没有值,因此它采用第一行第二个字段的值。第二次执行时,它保留了第一行的值并加上第二行的值,以此类推,直到达到累计的总合。

可以应用相同的过程来确定现有库存的总价值:


$ awk '{x=x+($2*$3)} {print x}' inventory
39.95
99.93
125.06
133.24
198.69
2042.46
2194.46
2217.66
2241.66
$

 


因此,1174 件物品的价值是 $2,241.66。虽然这一过程可以获得总计值,但它的外观很差,需要加工成实际的报表。利用一些附加项,很容易使显示变得更整洁:


$ awk '{x=x+($2*$3)}{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3,"BAL: "x}' inventory
hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95 BAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98 BAL: 99.93
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13 BAL: 125.06
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18 BAL: 133.24
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45 BAL: 198.69
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77 BAL: 2042.46
nails QTY: 800 PRICE: .19 TOTAL: 152 BAL: 2194.46
screws QTY: 80 PRICE: .29 TOTAL: 23.2 BAL: 2217.66
brads QTY: 100 PRICE: .24 TOTAL: 24 BAL: 2241.66
$

 


该过程提供了每条记录的清单,同时将总价值分配给库存值,并保持商店资产的运作平衡。

BEGIN 和 END

使用 BEGIN 和 END 语句可以分别指定在处理实际开始之前或者完成之后进行操作。BEGIN 语句最常用于建立变量或显示标题。另一方面,END 语句可用于在程序结束后继续进行处理。

在前面的示例中,利用以下例程生成了物品的总价值:


awk '{x=x+($2*$3)} {print x}' inventory

 


该例程在运行总计累加时显示了文件中的每一行。没有其他方法可以指定它,而不让在每一行进行打印也导致它始终不打印出来。但是,利用 END 语句可以避免这一问题:


$ awk '{x=x+($2*$3)} END {print "Total Value of Inventory:"x}' inventory
Total Value of Inventory: 2241.66
$

 


定义了变量 x,它对每一行进行处理;但是,在所有处理完成之前不会生成显示。尽管可以作为独立例程使用,它也可以置入到先前的代码列表,添加更多信息并生成更完整的报表:


$ awk '{x=x+($2*$3)} {print $1,"QTY: "$2,"PRICE:
    "$3,"TOTAL: "$2*$3} END {print "Total Value of Inventory: " x}' inventory

hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77
nails QTY: 800 PRICE: .19 TOTAL: 152
screws QTY: 80 PRICE: .29 TOTAL: 23.2
brads QTY: 100 PRICE: .24 TOTAL: 24
Total Value of Inventory: 2241.66
$

 


BEGIN 命令与 END 的工作方式相同,但它建立了那些需要在完成其他工作之前所做的项目。该过程最常见的目的是创建报表的标题。此例程的语法类似于


$ awk 'BEGIN {print "ITEM   QUANTITY   PRICE   TOTAL"}'

 


输入、输出和源文件

AWK 工具可以从文件中读取其输入,正如在此之前所有示例所做的那样,它也可以从其他命令的输出中获取输入。例如:


$ sort emp_names | awk '{print $3,$2}'

 


awk 命令的输入是排序操作的输出。除了 sort,还可以使用任何其他的 Linux 命令 — 例如 grep。该过程允许您在离开所选定字段前对文件执行其他操作。

类似于解释程序,AWK 使用输出改向操作符 > 和 >> 将其输出放入文件中而不是标准输出设备。这些符号的作用类似于它们在解释程序中的对应符号,因此 > 在不存在文件时创建文件,而 >> 追加到现有文件的尾部。请看以下的示例:


$ awk '{print NR, $1 ) > "/tmp/filez" }' emp_names
$ cat /tmp/filez
1 46012
2 46013
3 46015
4 46017
5 46018
6 46019
7 46021
8 46022
9 46024
10 46026
11 46027
12 46029
$

 


检查该语句的语法,您会看到输出改向是在打印语句完成后进行的。必须将文件名包含在引号中,否则它只是一个未初始化的 AWK 变量,而将指令联接起来会在 AWK 中产生错误。(如果不正确地使用改向符号,则 AWK 无法了解该符号意味着“改向”还是一个关系操作符。)

在 AWK 中输出到管道也类似于解释程序中所实现的相同操作。要将打印命令的输出发送到管道中,可以在打印命令后附加管道符号以及命令的名称,如下所示:


$ awk '{ print $2 | "sort" }' emp_names
BOGUE
BUCK
DULANEY
DURHAM
FELDMAN
FERGUS
JUNE
KANE
STEEN
SWIM
TUTTLE
WOOD
$

 


这是输出改向的情况,必须将命令包含在引号中,而管道的名称是被执行命令的名称。

AWK 所使用的命令可以来自两个地方。首先,可以在命令行中指定它们,如示例中所示。其次,它们可以由源文件提供。如果是这种情况,通过 -f 选项将这种情况向 AWK 发出警告。演示如下:


$ cat awklist
{print $3,$2}
{print $4,$5," "}
$

$ awk -f awklist emp_names
EVAN DULANEY
MOBILE AL

JEFF DURHAM
MOBILE AL

BILL STEEN
MOBILE AL

EVAN FELDMAN
MOBILE AL

STEVE SWIM
UNKNOWN AL

ROBERT BOGUE
PHOENIX AZ

MICAH JUNE
PHOENIX AZ

SHERYL KANE
UNKNOWN AR

WILLIAM WOOD
MUNCIE IN

SARAH FERGUS
MUNCIE IN

SARAH BUCK
MUNCIE IN

BOB TUTTLE
MUNCIE IN

$

 


注意,在源文件中的任何地方或者在命令行中调用它时,不使用单引号。单引号只用于区别命令行中的命令与文件名称。

如果简单的输出不能处理您的程序中所需要的复杂信息,则可以尝试由 printf 命令获得的更加复杂的输出,其语法是


printf( format, value, value ...)

 


该语法类似于 C 语言中的 printf 命令,而格式的规格是相同的。通过插入一项定义如何打印数值的规格,可以定义该格式。格式规格包含一个跟有字母的 %。类似于打印命令,printf 不必包含在圆括号中,但是可以认为使用圆括号是一种良好的习惯。

下表列出 printf 命令提供的各种规格。

规格 说明
%c 打印单个 ASCII 字符
%d 打印十进制数
%e 打印数字的科学计数表示
%f 打印浮点表示
%g 打印 %e 或 %f;两种方式都更简短
%o 打印无符号的八进制数
s 打印 ASCII 字符串
%x 打印无符号的十六进制数
%% 打印百分号;不执行转换

可以在 % 与字符之间提供某些附加的格式化参数。这些参数进一步改进数值的打印方式:

参数 说明
- 将字段中的表达式向左对齐
,width 根据需要将字段补齐到指定宽度(前导零使用零将字段补齐) 
.prec 小数点右面数字的最大字符串宽度或最大数量

printf 命令能够控制并将数值从一种格式转换为另一种格式。当需要打印变量的值时,只需提供一种规格,指示 printf 如何打印信息(通常包含在双引号中)即可。必须为每个传递到 printf 的变量包含一个规格参数;如果包含过少的参数,则 printf 不会打印所有的数值。

处理错误

AWK 工具报告所发生错误的方式很令人恼火。一个错误会阻碍任何操作的进行,所提供的错误信息非常含混不清:


awk: syntax error near line 2
awk: bailing out near line 2

 


您可能会花几小时的时间查看第 2 行,试图找出它为什么阻碍程序运行;这就是支持使用源文件的一个有力论据。

切记有两条规则可以帮助您避免出现语法错误:

1. 确保命令位于括号中,而括号位于单引号中。没有使用这些字符之一必然导致程序无法运行。

2. 搜索命令需要位于斜线之间。要找出住在印第安那州的员工,您必须使用“/IN/”而不是“IN”。

结论

尽管 AWK 完全代表另外的含意,但它应该是管理员智能工具包的首字母缩写。连同 SED 一起,AWK 实用工具是 Linux 管理员所拥有的功能最强大和灵活的工具之一。通过了解其语言的一些特性,您可以开辟出能够简化任务的领域,否则这些任务将会是非常费时和困难的。


- 作者: chenbin 2004年07月26日, 星期一 10:57  回复(0) |  引用(0) 加入博采

翁美玲的一生(最全的资料)

- 作者: chenbin 2004年07月16日, 星期五 17:49  回复(0) |  引用(0) 加入博采

好莱坞百名影星肖像大收录(经典)

- 作者: chenbin 2004年07月16日, 星期五 17:43  回复(0) |  引用(0) 加入博采