shell脚本编程及grep命令

  1 bash特性及bash脚本编程初步
  2     终端,附着在终端的接口程序;
  3         GUI: KDE,GNome,Xfce
  4         CLI: /etc/shells
  5 
  6     bash的特性:
  7         命令行展开: ~,{}
  8         命令别名: alias,unalias
  9         命令历史: history
 10         文件名通配: glob
 11         快捷键:ctrl + a ,e,u,k,l
 12         命令补全:$PATH
 13         路径补全:
 14 
 15     bash特性之: 命令hash
 16         缓存此前命令的查找结果: key-value
 17             key : 搜索键
 18             value : 值
 19         hash命令 : 
 20             hash: 列出
 21             hash -d cmd: 删除
 22             hash -r : 清空
 23     
 24     bash的特性之一: 变量
 25         程序: 指令+数据
 26             指令:由程序文件提供;
 27             数据:IO设备,文件,管道,变量
 28         程序: 算法+数据
 29         变量名+指向的内存空间
 30         变量赋值: name=value
 31         变量类型: 存储格式,表示数据范围,参与的运算
 32             编程语言:
 33                 强类型变量:
 34                 弱类型变量:bash把所有变量统统视为字符型;bash中的变量无需事先声明;
 35         变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;
 36         变量引用:${var_name},$var_name
 37         变量名:包含字母,数字和下划线(开头不能是数字)
 38             变量名:见名知义,命令机制遵循某种法则,以便区分,理解;不能使用程序的保留字,例如:if,else,while等
 39 
 40         bash变量类型:
 41             本地变量:作用域仅为当前shell进程
 42             环境变量:作用域为当前shell进程及其子进程
 43             局部变量:作用域仅为某代码片段(函数上下文)
 44 
 45             位置参数变量:当执行脚本的shell进程传递的参数;
 46             特殊变量:shell内置的有特殊功用的变量;
 47                 $?: 
 48                     0:成功
 49                     1-255: 失败
 50 
 51             本地变量:
 52                 变量赋值:name=value
 53                 变量引用:${name},$name
 54                     "":变量名会替换为其值;
 55                     '':变量名不会替换为其值;
 56                 查看变量:set
 57                 撤销变量:unset name
 58                     注意:此处非变量引用;
 59             环境变量:
 60                 变量赋值:
 61                     (1) export name=value
 62                     (2) name=value
 63                         export name
 64                     (3) delcare -x name=value
 65                     (4) name=value
 66                         declare -x name
 67                 变量引用:${name},$name
 68 
 69                 注意: bash内嵌了许多环境变量(通常为全大写字符),用于定义bash工作环境
 70                     PATH,HISTSIZE,HISTFILE,SHELL,HOME,UID,PWD...
 71                 查看环境变量:export,declare -x,env,printenv
 72                 撤销环境变量:unset name
 73 
 74             只读变量:
 75                 (1) declare -r name
 76                 (2) readonly name
 77 
 78                 只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程进程终止而终止;
 79 
 80 bash特性之一多命令执行:
 81     # cmd1 ; cmd2 ; cmd3 ; ...
 82 
 83     逻辑运算:
 84         运算数:    真(true,yes,on,1)
 85                 假(false,no,off,0)
 86         与:
 87             1 && 0 = 0
 88         或:
 89             1 || 0 = 1
 90         非:
 91             ! 1 = 0
 92         异或:判断是否相同,相同为0,相异为1;
 93 
 94     短路法则:
 95         示例:# id $username || useradd $username
 96 
 97 shell脚本编程:
 98     编程语言分类:根据运行方式
 99         编译运行:源代码-->编译器(编译)-->程序文件 
100 
101         解释运行:源代码-->运行时启动解释器,由解释器边解释边运行;
102     根据其编程中功能的实现是调用库还是调用外部的程序文件;
103         shell脚本编程:
104             利用系统上的命令及编程组件进行编程;
105         完整编程:
106             利用库或编程组件进行编程;
107 
108     编程模型:过程式编程语言,面向对象的编程语言
109         过程式:以指令为中心来组织代码,数据服务于代码;
110             顺序执行
111             选择执行
112             循环执行
113             如:c,bash
114         对象式:以数据为中心来组织代码,围绕数据来组织指令;
115             类(class): 实例化对象,method;
116             如:Java,c++,Python
117 
118     shell脚本编程:过程式编程,解释运行,依赖外部程序文件运行
119         如何写shell脚本:
120             脚本文件的第一行,定格:给出shebang,解释器路径,用于指明解释器当前脚本的解释器程序文件
121                 常见的解释器:
122                     #!/bin/bash
123                     #!/usr/bin/python
124 
125         文本编辑器:nano 
126             行编辑器:sed
127             全屏编辑器:nano,vi,vim
128 
129         shell脚本是什么?
130             命令的堆积;
131             但很多命令不具幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误;
132         运行脚本:
133             (1)赋予执行权限,并直接运行行命令参数传递给解释器程序;
134                 chmod +x /PATH 
135                 /PATH 
136             (2) 直接运行解释器,将脚本以命令行参数传递给解释器程序;
137                 bash /PATH
138 
139         注意: 脚本中的空白行会被解释器忽略;
140             脚本中,除了shebang,余下所有以#开头的行,都会被视作注释行被忽略;
141             shell脚本的运行是通过运行一个子shell进程实现的;
142 
143     练习:写脚本
144         (1) 显示/etc目录下所有以大写p或小写p开头的文件或目录本身;
145         (2) 显示/var 目录下的所有文件或目录本身,并将显示结果中的小写转换为大写后显示;
146         (3) 创建临时文件/tmp/myfile.xxxx;
147 
148     bash的配置文件:
149         两类:
150             profile类:为交互式登录的shell进程提供配置
151             bashrc类:为非交互式登录的shell进程配置
152         登录类型:
153             交互式登录shell进程:
154                 直接通过某终端输入账号和密码后登录打开的shell进程;
155                 使用su - username 或者 su -l username执行的登录切换;
156             非交互式登录shell进程:
157                 su username执行的登录切换;
158                 图形界面下打开的终端;
159                 运行脚本
160         profile类:
161             全局:对所有用户都有效;
162                 /etc/profile
163                 /etc/profile.d/*.sh
164             用户个人:仅对当前用户有效;
165                 ~/.bash_profile
166             功用:
167                 1.用于定义环境变量;
168                 2.用于运行命令和脚本;
169         bashrc类:
170             全局:
171                 /etc/bashrc
172             用户个人:
173                 ~/.bashrc
174             功用:
175                 1.定义本地变量;
176                 2.定义命令别名;
177         注意:仅管理员可修改全局配置文件;
178 
179         交互式登录shell进程:
180             /etc/profile-->/etc/profile.d/*-->/.bash_profile-->~/.bashrc-->/etc/bashrc
181 
182         非交互式登录shell进程:
183             ~/.bash rc-->/etc/bashrc-->/etc/profile.d/*
184 
185         命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期
186         配置文件定义的特性,只对随后新启动的shell进程有效
187 
188         让通过配置文件定义的特性立即生效:
189             (1) 通过命令行重复定义一次;
190             (2) 让shell进程重新读配置文件;
191                 ~]# source /PATH 
192                 ~]# . /PATH 
193 
194         问题一:定义对所有用户生效的命令别名,例如 cls='clear'?
195         问题二:让centos用户登录是,提供其已经登录,并显示当前系统时间?
196 
197 
198 文本处理工具:
199     
200     Linux上文本处理三剑客:
201         grep: 文本过滤工具(模式: pattern)工具;
202         sed: stream editor,流编辑器;文本编辑工具;
203         awk: Linux上实现为gawk,文本报告生成器(格式化文本);
204 
205         正则表达式:regual expression , regexp
206             由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
207                 分两类:
208                     基本正则表达式:BRE
209                     扩展正则表达式:ERE
210 
211             元字符: \(hello[[:space:]]\+\)\+
212     
213 
214 grep: global search regular expression and print out the line
215     作用: 文本搜索工具,根据用户指定的"模式(过滤条件)" 对目标文本逐个进行匹配检查;打印匹配到的行;
216     模式:由正则表达式的元字符及文本符所编写出的过滤条件;
217 
218     正则表达式引擎:
219 
220     grep [option] pattern [file]
221     grep [option] [-e pattern | -f file] [file...]
222 
223         options:
224             --color=auto: 对匹配到的文本着色后高亮显示;
225             -i: ignorecase,忽略字符大小写;
226             -o: 仅显示匹配到的字符本身;
227             -v,--invert-match: 显示不能被模式匹配到的行;
228             -E: 支持使用扩展的正则表达式元字符;
229             -q,quiet,--slience: 静默模式,即不输出如何信息;
230 
231             -A # : after,在后#行
232             -B # : before,在前#行
233             -C # : context,前后各#行
234 
235         基本正则表达式元字符:
236             字符匹配:
237                 .:匹配任意单个字符;
238                 []:匹配指定范围内的任意单个字符;
239                 [^]:匹配指定范围外的任意单个字符;
240                     如:[:punct:],[:alpha:]
241             匹配次数:用在要指明其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
242                 *: 匹配其前面的字符任意次;0,1,多次;
243                     例如: grep "x*y"
244                         abxy
245                         aby
246                         xxxxy
247                 .*:    匹配任意长度的任意字符;
248                 \?: 0次或1次;
249                 \+: 1次或多次;
250                 \{m\}: m次;
251                 \{m,n\}: 至少m次,至多n次;
252 
253             位置锚定:
254                 ^: 行首锚定;用于模式的最左侧;
255                 $: 行尾锚定的最右侧;
256                 ^pattern$ : 用于pattern来匹配整行;
257                     ^$: 空白行;
258                     ^[[:space:]]*$: 空行或包含空白字符的行;
259                 单词:非特殊字符组成的连续字符(字符串)都称为单词;
260 
261                 \< 或 \b : 词首锚定;用于单词模式左侧;
262                 \> 或 \b : 词尾锚定;用于单词模式右侧;
263                 \<pattern>\: 匹配完整单词;
264 
265             练习:
266                 1. 显示/etc/passwd文件中不以/bin/bash结尾的行;
267                 2. 找出/etc/passwd文件中的两位数或三位数;
268                 3. 找出/etc/rc.d/rc.sysinit或 /etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;
269                 4. 找出"netstat -tan"命令的结果中以'LISTEN'后跟0,1或多个空白符结尾的行;
270 
271             分组及引用:
272                 

猜你喜欢

转载自www.cnblogs.com/liuyuanq/p/9833908.html