Linuxshell学习笔记.docx

上传人:b****5 文档编号:6649422 上传时间:2023-01-08 格式:DOCX 页数:9 大小:22.86KB
下载 相关 举报
Linuxshell学习笔记.docx_第1页
第1页 / 共9页
Linuxshell学习笔记.docx_第2页
第2页 / 共9页
Linuxshell学习笔记.docx_第3页
第3页 / 共9页
Linuxshell学习笔记.docx_第4页
第4页 / 共9页
Linuxshell学习笔记.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

Linuxshell学习笔记.docx

《Linuxshell学习笔记.docx》由会员分享,可在线阅读,更多相关《Linuxshell学习笔记.docx(9页珍藏版)》请在冰豆网上搜索。

Linuxshell学习笔记.docx

Linuxshell学习笔记

Linuxshell学习笔记

2010-11-9

Gyreg

Shell基础

#!

实际是一个2字节【1】的魔法数字

常用的shell开头

#!

/bin/bash

#!

/bin/sed–f

#!

/usr/awk–f

Awk和sed执行程序都是存在/bin目录下

将1.txt中的内容备份到另外一个文件中:

使用如下语句:

cp/opt/1.{txt,bak}

 

linuxtr命令

通过使用tr,您可以非常容易地实现sed的许多最基本功能。

您可以将tr看作为sed的(极其)简化的变体:

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。

您也可以用它来除去重复字符。

这就是所有tr所能够做的。

正则表达式

^word字符串在首位

word$字符串在尾部

.任意字符a.bacbaeb

\剔除特殊字符转换成字符串

?

任意一个【单一】字符

*随意几个任意字符

[char]列表的字符

[^char]反向选择

\{n\}与前一个相同字符连续n个

\{n.m\}与前一个相同字符连续n-m个

^USER$对只包含USER的行

1.^符号在方括号[]外面的时候代表“开头”,比如^a的意思就是以a开头,而当^符号在方括号内的时候就代表“排除”,比如[^a]的意思是所有不是a的字符。

2.正则中的量词,问号?

,加号+,星号*。

?

号的意思是出现一次或者零次,*号是随便出现几次,当然也可以不出现,+号的意思是至少出现一次,当然也可以出现无数次。

总结一下:

+:

至少还有你

要么有要么没

*:

可有可无

3.方括号内部

代表一个字符组[a-z]代表小写字母从a到z,[1,3]代表字符‘1’字符‘,’以及字符‘3’,逗号也是字符哦。

[()]这个字符组也是正确的,代表左括号和右括号。

有个要注意的就是[^ab]不是代表所有非ab的字符,而是代表所有非a的字符以及字符b,其实等价于[^a],如果要把连字符(-)也加到字符组里面,那么要放第一个比如[-A-Z]

4.\s在很多流派里面都代表空白,包括tab,空格,换行,回车这类的。

其他的还有:

\t:

tab

\n:

换行

\r:

回车

\S:

除了\s以外所有的字符(所以\s\S就是统统统统的有了)

\w:

[a-zA-Z0-9]

\W:

\w以外所有的字符

\d:

0-9数字

\D:

除了\d以外的字符

5.修饰符:

i是忽略大小写

6.一般用括号括起来的部分会被获取,然后可以用\1,\2这样的来引用(经常在urlrewrite里面看到吧)

几个概念及理解:

 

1、正则表达式是强大,便捷,高效的文本处理工具。

 

2、利用正则表达式能够添加、删除、分离、插入和修整各种类型的文本和数据。

 

3、要学会用正则表示达式来思考。

 

4、完整的正则表达式由两种字符构成:

特殊字符(元字符),文字(普通文本字符)。

 

5、元字符的描述能力是正则表达式的核心。

 

6、元字符相当于人类语言的语法。

 

^(From|Subject):

其中^,(,|,)都是元字符。

 

正则表达式的思维框架 

完整的正则表达式由小的的构建模块单元组成,每个单元都很简单,但他们能够以无穷多种组合。

 

1)行的起始和结束 

^:

行的开始 

$:

行的结束 

他们匹配的是一个位置而不是具体的文本。

 

2)字符组

1、匹配若干字符之一:

 

正则表达式结构体:

容许使用者列出在某处期望匹配的字符,通常被称作字符组。

 

[ea]:

匹配e或者a 

gr[ea]y:

匹配时先找到g,接着是r,然后是一个a或者e,最后是一个y 

重要:

字符组的意思就是“或”,在字符组内部“-”(连字符)表示一个范围 

如:

H[1-6]等同于H[123456] 

[0-9a-fA-F]等同于[0123456789abcdefABCDEF]也等同于[A-Fa-f0-9]也等同于[a-f0-9A-F]也等同于[a-fA-F0-9],这叫多重组和。

 

[0-9A-Z_!

.?

]匹配一个数字,大写字母,下划线,叹号,点号,问号 

重要:

只有在字符组内“-”(连字符)才是“元字符”,否则只能匹配普通的连字符,但并不意味着在字符组内一定就是元字符,如果出现在开头只表示普通连字符。

问号(?

)和点号(.)通常是元字符,但在字符组内他们都是普通字符了。

 

2、排除型字符组:

在字符组中出现^表示排除,列出的是不希望匹配的字符。

 

[^1-6]匹配除1到6字外的任何字符,注意是任何字符!

 

重要:

^在字符组外表是一个行的开始(锚点),在字符组内(且紧接在字符组的第一个方括号([)之后)表示排除。

 

匹配未列出的字符不等于不要匹配列出的字符 

3、用点号匹配任意字符:

 

元字符(.)是用来匹配任意字符的字符组的简便写法。

 

03[-./]19[-./]76匹配:

03/19/76,03-19-76,03.19.76,192033197639,但可能192033197639不是我们期望的结果,这是就要在对目标的了解程度和精准之间找一个平衡。

 

3)多选结构 

1)匹配任意子表达式 

关键要理解子表达式中的“子”,子表达式用“|”分割开,表示“或”,每个子表达式称作“多选分支”。

 

括号()对于子表达式是必须的,本身就是元字符。

 

格式:

(子表达式1|子表达式2|子表达式3|...) 

例子:

(First|1st)==(Fir|1)st 

Jeffrey|Jeffery==Jeff(er|re)y==Jeff(ery|rey) 

注意:

多选结构与字符组是有根本的区别的,字符组只能由普通单字符构成分支,而多选结构的分支是可以由任何完整的表达式构成的,可以匹配任意长度的文本。

 

重要提示:

在包含多选结构的表达式中使用^和$要格外小心,比较:

 

^From|Subject|Date:

和^(From|Subject|Date):

 

两者匹配的结果完全不同,前者会匹配:

^From或者Subject或者Date:

显然不是我们要的结果,所以有必要使用括号来进行限定。

 

忽略大小写如果单纯用正则表达式实现对大小写敏感或忽略的匹配模式是完全可以实现的。

但对于通常的问题解决来说未免太麻烦了。

目前很多工具软件都提供相关功能设定。

也就是说是否忽略大小写的功能完全没有必要成为正则表达式的语言的一部分。

使用各种语言或工具中使用参数i  就表示忽略大小写的匹配,否则就是对大小写敏感的匹配。

如在Javascript中可以这样设定:

varmyReg=/[.][0-9a-z]+$/i;该表达式将可用来匹配文件名的扩展名,如:

.mp3,.doc,.html等,如果不使用i做忽略大小写的设定,必须改为:

varmyReg=/[.][0-9a-zA-Z]+$/i; 

单词分界符顾名思义就是单词的起始点和结束点,目的就是防止匹配的目标出现在另外一个单词内。

 

\<开始分界符 

\>结束分界符

例子:

想在目标文本中查找cat,如果用表达式cat来匹配能够找到所有的cat,但是也会找到不是预期的结果,如category等。

利用单词分界符可以很好地解决这个问题。

\该表达式只匹配cat,如果想匹配以cat开头或结尾的单词可以这样:

\匹配结尾为cat的单词。

注意:

单词分界符并不是智能到认识英语单词,而只是限定一个连续的字符串而已。

可惜并不是所有的工具或语言都支持单词分界符。

  

小结一下:

目前所涉及到的元字符:

.  任意单个字符 

[...]列出的任意字符 

[^...]未列出的任意字符 

^行的开始位置 

$行的结束位置 

\<单词的开始位置 

\>单词的结束位置 

|匹配分隔两边的任意表达式 

(...)限制竖线(|)的作用范围  

可选项元素颜色在英语中有两种写法:

color,colour如果想把他们全部从目标文本中找出来可使用表达式:

(color|colour)或者col(o|ou)r或者colo(ur|r)等等。

现在我们多了一种选择?

?

利用元字符(?

)也能解决这个问题,而且更直接简便。

colou?

r

u?

表示此处可以出现u也可以不出现,两种情况都是匹配的预期结果。

所以元字符(?

)代表可选项,只作用于前面紧邻的元素,注意:

这里说的是元素,而没说是字符,当然目前的例子是匹配字符,字符当然是元素,所以推而广之?

之前可以紧邻的元素也应该包括表达式,这恰恰是可选元素的强大功能所在。

如果?

要作用于表达式,则该表达式必须用()限定成为一个元素,如:

July?

(fourth|4(th)?

)匹配七月四日可能被写成的格式:

July4

Jul4

Julyfourth

Julfourth

Jul4th

July4th

其他量词:

重复出现+(加号)和*(星号)的作用与问号类似。

他们都对前面近邻的元素进行数量上的限定。

?

表示可有可无,但如果有数量必须是一个

+表示至少有一个以上

*表示从无到有到多个没有任何数量限定

{min,max}区间量词,规定重现次数的范围

常用正则表达式

匹配html的嵌入代码<[^>]*>

匹配[....]的嵌入码\[[^]]\{1,\}\]

删除仅由空字符组成的行

sed'/^[[:

space:

]]*$/d'filename

匹配html标签

/\(<[^>]*>\)/

例如:

从html文件中剔除html标签

sed's/\(<[^>]*>\)//g;/^[[:

space:

]]*$/d'file.html

例如:

要从下列代码中去除"[]"及其中包括的代码

[b:

4c6c2a6554][color=red:

4c6c2a6554]一.替换[/color:

4c6c2a6554][/b:

4c6c2a6554]

sed's/\[[^]]\{1,\}\]//g'filename

匹配日期:

Month,Day,Year[A-Z][a-z]\{3,9\},[0-9]\{1,2\},[0-9]\{4\}

2003-01-28或2003.10.18或2003/10/10或20031010

\([0-9]\{4\}[/-.][0-2][0-9][/-.][0-3][0-9]\)

匹配IP地址

\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)

\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)

匹配数字串

[-+]*[0-9]\{1,\}整数

[-+]*[0-9]\{1,\}\.[0-9]\{1,\}浮点数

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

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

WeChinaUnix

分解日期串

echo20030922|sed's/\(....\)\(..\)\(..\)/\1\2\3/'|readyearmonthday

echo$year$month$day

文件内容倒序输出

sed'1!

G;h;$!

d'oldfile>newfile

常用shell命令

 

常见shell问题

1.有很多种shell,你熟悉几种?

各个shell的homepage在那里?

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

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

4.ksh88与ksh93有何区别?

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

6.你的系统都有哪些shell?

版本是多少?

7.你知道POSIX吗?

最新版本是多少?

和你的shell有什么关系?

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

/sbin/shand/usr/bin/shshells都是Bourneshells.  

/sbin/sh  isstaticallylinked

/usr/bin/shisdynamicallylinked.

/bin/sh    /bin目录是到/usr/bin的链接

先看看属性:

#ls-l/sbin/sh  

-r-xr-xr-x2binroot251712Jul161997/sbin/sh

#ls-l/usr/bin/sh  

-r-xr-xr-x3binroot88620Jul161997/usr/bin/sh  

#file/sbin/sh  

/sbin/sh:

ELF32-bitMSBexecutableSPARCVersion1,staticallylinked,stripped

#file/usr/bin/sh  

/usr/bin/sh:

ELF32-bitMSBexecutableSPARCVersion1,dynamicallylinked,stripped

#ldd/sbin/sh  

ldd:

/sbin/sh:

fileisnotadynamicexecutableorsharedobject

#ldd/usr/bin/sh  

libc.so.1=>/usr/lib/libc.so.1  

libdl.so.1=>/usr/lib/libdl.so.1  

动态链接的bin执行的时候使用共享的libraries.他们的文件更小,

而且当libraries更新的时候,他们自动使用更新的libaries

静态链接bin包含了所有的代码,不需要使用共享的libraries.他们的文件大小比动态链接的bin文件要大.

如果系统"broken"并且libraries被删除了,损坏了,或者/usr目录没被mounted,/sbin/sh仍然可以执行。

  

所以推荐大家使用/sbin/sh作为缺省的rootshell

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

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

11.各种shell的arraysize有何限制?

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

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

14.shell中的函数可以递归吗?

设计时要注意什么?

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

16.Filepattern与regularexpression有什么不同?

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

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

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

20.如何保证shell程序只有单一instance运行?

 (有难度,绝非一个ps命令可以搞定)

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

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

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

24.为何ksh,rksh,pfksh都是同一个hardlink?

功能却不同?

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

26.对于多个相连的pipe,最后的返回码是pipe中那个命令的?

 如何取得所有命令的返回码?

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

28.Stdin,Stderr可以关闭吗?

有什么结果?

29.GNUtools与其他Unix上的相比有什么特点?

 为什么说不能过分依赖GNU 扩展?

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

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

32.如何用diff 及其他工具写一个版本控制系统?

(要有 check in,check out,filelock.. 等功能)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1