shell学习之 历史遗迹

发表于:2007-07-04来源:作者:点击数: 标签:
2004-11-10 基本元字符集及其含义 ^ 只只匹配行首 只只匹配行尾 * 只一个单字符后紧跟*,匹配0个或多个此单字符 [ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用- 表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ] \ 只用来屏蔽

2004-11-10
基本元字符集及其含义
^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-
表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在s h e l l中一些元字符有
特殊含义。\可以使其失去应有意义
. 只匹配任意单字符
p a t t e r n \ { n \ } 只用来匹配前面p a t t e r n出现次数。n为次数
p a t t e r n \ { n,\ } m 只含义同上,但次数最少为n
p a t t e r n \ { n,m \ } 只含义同上,但p a t t e r n出现次数在n与m之间


例:
#######
. 的情况

1。   ....xc....
假定正在过滤一个文本文件,对于一个有1 0个字符的脚本集,要求前4个字符之后为X C,


注意表达文件名时用单个?,而“.”用在正则里
ls -l ?bc
ls -l |grep ".bc"

#######
^   只匹配行首
2。 ^...1
在行首第4个字符为1,

#######
$
3.trouble$
假定要匹配以
单词t r o u b l e结尾的所有行

#######
4.只返回包含一个字符的行
^.$

^youhongyu$只返回 只包含youhongyu的行

#######
使用\屏蔽一个特殊字符的含义

$ . ' " [] ^ | ( ) \ + ?


5.\*\.pas
如果要在正则表达式中匹配以* . p a s结尾的所有文件

######
[]

例:
假定要匹配任意一个数字,可以使用:
[ 0 1 2 3 4 5 6 7 8 9 ]
然而,通过使用“-”符号可以简化操作:
[ 0 - 9 ]
或任意小写字母
[ a - z ]
要匹配任意字母,则使用:
[ A - Z a - z ]
表明从A - Z、a - z的字母范围。
如要匹配任意字母或数字,模式如下:
[ A - Z a - z 0 - 9 ]
在字符序列结合使用中,可以用[ ]指出字符范围。假定要匹配一单词,以s开头,中间有
一任意字母,以t结尾,那么操作如下:
s[a-z A-Z]t


注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容
[^0-9]
匹配任一非字母字符
不在括号里是 只字首

################
使用\匹配模式结果出现的次数

操作如下:
匹配字母A出现两次,并以B结尾
A \ { 2 \ } B
匹配值为A A B
匹配A至少4次,使用:
A \ { 4 , \ } B
可以得结果A A A A B或A A A A A A A B,但不能为A A A B。
如给出出现次数范围,例如A出现2次到4次之间:
A \ { 2 , 4 \ } B
则结果为A A B、A A A B、A A A A B,而不是A B或A A A A A B等。

########################
经常使用的正则表达式举例
^ 对行首
$ 对行尾
^ [ t h e ] 对以t h e开头行
[ S s ] i g n a [ l L ] 对匹配单词s i g n a l、s i g n a L、
S i g n a l、S i g n a L
[Ss]igna[lL]\. 对同上,但加一句点
[ m a y M A Y ] 对包含m a y大写或小写字母的

^ U S E R $ 对只包含U S E R的行
[tty]$ 对以t t y结尾的行
\ . 对带句点的行
^ d . . x . . x . . x 对对用户、用户组及其他用户
组成员有可执行权限的目录
^ [ ^ l ] 对排除关联目录的目录列表
[ . * 0 ] 对0之前或之后加任意字符
[ 0 0 0 * ] 对0 0 0或更多个
[ iI] 对大写或小写I
[ i I ] [ n N ] 对大写或小写i或n
[ ^ $ ] 对空行
[ ^ . * $ ] 对匹配行中任意字符串
^ . . . . . . $ 对包括6个字符的行
[a- zA-Z] 对任意单字符
[ a - z ] [ a - z ] * 对至少一个小写字母
[ ^ 0 - 9 \ $ ] 对非数字或美元标识
[ ^ 0 - 0 A - Z a - z ] 对非数字或字母
[ 1 2 3 ] 对1到3中一个数字
[ D d ] e v i c e 对单词d e v i c e或D e v i c e
D e . . c e 对前两个字母为D e,后跟两个任意字符,最后为c e
\ ^ q 对以^ q开始行
^ . $ 对仅有一个字符的行
^\.[0-9][0-9] 对以一个句点和两个数字开始的行
' " D e v i c e " ' 对单词d e v i c e
D e [ V v ] i c e \ . 对单词D e v i c e或d e v i c e
[ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 4 \ } 对日期格式d d - m m - y y y y
[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } 对I P地址格式nnn. nnn.nnn.nnn
[ ^ . * $ ] 对匹配任意行

经常使用正则表达的命令 grep awk sed


2004-10-27
grep **********************************

在g r e p 命令中输入字符串参数时,最好将其用双引号括起来。例如:“m y s t r i n g ”。这样做
有两个原因,一是以防被误解为s h e l l 命令,二是可以用来查找多个单词组成的字符串,例如:
“jet plane ”,如果不用双引号将其括起来,那么单词p l a n e 将被误认为是一个文件,查询结果
将返回“文件不存在”的错误信息。
在调用变量时,也应该使用双引号,诸如:g r e p “$ M Y VA R ”文件名,如果不这样,将
没有返回结果。在g r e p 命令中输入字符串参数时,最好将其用双引号括起来。例如:“m y s t r i n g ”。这样做
有两个原因,一是以防被误解为s h e l l 命令,二是可以用来查找多个单词组成的字符串,例如:
“jet plane ”,如果不用双引号将其括起来,那么单词p l a n e 将被误认为是一个文件,查询结果
将返回“文件不存在”的错误信息。
在调用变量时,也应该使用双引号,诸如:g r e p “$ M Y VA R ”文件名,如果不这样,将
没有返回结果。


-s 屏蔽错误信息
-i 区分大小写
-v 反向查找,就是找不包含的
-w 只查找指定的单词
-E 扩充模式  比如查找 you 或者hong  grep -E 'you|hong'

使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加\ >。

假定现在精确抽取4 8,
缺省情况下, g r e p是大小写敏感的,如要查询大小写不敏感字符串,必须使用- i开关
如果要抽出记录,使其行首不是4 8,可以在方括号中使用^记号,表明查询在行首开始

如果抽取以K开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字
grep 'K...D' data.f

将上述代码做轻微改变,头两个是大写字母,中间两个任意,并以C结尾:
grep '[A-Z][A-Z]..C'

查询包含1 9 9 8的所有记录的另外一种方法是使用表达式[ 0 - 9 ] \ { 3 \ } [ 8 ],含义是任意数字重
复3次,后跟数字8,
grep '[0-9]\[8]'

有时要查询重复出现次数在一定范围内,比如数字或字母重复出现2到6次,下例匹配数
字8重复出现2到6次,
grep '6\

grep '6\至少两次

结合使用^和$可查询空行。使用- n参数显示实际行数:
grep '^$' myfile

查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含“.”
的所有行,脚本如下:
grep 'conftroll\.conf' myfile


。系统中对文本文件有其标准的命名格式。一般最多
六个小写字符,后跟句点,接着是两个大写字符。
grep '[a-z]\\.[A-Z]\'


如果要查询目录列表中的目录,方法如下:
ls -l|grep '^d'

如果在一个目录中查询不包含目录的所有文件,方法如下:
ls -l|grep '^[^d]'
^ 含义 行首
^ 不包含

greo "aaron"  /etc/password >dev/null 2>
脚本含义是匹配命令输出或错误( 2 > $ 1),并将结果输出到系统池。大多数系统管理员称
/ d e v / n u l l为比特池,没关系,可以将之看成一个无底洞,有进没有出,永远也不会填满。


grep "48<tab>" mysql.txt
查找48后加tab键盘的在mysql.txt中

grep "48/>" mysql.txt
在mysql.txt中查找只包括48的行

grep "48[34]" mysql.txt
在mysql.txt中查找483,或者484行

结合使用^和$可查询空行。使用- n参数显示实际行数:

grep
1。选项
-c 只输出匹配行的计数。  *****
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。  ******

例题:

48 dec 3bc1997 lpsx 68.00
1.精确匹配
grep "48<tab>" data.f
或者
grep '48\>' data.f  通常用

egrep
如果要查询存储代码3 2 L 或2 C C ,可以使用(|)符号,意即“|”符号两边之一或全部。

egrep "(32L|2CC)" you.txt


**************************************
awk
在碰到a w k错误时,可相应查找:                       
? 确保整个a w k命令用单引号括起来。
? 确保命令内所有引号成对出现。
? 确保用花括号括起动作语句,用圆括号括起条件语句。
? 可能忘记使用花括号,也许你认为没有必要,但a w k不这样认为,将按之解释语法。


awk '{print ,'} abc.txt
打印1,4列 默认是空格做分割,代表整行

awk 'BEGIN {print "name  Belt\n-----------------------"} {print "\t"}' abc.txt
还可以加
awk 'BEGIN {print "name  Belt\n-----------------------"} {print "\t"} END {print "end of report"}' abc.txt

awk '{print NR}' abc.txt  打印行号

awk '{if ( ~/b/) print }' mycron 
包含 字符b
awk '{if ( ~/1/) print }' mycron
不包含b


awk ' ~/([Yy]ellow|Brown)/' abc.txt

awk '{if (=="Yellow"|| ~/Brown/) print }' abc.txt
 或者满足
awk '{if (=="Yellow"&& ~/Brown/) print }' abc.txt
同时满足

2004-11

################################find
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/ v a r / a d m目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print


find . -type l
查找类型是连接文件的


2004-11-06

touch -d 11/04 abcc 修改或者创建时间是11月4号的文件
touch -d 23:25 abcc 修改或者创建时间是23:25的文件
和 -t的不同在于写法 -t  11042325 11月4号23点25分


shell 中单个的“\”  代表忽略后面的回车符号,命令从下一行继续

问题,如何看帮助如
Usage: find [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of:
operators (decreasing precedence; -and is implicit where no others are given):
      ( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2

      EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
options (always true): -daystart -depth -follow --help
      -maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N

      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
      -ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE

shell
################################
find
语法: find 路径 选项 [-print -exec -ok ]
例子
-name
1。find . -name "*.txt"
查找当前目录下 所有名字有.txt的文件

2。find / -name "[abc][0-9]"
寻找 根目录下 名字 第一个是a/b/c,第二个是数字的文件

-perm
3。find . -perm 755
查找当前目录下所有权限是755的文件

-nouser
4。find /home -nouser
查找在/etc/password文件中没有有效帐户的文件

-mtime
5。find / -mtime -5
查找5天以内的文件
find / -mtime +5
查找5天前的文件


+5是大于五的意思,-5是小于5的意思
6。查找比某个文件新,同时又比另某个文件旧的文件
find / -newer age.awk ! -newer belts.awk

技巧:
如果要查找比更改时间前两个小时的文件 可以先
touch -t 11042140 dstamp  (创建比现在时间两个小时前的文件:11月4号21点40分的一个文件)
find . -newer dstamp 就可以查找两个小时内的文件了。

7。-type
find /etc/ -type d
查找所有目录文件
常用的:l 符号连接文件 f 普通文件

8。-size
find /etc -size 100k 大小大约在100k的文件
find /etc -size +100k 大小大于100k的文件
find /etc -size -100k 大小小于100k的文件


9。-mount
只查找本文件系统的文件

执行
10。-exec
find /etc/ -size +100k -exec ls -l {} \;
查找/etc/下文件大于100k的文件并显示详细信息

错误语法:
find /etc/ -size +100k|ls -l
只显示当前目录信息,无法起到管道服务的作用
find /etc/ -size +100k -exec ls -l {} (空格)\;(分号)

11。-ok  和-exec作用一样,但是在执行前会有确认(yes/no)


2004-11-08


s h e l l是从左至右分析相应的命令的


c r o n t a b的格式:
分< >时< >日< >月< >星期< >要运行的命令
其中< >表示空格。

例如你希望星期一至星期五运行某个作
业,那么可以在星期域使用1 - 5来表示。还可以在这些域中使用逗号“,”,例如你希望星期一
和星期四运行某个作业,只需要使用1 , 4来表示。可以用星号*来表示连续的时间段。如果你
对某个表示时间的域没有特别的限定,也应该在该域填入*。


30 21* * * /apps/bin/cleanup.sh
上面的例子表示每晚的2 1 : 3 0运行/ a p p s / b i n目录下的c l e a n u p . s h。
45 4 1,10,22 * * /apps/bin/backup.sh
上面的例子表示每月1、1 0、2 2日的4 : 4 5运行/ a p p s / b i n目录下的b a c k u p . s h。
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;
上面的例子表示每周六、周日的1 : 1 0运行一个f i n d命令。
0,30 18-23 * * * /apps/bin/dbcheck.sh
上面的例子表示在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/ a p p s / b i n目录下的d b c h e c k . s h。
0 23 * * 6 /apps/bin/qtrend.sh
上面的例子表示每星期六的11 : 0 0 p m运行/ a p p s / b i n目录下的q t r e n d . s h。


c r o n t a b命令的一般形式为:
Crontab [-u user] -e -l -r
其中:
-u 用户名。
-e 编辑c r o n t a b文件。
-l 列出c r o n t a b文件中的内容。
-r 删除c r o n t a b文件。

nohup
########################
如果使用n o h u p命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名
为n o h u p . o u t的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1
在上面的例子中,输出被重定向到m y o u t . f i l e文件中

输入输出
echo #######################
e c h o命令有很多功能,其中最常用的是下面几个:
\c 不换行。
\f 进纸。
\t 跳格。
\n 换行。

linux 中
是-n 不换行,使转义符生效-e


引号问题
初涉s h e l l的用户常常会遇到的一个问题就是如何把双引号包含到e c h o命令的字符串中。
引号是一个特殊字符,所以必须要使用反斜杠\来使s h e l l忽略它的特殊含义。假设你希望使用
e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠\即可:
echo "\"/dev/rmt0"\"

read
##########
我们给出了两个变量,它们分别被赋予名字和姓氏。s h e l l将用空格作
为变量之间的分隔符:
例:
read name surname
you hongyu(输入的内容)
echo $name $surname
you hongyu

######
cat
无分页功能
可以合并多个文件

tee
#######
输出到屏幕的同时 可以输出到文件

tee datadel.sh
-a 是添加输入到文件


标准输入、输出和错误
当我们在s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描
述符来引用这些文件。由于文件描述符不容易记忆, s h e l l同时也给出了相应的文件名。
下面就是这些文件描述符及它们通常所对应的文件名:
文件文件描述符
输入文件-标准输入0
输出文件-标准输出1
错误输出文件-标准错误2
系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、
输出和错误。


例:
1。cat password 1 >abc.out 和cat password >abc.out是一样的
都是把输出内容到文件abc.out中

2。>abc.out
创建空文件

3. sort <name.txt  >name.cout
对name.txt排序,通过重定向为s o r t命令指定一个输出文件n a m e . o u t。
这样屏幕上将不会出现任何信息(除了错误信息以外):

4。cat >>youhongyu.txt <<MAYDAY
abc
youhongyu
MAYDAY


重定向操作符command << delimiter是一种非常有用的命令,通常都被称为“此处”文挡。
我们将在本书后面的章节深入讨论这一问题。现在只介绍它的功能。s h e l l将分界符d e l i m i t e r之
后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, s h e l l就知道输
入结束了。这一命令对于自动或远程的例程非常有用。可以任意定义分界符d e l i m i t e r,最常见
的是E O F,而我最喜欢用M AY D AY,这完全取决于个人的喜好。还可以在< <后面输入变量。
下面给出一个例子,我们创建了一个名为m y f i l e的文件,并在其中使用了T E R M和L O G N A M E
变量。


为了重定向标准错误,可以指定文件描述符2
5.grep "youhongyu"  abc.txt 2 >/dev/null
把错误重定向到文件/ d e v / n u l l中(实际就上是系统的垃圾箱):

6. grep "youhongyu" abc.txt 2 >grep.err
保存到g r e p . e r r文件中:

7.grep "youhongyu" abc.txt 1>you.dat 2>you.err
输出到you.dat,错误信息输出到you.err


8. grep "standtard" you.txt >you.out 2>
g r e p命令的标准输出和标准错误都被重定向到g r e p . o u t文件中。

命令执行顺序
使用&&
################
使用& &的一般形式为:
命令1 && 命令2
这种命令执行方式相当地直接。& &左边的命令(命令1)返回真(即返回0,成功被执行)
后,& &右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功& &那么执
行这个命令”。

例:
1。mv /bin/apaps /bin/abc/ && rm -r /bin/apaps

如果/bin/apaps/移动不成功,则不删除

使用||
使用| |的一般形式为:
命令1 || 命令2
| |的作用有一些不同。如果| |左边的命令(命令1)未执行成功,那么就执行| |右边的命令
(命令2);或者换句话说,“如果这个命令执行失败了|| 那么就执行这个命令”。

sh daily.sh||exit

原文转自:http://www.ltesting.net