Archive

Archive for the ‘Linux’ Category

linux shell 技巧

August 3rd, 2009
1.test测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,
其测试符和相应的功能分别如下:
(1)数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
(2)字符串测试:
=:等于则为真
!=:不相等则为真
-z 字符串:字符串长度伪则为真
-n 字符串:字符串长度不伪则为真
(3)文件测试:
-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,
其优先级为:“!”最高,“-a”次之,“-o”最低。
同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:var1=2
var2=$[var1*10+1]
则:var2的值为21。

2.if条件语句
if [ -x /sbin/quotaon ]; then
echo “Turning on Quota for root filesystem”
/sbin/quotaon /
elif [ -x /sbin/quotaon ]; then
/usr/bin/bash
else
echo “ok”
fi

3.for 循环
#!/bin/sh
WORD=”a b c d e f g h i j l m n o p q r s t u v w x y z”
for i in $WORD ; do
echo $i
done

#!/bin/sh
FILES=`ls /txt/*.txt`
for txt in $FILES ; do
doc=`echo $txt | sed “s/.txt/.doc/”`
mv $txt $doc
done

4.while和until 循环
#!/bin/sh
while [ -f /var/run/ppp0.pid ] ; do
killall pppd
done

#!/bin/sh
until [ -f /var/run/ppp0.pid ] ; do
sleep 1
done

Shell还提供了true和false两条命令用于建立无限循环结构的需要,
它们的返回状态分别是总为0或总为非0

5.case 条件选择
#!/bin/sh
case $1 in
start | begin)
echo “start something”
;;
stop | end)
echo “stop something”
;;
*)
echo “Ignorant”
;;
esac
case表达式中也可以使用shell的通配符(“*”、“?”、“[ ]”)。

6.无条件控制语句break和continue
break 用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句
而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。

7.函数定义
shell中还可以定义函数。函数实际上也是由若干条shell命令组成的,
因此它与shell程序形式上是相似的,不同的是它不是一个单独的进程,
而是shell程序的一部分。函数定义的基本格式为:
functionname
{
若干命令行
}
调用函数的格式为:
functionname param1 param2 ……
shell函数可以完成某些例行的工作,而且还可以有自己的退出状态,
因此函数也可以作为if、while等控制结构的条件。
在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时
shell将把这些参数分别赋予相应的位置参数$1、$2、…及$*。

8.命令分组
shell中有两种命令分组的方法:“()”和“{}”,前者当shell执行()
中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。
当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、
当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括
弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰;
{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们
要真正使用圆括弧和花括弧时(如计算表达式的优先级),则需要在其前面加上转
义符(\)以便让shell知道它们不是用于命令执行的控制所用。

9.信号
trap命令用于在shell程序中捕捉到信号,之后可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,
将执行双引号中的命令串。
trap ‘commands’ signal-list
trap “commands” signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号:
trap ” ” signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止
(如执行exit语句)时发出该信号。
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将
shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样
将很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell
不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体
的值来替换。

10. 运行shell程序的方法
执行shell程序的方法有三种:
(1)sh shell程序文件名
格式为:
bash shell 程序文件名
这实际上是调用一个新的bash命令解释程序,而把shell程序文件名作为参数传递给它。
新启动的shell将去读指定的文件,执行文件中列出的命令,当所有的命令都执行完结束。
该方法的优点是可以利用shell调试功能。
(2)sh<shell程序文件名
格式为:
bash<shell 程序文件名
这种方式就是利用输入重定向,使shell命令解释程序的输入取自指定的程序文件。
(3)用chmod命令使shell程序成为可执行的

11. bash程序的调试
bash -选择项 shell程序文件名
几个常用的选择项是:
-e:如果一个命令失败就立即退出
-n:读入命令但是不执行它们
-u:置换时把未设置的变量看作出错
-v:当读入shell输入行时把它们显示出来
-x:执行命令时把命令和它们的参数显示出来
上面的所有选项也可以在shell程序内部用“set -选择项”的形式引用,而“set +选择项”则
将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时,则可以将该部分用
上面两个语句包围起来。
1.未置变量退出和立即退出
未置变量退出特性允许用户对所有变量进行检查,如果引用了一个未赋值的变量就终止shell
程序的执行。shell通常允许未置变量的使用,在这种情况下,变量的值为空。如果设置了未
置变量退出选择项,则一旦使用了未置变量就显示错误信息,并终止程序的运行。未置变量退
出选择项为“-u”。
shell运行时,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时,如
果未经重新定向,该出错信息会打印在终端屏幕上,而shell程序仍将继续执行。要想在错误发
生时迫使shell程序立即结束,可以使用“-e”选项将shell程序的执行立即终止。
2.shell程序的跟踪
调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”
选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell
在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量
和该变量所取的值也显示出来,因此,它们的主要区别在于:在执行命令行之前无“-v”则打印出命
令行的原始内容,而有“-v”则打印出经过替换后的命令行的内容。
除了使用shell的“-v”和“-x”选择项以外,还可以在shell程序内部采取一些辅助调试的措施。
例如,可以在shell程序的一些关键地方使用echo命令把必要的信息显示出来,它的作用相当于C语
言中的printf语句,这样就可以知道程序运行到什么地方及程序目前的状态。

12. bash的内部命令
bash命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由shell本身提供。
常用的内部命令有:echo、eval、exec、export、readonly、read、shift、wait和点(.)。
下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上打印出由arg指定的字符串。
2.eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后
执行。
3.exec
命令格式:exec 命令 命令参数
功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,
当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec
后面的语句将不再被执行。
4.export
命令格式:export 变量名 或:export 变量名=变量值
功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。
但子shell不能用export把它的变量向上带入父shell
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly 变量名
功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出
所有只读的shell变量。
6.read
命令格式:
read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2……在程序中
每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,
直到减到0。
8.wait
功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。
9.exit
功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。
10.“.”(点)
命令格式:. Shell程序文件名
功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。

13. 特殊参数:
1. $*: 代表所有参数,其间隔为IFS内定参数的第一个字元
2. $@: 与*星号类同。不同之处在於不参照IFS
3. $#: 代表参数数量
4. $?: 执行上一个指令的返回值
5. $-: 最近执行的foreground pipeline的选项参数
6. $$: 本身的Process ID
7. $!: 执行上一个背景指令的PID
8. $_: 显示出最後一个执行的命令

Linux

linux压缩(解压缩)命令详解

June 12th, 2009

一.tar命令

         tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar 最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文 件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。

语法:tar [主选项+辅选项] 文件或者目录

使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。

主选项:

c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
x 从档案文件中释放文件。

辅助选项:
b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用档案文件或设备,这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。
二.Linux下的压缩文件剖析
         对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名 给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar。可是Linux就不同 了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使 用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

   在具体总结各类压缩文件之前,首先要 弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这 两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另外的工具将这一大堆文件先打 成一个包,然后再就原来的压缩程序进行压缩。

  Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:

  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:
  # tar -cf all.tar *.jpg
  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
  # tar -rf all.tar *.gif
  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
        # tar -uf all.tar logo.gif
  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar
  这条命令是列出all.tar包中所有文件,-t是列出文件的意思
  # tar -xf all.tar
  这条命令是解出all.tar包中所有文件,-x是解包的意思
  以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。
  1) tar调用gzip
  gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:
  # tar -czf all.tar.gz *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz
  # tar -xzf all.tar.gz
  这条命令是将上面产生的包解开。
  2) tar调用bzip2
  bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用bzip2。下面来举例说明一下:
  # tar -cjf all.tar.bz2 *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且调用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2
  # tar -xjf all.tar.bz2
  这条命令是将上面产生的包解开。
    3)tar调用compress
compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:

  # tar -cZf all.tar.Z *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且调用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z
  # tar -xZf all.tar.Z
  这条命令是将上面产生的包解开
  有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:
  1)对于.tar结尾的文件
  tar -xf all.tar
  2)对于.gz结尾的文件
  gzip -d all.gz
  gunzip all.gz
  3)对于.tgz或.tar.gz结尾的文件
  tar -xzf all.tar.gz
  tar -xzf all.tgz
  4)对于.bz2结尾的文件
  bzip2 -d all.bz2
  bunzip2 all.bz2
  5)对于tar.bz2结尾的文件
  tar -xjf all.tar.bz2
  6)对于.Z结尾的文件
  uncompress all.Z
  7)对于.tar.Z结尾的文件
  tar -xZf all.tar.z
  另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:
  1)对于.zip
  linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
  # zip all.zip *.jpg
  这条命令是将所有.jpg的文件压缩成一个zip包

      注意:如果要压缩的是个文件夹,则要加上-r参数,表示调用递归压缩,如:

      zip -r temp.zip temp
        # unzip all.zip
  这条命令是将all.zip中的所有文件解压出来

  2)对于.rar
  要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux
不是免费的;然后安装:
  # tar -xzpvf rarlinux-3.2.0.tar.gz
  # cd rar
  # make
  这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
  # rar a all *.jpg
  这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。
  # unrar e all.rar
  这条命令是将all.rar中的所有文件解压出来
   到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方 法对于Unix也基本有效。
  本文介绍了linux下的压缩程式tar、gzip、gunzip、bzip2、bunzip2、 compress、uncompress、zip、unzip、rar、unrar等程式,以及如何使用它们对.tar、.gz、.tar.gz、. tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行操作。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hbcui1984/archive/2007/04/25/1583796.aspx

Linux , ,

linux fg bg ctrl + z jobs & 等命令(zz)

May 14th, 2009

fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的
一。& 最经常被用到
   这个用在一个命令的最后,可以把这个命令放到后台执行
二。ctrl + z
     可以将一个正在前台执行的命令放到后台,并且暂停
三。jobs
     查看当前有多少在后台运行的命令
四。fg
     将后台中的命令调至前台继续运行
   如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
五。bg
     将一个在后台暂停的命令,变成继续执行
   如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

Linux下使用Shell命令控制任务Jobs执行
下列命令可以用来操纵进程任务:
  ps 列出系统中正在运行的进程;
  kill 发送信号给一个或多个进程(经常用来杀死一个进程);
  jobs 列出当前shell环境中已启动的任务状态,若未指定jobsid,则显示所有活动的任务状态信息;如果报告了一个任务的终止(即任务的状态被标记为Terminated),shell 从当前的shell环境已知的列表中删除任务的进程标识;
  bg 将进程搬到后台运行(Background);
  fg 将进程搬到前台运行(Foreground);
  将job转移到后台运行
  如果你经常在X图形下工作,你可能有这样的经历:通过终端命令运行一个GUI程序,GUI界面出来了,但是你的终端还停留在原地,你不能在shell中继续执行其他命令了,除非将GUI程序关掉。
  为了使程序执行后终端还能继续接受命令,你可以将进程移到后台运行,使用如下命令运行程序: #假设要运行xmms
  $xmms &
  这样打开xmms后,终端的提示又回来了。现在xmms在后台运行着呢;但万一你运行程序时忘记使用“&”了,又不想重新执行;你可以先使用ctrl+z挂起程序,然后敲入bg命令,这样程序就在后台继续运行了。
  概念:当前任务
  如果后台的任务号有2个,[1],[2];如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务。
  察看jobs
  使用jobs或ps命令可以察看正在执行的jobs。
  jobs命令执行的结果,+表示是一个当前的作业,减号表是是一个当前作业之后的一个作业,jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated,但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息;
  进程的挂起
  后台进程的挂起:
  在solaris中通过stop命令执行,通过jobs命令查看job号(假设为num),然后执行stop %num;
  在redhat中,不存在stop命令,可通过执行命令kill -stop PID,将进程挂起;
  当要重新执行当前被挂起的任务时,通过bg %num 即可将挂起的job的状态由stopped改为running,仍在后台执行;当需要改为在前台执行时,执行命令fg %num即可;
  前台进程的挂起:
  ctrl+Z;
  进程的终止
  后台进程的终止:
  方法一:
  通过jobs命令查看job号(假设为num),然后执行kill %num
  方法二:
  通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid
  前台进程的终止:
  ctrl+c
  kill的其他作用
  kill除了可以终止进程,还能给进程发送其它信号,使用kill -l 可以察看kill支持的信号。
  SIGTERM是不带参数时kill发送的信号,意思是要进程终止运行,但执行与否还得看进程是否支持。如果进程还没有终止,可以使用kill -SIGKILL pid,这是由内核来终止进程,进程不能监听这个信号。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/67555/showart_1110905.html

Linux , ,

linux下oracle自动启动脚本

December 26th, 2008

在Linux平台下安装好Oracle之后,Oracle服务是不会随着系统的启动而自动启动的。下面这个脚本即为在linux下面的自动启动Oracle脚本。
################################################################
#!/bin/bash
#
#by:cuijie
#http://www.cuijie.net.cn
#date:2008.12.26
#root用户登录
#
#
ORA_HOME=/u01/app/oracle/product/10.2.0/db_1
ORA_OWNER=oracle
#
case "$1" in
’start’)
echo -n "Oracle 10g is starting…"
su – $ORA_OWNER -c "$ORA_HOME/bin/dbstart" &amp;amp;
su – $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
touch /var/log/oracle10g
echo
;;

’stop’)
echo -n "Oracle 10g is stopting…"
su – $ORA_OWNER -c "$ORA_HOME/bin/dbshut" &amp;amp;
su – $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
rm -f /var/log/oracle10g
echo
;;

‘restart’)
echo -n "Oracle 10g is restarting…"
$0 stop
$0 start
;;

*)
echo "Usage:oracle{start|stop|restart}"
exit 1

esac
exit 0
################################################################
将上面的脚本复制粘贴到linux下面的合适位置处。如名字为Oracle10g.sh,然后chmod a+x Oracle10g.sh为该文件赋予可执行的属性。然后以oracle用户登录(root也可以)进入到
[oracle@test ~]$ cd $ORACLE_HOME/bin
vi打开dbstart,找到“ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle”,将这行替换为“ORACLE_HOME_LISTNER=$ORACLE_HOME”。不然会提示“failed to auto-start oracle net listene using /ade/vikrkuma_new/oracle/bin/ tnslsnr”的错误。(也可以使用sed -i ’s/ORACLE_HOME_LISTNER=\/ade\/vikrkuma_new\/oracle/ORACLE_HOME_LISTNER=\$ORACLE_HOME/’ bin/dbstart替换命令来替换)

[root@test cuijie]# chmod a+x oracle10g.sh
[root@test cuijie]# echo “/home/cuijie/oracle10g.sh start” /etc/rc.local
这样在系统启动的时候就能够自动启动oracle了。另外如果想加入系统服务使用/sbin/chkconfig –add 也可以加入,这样使用service就可以像启动ssh等这类服务一样方便了。

Linux, Oracle , ,

VRRP简介

December 10th, 2008

随着Internet的迅猛发展,基于网络的应用逐渐增多。这就对网络的可靠性提出了越来越高的要求。斥资对所有网络设备进行更新当然是一种很好的可靠性解决方案;但本着保护现有投资的角度考虑,可以采用廉价冗余的思路,在可靠性和经济性方面找到平衡点。  虚拟路由冗余协议就是一种很好的解决方案。在该协议中,对共享多存取访问介质(如以太网)上终端IP设备的默认网关 (Default Gateway)进行冗余备份,从而在其中一台路由设备宕机时,备份路由设备及时接管转发工作,向用户提供透明的切换,提高了网络服务 质量。 

一、协议概述

  在基于TCP/IP协议的网络中,为了保证不直接物理连接的设备之间的通信,必须指定路由。目前常用的指定路由的方法有两种:一种是通过路由 协议(比如:内部路由协议RIP和OSPF)动态学习;另一种是静态配置。在每一个终端都运行动态路由协议是不现实的,大多客户端操作系统平台都不支持动 态路由协议,即使支持也受到管理开销、收敛度、安全性等许多问题的限制。因此普遍采用对终端IP设备静态路由配置,一般是给终端设备指定一个或者多个默认 网关(Default Gateway)。静态路由的方法简化了网络管理的复杂度和减轻了终端设备的通信开销,但是它仍然有一个缺点:如果作为默认网关的 路由器损坏,所有使用该网关为下一跳主机的通信必然要中断。即便配置了多个默认网关,如不重新启动终端设备,也不能切换到新的网关。采用虚拟路由冗余协 议 (Virtual Router Redundancy Protocol,简称VRRP)可以很好的避免静态指定网关的缺陷。

  在VRRP协议中,有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。VRRP路由器是指运行VRRP的路由器,是物 理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定 IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控 角色的路由器,可以有一个或者多个处于备份角色的路由器。VRRP协议使用选择策略从路由器组中选出一台作为主控,负责ARP相应和转发IP数据包,组中 的其它路由器作为备份的角色处于待命状态。当由于某种原因主控路由器发生故障时,备份路由器能在几秒钟的时延后升级为主路由器。由于此切换非常迅速而且不 用改变IP地址和MAC地址,故对终端使用者系统是透明的。 

二、工作原理

  一个VRRP路由器有唯一的标识:VRID,范围为0—255。该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E- 00-01-[VRID]。主控路由器负责对ARP请求用该MAC地址做应答。这样,无论如何切换,保证给终端设备的是唯一一致的IP和MAC地址,减少 了切换对终端设备的影响。

  VRRP控制报文只有一种:VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18,发 布范围只限于同一局域网内。这保证了VRID在不同网络中可以重复使用。为了减少网络带宽消耗只有主控路由器才可以周期性的发送VRRP通告报文。备份路 由器在连续三个通告间隔内收不到VRRP或收到优先级为0的通告后启动新的一轮VRRP选举。

  在VRRP路由器组中,按优先级选举主控路由器,VRRP协议中优先级范围是0—255。若VRRP路由器的IP地址和虚拟路由器的接口IP 地址相同,则称该虚拟路由器作VRRP组中的IP地址所有者;IP地址所有者自动具有最高优先级:255。优先级0一般用在IP地址所有者主动放弃主控者 角色时使用。可配置的优先级范围为1—254。优先级的配置原则可以依据链路的速度和成本、路由器性能和可靠性以及其它管理策略设定。主控路由器的选举 中,高优先级的虚拟路由器获胜,因此,如果在VRRP组中有IP地址所有者,则它总是作为主控路由的角色出现。对于相同优先级的候选路由器,按照IP地址 大小顺序选举。VRRP还提供了优先级抢占策略,如果配置了该策略,高优先级的备份路由器便会剥夺当前低优先级的主控路由器而成为新的主控路由器。

  为了保证VRRP协议的安全性,提供了两种安全认证措施:明文认证和IP头认证。明文认证方式要求:在加入一个VRRP路由器组时,必须同时 提供相同的VRID和明文密码。适合于避免在局域网内的配置错误,但不能防止通过网络监听方式获得密码。IP头认证的方式提供了更高的安全性,能够防止报 文重放和修改等攻击。

三、 应用实例

  最典型的VRRP应用:RTA、RTB组成一个VRRP路由器组,假设RTB的处理能力高于RTA,则将RTB配置成IP地址所有者,H1、 H2、H3的默认网关设定为RTB。则RTB成为主控路由器,负责ICMP重定向、ARP应答和IP报文的转发;一旦RTB失败,RTA立即启动切换,成 为主控,从而保证了对客户透明的安全切换。

  在VRRP应用中,RTA在线时RTB只是作为后备,不参与转发工作,闲置了路由器RTA和链路L1。通过合理的网络设计,可以到达备份和负 载分担双重效果。让RTA、RTB同时属于互为备份的两个VRRP组:在组1中RTA为IP地址所有者;组2中RTB为IP地址所有者。将H1的默认网关 设定为RTA;H2、H3的默认网关设定为RTB。这样,既分担了设备负载和网络流量,又提高了网络可靠性。

  VRRP协议的工作机理与CISCO公司的HSRP(Hot Standby Routing Protocol)有许多相似之处。但二者主 要的区别是在CISCO的HSRP中,需要单独配置一个IP地址作为虚拟路由器对外体现的地址,这个地址不能是组中任何一个成员的接口地址。

  使用VRRP协议,不用改造目前的网络结构,最大限度保护了当前投资,只需最少的管理费用,却大大提升了网络性能,具有重大的应用价值。

Linux ,

RPM命令大全

December 8th, 2008

Linux+Apache2+openssl实现https验证

December 1st, 2008

首先安装SSL,再编译安装APACHE,再配置证书即可

1.下载apache和openssl
网址:http://www.apache.org
      http://www.openssl.org
2.解压
#tar zxvf httpd-2.0.54.tar.gz
#tar zxvf openssl-0.9.7g.tar.gz
3.编译安装openssl,这个软件主要是用来生成证书:
#cd openssl-0.9.7g
#./config
#make
#make test
#make install
把openssl放进内核目录下,使其在任何目录下都能运行。
#cd /usr/local/bin
#ln -s /usr/local/ssl/bin/openssl openssl
4.编译安装apache
#cd /opt/httpd-2.0.54
#./configure –prefix=”/opt/apache2″ –enable-so –enable-ssl –with-ssl=”/usr/local/ssl/bin”
#make
#make install
5.安装完毕,生成证书:
在/opt/apache2/conf下建立一个ssl.key目录
#cd ../apache2/
#cd conf/
#mkdir ssl.key
然后在该目录下生成证书:
#cd ssl.key/
生成服务器私钥:
#openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
…………………..++++++
………………………………………….++++++
e is 65537 (0×10001)
Enter pass phrase for server.key:
Verifying – Enter pass phrase for server.key:
生成服务器证书请求,并按要求填些相关证书信息:
#openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:tyl
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tz
Organizational Unit Name (eg, section) []:tz
Common Name (eg, YOUR name) []:tyl
Email Address []:tangyl@ruyi.com
 
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
签证:
# openssl x509 -req -days 700 -in server.csr -signkey server.key -out server.cert
Signature ok
subject=/C=AU/ST=Some-State/L=tyl/O=tz/OU=tz/CN=tyl/emailAddress=tangyl@ruyi.com
Getting Private key
Enter pass phrase for server.key:
为了安全,然后我们把这些文件的权限都设为400
chmod 400 server.key
chmod 400 server.cert

最后对/opt/apache2/conf/ssl.conf 进行修改:

vi /opt/apache2/conf/ssl.conf
修改的地方如下几处:
#SSLCertificateFile /opt/apache2/conf/ssl.crt/server.crt  #108行
SSLCertificateFile /opt/apache2/conf/ssl.key/server.cert
#SSLCertificateFile /opt/apache2/conf/ssl.crt/server-dsa.crt

SSLCertificateKeyFile /opt/apache2/conf/ssl.key/server.key   #116行
#SSLCertificateKeyFile /opt/apache2/conf/ssl.key/server-dsa.key

这样我们就基本配好了ssl现在我们来让apache启动ssl

/opt/apache2/bin/apachectl startssl

然后要求输入证书密码,正确输入后ssl就连同apache一起启动

 
在浏览器中输入:https://210.75.18.36

要求下载证书,OK~好了~结束~就是这么简单。

参考:http://www.szlangxing.com/Article/gyw/200504/524.html
         http://www.chinaunix.net/jh/13/469276.html
 
 


Keytool应用实例:

1.产生一个keystore:

keytool -genkey -alias myssl -keyalg RSA -keystore myssl.jks

运行这个命令,系统提示:

Enter keystore password:(输入keystore密码:)
yourpassword(输入密码)

What is your first and last name?(您的名字与姓氏是什么?)
[Unknown]: www.myssl.cn(输入申请的证书的域名)

What is the name of your organizational unit? (您的组织单位名称是什么?)
[Unknown]:Fastcom(输入你所在组织单位的名字)

What is the name of your organization? (您的组织名称是什么?)
[Unknown]:Fastcom (输入你所在组织的名字)

What is the name of your City or Locality?(您所在的城市或区域名称是什么?)
[Unknown]:Shanghai(输入所在城市的名字)

What is the name of your State or Province? (您所在的州或省份名称是什么?)
[Unknown]:Shanghai(输入所在省份名字)

What is the two-letter country code for this unit?(该单位的两字母国家代码是什么?)
[Unknown]:CN(输入国家名字,如果是中国,请输入CN)

Is CN=www.myssl.cn, OU=fastcom, O=fastcom, L=Shanghai, ST=Shanghai, C=CN correct? [no]:
yes

今天遇到两个以前没有遇到过的apache错误:
1、

Permission denied: .htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable 

这个错误表面上看是没有权限读取”.htaccess”文件,不过我并没有用到这个文件。于是touch了一个空的”.htaccess”文件,可是并没有解决这个问题。其实”.htaccess”文件并不是必须的呀,应该不会因为check不到这个文件,而导致403错误才对的。

仔细再检查了其它地方,发现导致这个错误的原因是主目录的权限不对。主目录的权限被改为了”600″,但是目录其实应该是有”x”的权限才对的。
将主目录chmod为”700″即消除了这个错误。

2、

[error] an unknown filter was not added: DEFLATE 

这个错误是由于配置中使用了DEFLATE,但却没有使用mod_deflate模块导致的。

比如虚拟主机的配置中有:

    <Location />
        AddOutputFilterByType DEFLATE text/html text/xml text/plain
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|swf|dat)$ no-gzip dont-vary
    </Location>

Linux , ,

Linux 如何使用输入法? 我已成功解决方法

November 21st, 2008

最近安装了Fedora 9 我敲了N天 装了N久硬是没装成功 “如果您愿意…..请在运行前安装输入法..” 恼火

Fedora 9 默认情况下 不管是中文模式还是字符模式 默认都没装中文输入法,大家是不是见到这种情况,怎么也敲不出中文?我也恼了很久 现在 我用过的方法总结了下 大家遇到此问题的 看看对你有没有用!

Fedora 9 竟然忽略中国,也许是怕了中国破解?再者这是开发的 不谈什么破解不破解的.

 

成功的方法:

我先说下故障:由于在实验情况下 本机无网络 用不了yum 命令功能, 切换不出输入法,从个人里面的输入法为空提示”如果您愿意,请在安装运行前安装输入法”而且用浏览器浏览”2003 server FTP”中文显示乱码.

解决方法:我个人下的是Fedora 9 ISO 共3.3G 默认情况下 是不装的.

手动装.

1. 将 光盘下 Packages 目录 #cp /packages 到 /system

#cd /Packages

# rpm -ivh imsettings-libs-0.99.6-3.fc9.i386.rpm

#rpm -ivh imsettings-0.99.6-3.fc9.i386.rpm

#rpm -ivh   im-chooser-0.99.6-3.fc9.i386.rpm

#rpm -ivh   scim-libs-1.4.7-23.fc9.i386.rpm

#rpm -ivh   scim-1.4.7-23.fc9.i386.rpm

#rpm -ivh   scim-tables-0.5.7-5.fc9.i386.rpm

#rpm -ivh   scim-python-0.1.11-1.fc9.i386.rpm

#rpm -ivh   scim-bridge-0.4.15-5.fc9.i386.rpm

#rpm -ivh   scim-bridge-gtk-0.4.15-5.fc9.i386.rpm

#rpm -ivh   libchewing-0.3.0-10.fc9.i386.rpm

#rpm -ivh   scim-python-pinyin-0.1.11-1.fc9.i386.rpm

#rpm -ivh   scim-tables-chinese-0.5.7-5.fc9.i386.rpm

#rpm -ivh   scim-chewing-0.3.1-13.fc9.i386.rpm

#rpm -ivh   scim-lang-chinese-1.4.7-23.fc9.i386.rpm

#reboot

 

记住这顺序,共14个包, -i 是重新安装 -v 是显示 -h 是进度 -ivh 就是重新安装并显示进度.

之后就在个人输入法中有了输入法.

 

这是从网上总结的但要运用到 yum 命令 没有网络的情况下 建议大家用上面的方法 我是绝对可行的:

1.安装盘里有关于 scim的包,或者 “系统”->“管理”->Add/remove Software 中,在搜

索框中搜:scim ,根据提示安装需要的包即可。

 

2.fedora 9刚刚发布我就下了一个,尝尝鲜,但是刚装好就发现了一个问题,居然没有输入法

。于是,在网上找了找资料最后问题解决。
   安装操作系统时要里面勾中文支持的,装完了以后可以在终端输入如下命令:
   yum install scim-lang-chinese
   重启后,就会有输入法了。

 

3.     这一次要解决的问题是关于中文显示以及中文输入法的问题。
参考了一些网上资料之后得到以下方法:
1、中文输入法的问题,用root的身份执行以下命令,第一个是yum install scim,搞定之后

执行yum install scim-pinyin就行了。
      然后注销,进入GONE,系统 – 首选项 – 个人 – 输入法,自己配置以下就好了。
2、KDE桌面的中文显示问题,在安装光盘里面有Packages文件夹里面有kde-l10n-Chinese-

4. 0.3-4.fc9.noarch.rpm一个文件,安装之后在System settings里面选择langue选项,

然后添加中文就解决了。
     电脑还有好多问题没有解决,譬如文字显示不太好,慢慢解决吧,一点一点来,也欢迎能

有喜欢Liunx的朋友一起讨论。

 

5. 我是从硬盘安装的F9 ,据说硬盘安装会少很多配置,不了解。下面把我遇到的中文输

入法问题和像我一样的菜鸟分享一下,肤浅的地方还请高手不吝赐教,嘿嘿
     
      据说F9 默认安装没有中文输入法,我的系统本想到:“系统”——首选项——个人里设

置,结果发现那里没有!汗!
不罗嗦,进入主题,我用的是笨方法:
   (1)先是:#yum erase scim*把scim卸载了,
    (2)然后:yum install scim-lang-chinese
下载依赖包花了不少时间,不过总算搞定了   

6. 如果你在安装fedora9的时候没有选择中文环境那就没有scim输入法只能手动安装。

顺如下:

1.执行 yum install scim-lang-chinese 命令安装中文输入。

2.系统-> 首先项 -> 个人 -> 输入法 选择 使用scim。

 

7. Fedora 9文字模式介面下安装中文:

需安装zhcon程式才可使用,以下为今天安装过程:
#yun install zhcon
依照步骤一步步安装即可,然后使用维书编辑器编辑设定档:/etc/zhcon.conf
……………….
defaultencode = big5
……………………

 

……………………
……………………
autoencode = auto
即可。输入中文后若一页中没有所需文字则可按下+/-1更换页面寻找。

X-window介面下无法输入中文:
(1)先是:#yum erase scim*把scim卸载了
(2)然后:yum install scim-lang-chinese下载封装需要一点时间
(3)再进到X-Window即可使用中文输入法

Fedora 9安装中文字体

默认的Fedora 9是不自动安装scim字体的,也就是说在gnome下输入汉字是不可能的,除非自己

 

 

安装。

安装方法:
yum install scim
yum install scim-pinyin

 

奶奶的 现在差不多了吧!

另外我还想请教 大家 Fedora 9下 如何安装小企鹅输入法啊??

Linux ,

修改Linux提高Squid服务器并发

November 12th, 2008

Linux下高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。

vi /etc/sysctl.conf

增加以下几行:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024    65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

执行以下命令使配置生效:

/sbin/sysctl -p

Linux ,

SHELL 水平测试

November 11th, 2008
 [ SHELL 水平测试 ][ OVERVIEW 篇 ]

 

1. 有很多种 shell, 你熟悉几种? 各个 shell 的 home page 在那里?

2. 为什么说 zsh 是目前为止功能最为强大的 shell.

3. 为什么说 pdksh 功能较弱?

4. ksh88 与 ksh93 有何区别?

5. 为什么 shell 编程最好用 ksh?

6. 你的系统都有哪些 shell? 版本是多少?

7. 你知道 POSIX 吗?最新版本是多少?和你的 shell 有什么关系?

8. /sbin/sh 和 /bin/sh 有何区别?

9. 你分析过 1000 行以上的 shell 程序吗?

10. 各种 shell 的变量名长度有何限制?

11. 各种 shell 的 array size 有何限制?

12. FIFO 比 co-process 有什么优点?

13. (..) 产生的 subshell 与调用另一个脚本产生的 subshell 有何不同?

14. shell 中的函数可以递归吗?设计时要注意什么?

15. 如何用 subshell 产生的多个值改变多个 shell 中的变量?

16. File pattern 与 regular expression 有什么不同?

17. shell 中含有大量文档.不想在每行之前用 # 注释. 有那两种方法可以实现?

18. 用 shell 程序安装配置一个二进制可执行软件.希望将被安装软件含在 shell 程序中形成一个
  安装文件, 可以吗?

19. 可以在一个shell 程序里包含 ksh 及 perl 两种代码吗?

20. 如何保证 shell 程序只有单一 instance 运行? (有难度, 绝非一个 ps 命令可以搞定)

21. 当有同名的 alias, function, builtin command, external command 时,如何知道并控制其运行顺序?

22. 如何在自定义 function 中调用同名的 builtin command ?

23. 怎样运行各种 shell 时具有 login shell 的行为?

24. 为何 ksh, rksh, pfksh 都是同一个 hard link? 功能却不同?

25. 当 while read .. 这样的语句用于 pipe 右侧时,需注意什么?

26. 对于多个相连的 pipe,最后的返回码是 pipe 中那个命令的? 如何取得所有命令的返回码?

27. cmd  >a  2>a 和 cmd  >a  2>&1 为什么不同?

28. Stdin, Stderr 可以关闭吗? 有什么结果?

29. GNU tools 与其他 Unix 上的相比有什么特点? 为什么说不能过分依赖 GNU 扩展?

30. VI 及 VIM 对行长度及 file size 有什么限制?

31. 请写出对 field 1 (数字), field 3 (数字倒序), field 3 (ascii) 进行排序的完整语句.

32. 如何用 diff 及其他工具写一个版本控制系统?(要有 check in, check out, file lock .. 等功能)

[ SHELL 水平测试 ][ SED 篇 ]

原帖: http://bbs.chinaunix.net/forum/viewtopic.php?t=476269&show_type=&sid=e90e3c748f1c10920ca09d71a81f7461

1. 你能看懂 sed one-lines 中的每一条语句吗?

2. /regex/! command 与 /regex/ !command 有什么区别?

3. 你能熟练使用 N,n, P,p,D,d,H,h,G,g,x,:,b,t 吗?

4. 什么是 sed 高级编程中的 lookup table 技术

5. sed debuger 的原理是什么?

6. 为什么 sed 的 guru 和 fans 比 awk 的多.(请看 yahoo groups)

下面几题根据使用的技术,难度不同.(难度 最小:1,最大:5)

7. 将数据文件中的每个词的第一个字母变成大写. (难度: 2 – 4)

8. 在 sed 中实现记数器.可加 1 或减 1. (难度: 3 – 4)

9. 提取 html 文件中 table 中每个单员的内容(table 可嵌套).(难度: 4 – 5)

每一个 cell 做为一个单员输出:

Table #1, Row #1, Column #1

Contents …….

Table #1, Row #1, Column #2

Contents …….

10. 一般的 sed 的 regex 的匹配都是 greedy 的。如何用 sed 实现 lazy 匹配?

[ SHELL 水平测试 ][ AWK 篇 ]

原帖:  http://bbs.chinaunix.net/forum/viewtopic.php?t=476271&show_type=&sid=e90e3c748f1c10920ca09d71a81f7461

注: 很多题目在不同的 awk 中实现不同, 请注明每一种 awk 的方法.

1. awk, oawk, nawk, gawk, mawk 有什么区别?

2. 在一个 awk 文件中,  第一行可以如下吗?

#! /bin/awk -F: -f

3. awk -F”" 与 awk -F “” 有区别吗?

4. 可以这样设置 FS 吗?  

   FS = “[ \t]+\|[ \t]+”

5. gawk 有一个扩展表达式与其他 GNU 工具不同, 是哪个, 为什么?

6. 那两种方法可以实现大小写无关匹配?

7. 下列两句有何区别?

awk \’$0 ~ “[ \t\n]“\’
awk \’$0 ~ /[ \t\n]/\’

8. FS=” ” 和 FS=” +” 有何区别?

9. 如何将每一个字符作为一个 field ?

10. 如何将整个文件作为一个 field ?

11. RS=”" 与 RS=”\n\n+” 有何区别?

12. NR 和 FNR 有何区别?

13. getline < “file” 改变那些 builtin 变量?

14. 如何不打印最后一个 field? (不用循环)

15. $1 ~ /aaa/ 与 /aaa/ ~ $1 有何区别?

16. a = /a/ 是什么意思?

17. awk 中的 array 可以排序吗?

18. 如何将 awk 中得到的值赋给 shell 变量.

19. 如何模拟二维数组?

20. 你的 awk 数组最多可能的单元是多少?有限制没有?

21. 你的 awk 中 field number, record length 及 file size 有何限制?

22. awk 中如何删除 array 及 关闭管道?

23. 如何完成 rev 功能?

24. 如何在 awk 中使用 coprocess?

25. 你写过 100 行以上的 awk 程序吗? 

[ SHELL 水平测试 ][ REGEX 篇 ]

原帖: http://bbs.chinaunix.net/forum/viewtopic.php?p=3143773#3143773

1. 传统 regex, POSIX regex, GNU regex, PCRE 都有什么特点及异同之处?

2. ERE 是 BRE 的 super set 吗?

3. ERE看起来强大,但使用 ERE 有一点最不爽, 是什么?

4. 依赖 GNU 扩展的危害是什么?

5. Back reference 可以嵌套吗?

6. DFA 和 NFA 有什么特点及区别?

7. 常用的 [e]grep, [ng]awk, [g]sed, perl 哪些是 DFA? 哪些是 NFA? 因此这些程序具有哪些相应的特点?

8. Greedy regex 和 lazy regex 有何区别? 哪些工具是 lazy regex.

9. 猜一猜一个符合 RFC 标准的 email adderss 大概需要多长的 regex 来匹配?

10. 你是否有这样的经历: 某个使用过的 regex, 用在另个软件中却不行。
也就是说你无法确定某个 regex 在同一系统的不同软件中或在不同系统的相同软件中肯定能用?

附加题

1. 为什么说 CU 的整体较为业余, 但 shell 版的水平相对较高?

2. 为什么 shell 版中的大部分高手都是玩 Linux 的, 而低手往往是 Sco unix, HP-UX 等其他平台的?

3. 为什么当低手怯怯地抛出一个问题, 高手快速地给出了漂亮的解答, 却往往最后并没有解决低手的问题?

Linux