马哥博客作业第三周

戏子无情 提交于 2020-04-06 02:09:08

正则表达式

一.文本编辑工具
1.文本编辑之神vim
1.1 vim的三种模式:
命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本
插入(Insert)或编辑模式:用于修改文本
扩展命令(extended command )或命令(末)行模式:保存,退出等
1.2 模式切换:
插入模式 --- ESC-----> 命令模式
命令模式 ---- : ----> 扩展命令模式
扩展命令模式 ----ESC,enter----> 命令模式
1.3 扩展模式的基本命令
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
X 加密
q 退出
q! 不存盘退出,即使更改都将丢失
r filename 读文件内容到当前文件中
w filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出
1.4 命令模式的基本命令 
ZZ 保存退出
ZQ 不保存退出
1.4.2 光标跳转
字符间跳转:
h: 左 L: 右 j: 下 k: 上
单词间跳转:
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首 
当前页跳转:
H:页首 M:页中间行 L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾
行间移动:
G 最后一行
1G, gg 第一行 
句间移动:
) 下一句 ( 上一句
段落间移动:
} 下一段 { 上一段
命令模式翻屏操作
Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏
1.4.3 字符编辑
x 删除光标处的字符
xp 交换光标所在处的字符及其后面字符的位置
~ 转换大小写
J 删除当前行后的换行符
d 删除命令,可结合光标跳转字符,实现范围删除 
d$ 删除到行尾
d^ 删除到非空行首
d0 删除到行首
D:从当前光标位置一直删除到行尾,等同于d$ 
y 复制,行为相似于d命令
yy:复制行 #yy 复制多行
Y:复制整行
p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
二.正则表达式 
1.分类:
基本正则表达式 
扩展正则表达式 
2.元字符的分类:字符匹配、匹配次数、位置锚定、分组
3.字符匹配: 基本正则表达式字符匹配:
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[king] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^king]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号 
扩展正则表达式字符匹配:
. 任意单个字符
[king] 指定范围的字符
[^king] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号 
基本正则表达式匹配次数:
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
+ 匹配其前面的字符至少1次,即:肯定有,>=1
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次,<=n
{n,} 匹配前面的字符至少n次
扩展正则表达式匹配次数:
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
基本正则表达式位置锚定:
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN> 匹配整个单词
扩展正则表达式位置锚定:
^ 行首
$ 行尾
\<, \b 语首
>, \b 语尾
基本正则表达式分组:
() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
扩展正则表达式分组:
() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

SHELL脚本编程

1.编程基础
1.1 程序组成
程序:算法+数据结构
数据:是程序的核心
算法:处理数据的方式
数据结构:数据在计算机中的类型和组织方式
1.2 编程风格
面向过程语言
做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现了情况B,做什么处理
问题规模小,可以步骤化,按部就班处理
以指令为中心,数据服务于指令
C,shell
面向对象语言
一种认识世界、分析世界的方法论。将万事万物抽象为各种对象
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
对象是类的具象,是一个实体
问题规模大,复杂系统
以数据为中心,指令服务于数据
java,C#,python,golang等
1.3 编程语言
计算机:运行二进制指令
编程语言:人与计算机之间交互的语言。分为两种:低级语言和高级语言
低级编程语言:
机器:二进制的0和1的序列,称为机器指令。与自然语言差异太大,难懂、难写
汇编:用一些助记符号替代机器指令,称为汇编语言
如:ADD A,B 将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中
汇编语言写好的程序需要汇编程序转换成机器指令
汇编语言稍微好理解,即机器指令对应的助记符,助记符更接近自然语言
高级编程语言:
编译:高级语言-->编译器-->机器代码文件-->执行,如:C,C++
解释:高级语言-->执行-->解释器-->机器代码,如:shell,python,php,JavaScript,perl
1.4 处理逻辑方式
顺序执行
选择执行
循环执行 
2.SHELL脚本语言的基本用法
2.1 shell 脚本的用途
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
2.2 shell脚本基本结构
shell脚本编程:是基于过程式、解释执行的语言
编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a + b
控制语句:if
shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
2.3 创建SHELL脚本过程
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
第二步:加执行权限
第三步:运行脚本
2.4 脚本调试
bash -n命令:只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本
bash -x命令:调试并执行
3.变量 
3.1变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
3.2类型:
内置变量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE
用户自定义变量 
3.3 Shell中变量命名法则 不能使程序中的保留字:如:if, for
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
见名知义,用英文单词命名,并体现出实际作用,不要用简写,如:ATM
统一命名规则:驼峰命名法, studentname,大驼峰StudentName 小驼峰 studentName
变量名大写:STUDENT_NAME
局部变量小写
函数名小写
3.4 变量定义和引用
变量的生效范围等标准划分变量类型
普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
3.5 变量赋值
neme='value'
value 可以是以下多种形式 
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=COMMAND 或者 name=$(COMMAND)
变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除
弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
只读变量:
只能声明定义,但后续不能修改和删除,即常量
位置变量:
在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
3.6 展开命令行
展开命令行顺序执行:
把命令行分成单个命令词
展开别名
展开大括号的声明{}
展开波浪符声明 ~
命令替换$() 和 `` 再次把命令行分成命令词
展开文件通配*、?、[abc]等等
准备I/0重导向 <、>
运行命令
3.7 脚本安全和set $- 变量
h:hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等
B:braceexpand,大括号扩展
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令
set命令:可以用来定制 shell 环境
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x
3.8 格式化输出 printf
printf "指定的格式" "文本1" ”文本2“……
常用替换符及功能:
%s: 字符串
%f:浮点格式
%b: 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义
%c: ASCII字符,即显示对应参数的第一个字符
%d,%i: 十进制整数
%o: 八进制值
%u: 不带正负号的十进制值
%x: 十六进制值(a-f)
%X: 十六进制值(A-F)
%%: 表示%本身
常用转义符及功能:
\a : 警告字符,通常为ASCII的BEL字符
\b :后退
\f :换页
\n :换行
\r :回车
\t :水平制表符
\v :垂直制表符
\ :表示\本身
3.9.算数运算
shell 支持算术运算,但只支持整数,不支持小数
bash中的算术运算
+
-
*
/
% 取模,即取余数,示例:9%4=1,5%3=2
** 乘方 
增强型赋值: 
+= i+=10 相当于 i=i+10
-= i-=j 相当于 i=i-j
*=
/=
%=
++ i++,++i 相当于 i=i+1
-- i--,--i 相当于 i=i-1
let varOPERvalue
3.10 逻辑运算
true, false
1, 0
与:&:和0相与,结果为0,和1相与,结果保留原值
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
或:|:和1相或结果为1,和0相或,结果保留原值
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:!
! 1 = 0 ! true
! 0 = 1 ! false
异或:^
异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出另一个值Y
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0 
短路运算
短路与
CMD1 短路与 CMD2
第一个CMD1结果为真 (1),第二个CMD2必须要参与运算,才能得到最终的结果
第一个CMD1结果为假 (0),总的结果必定为0,因此不需要执行CMD2
短路或
CMD1 短路或 CMD2
第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,,才能得到最终的结果
3.11条件测试命令
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
测试过程,实现评估布尔声明,以便用在条件性环境下进行执行 
若真,则状态码变量 $? 返回0
若假,则状态码变量 $? 返回1
条件测试命令
test EXPRESSION
[ EXPRESSION ] #和test 等价,建议使用 [ ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符
3.12 变量测试
-v VAR 变量VAR是否设置
-R VAR 变量VAR是否设置并引用
3.13 数值测试
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于
3.14字符串测试
test和 [ ]用法
-z STRING 字符串是否为空,没定义或空为真,不空为假
-n STRING 字符串是否不空,不空为真,空为假
STRING 同上
STRING1 = STRING2 是否等于,注意 = 前后有空格
STRING1 != STRING2 是否不等于
>ascii码是否大于ascii码
< 是否小于
[[]] 用法,建议,当使用正则表达式或通配符使用,一般情况使用 [ ]
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
3.15 文件测试
存在性测试
-a FILE:同 -e
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
3.16 关于 () 和 {}
( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境, 帮助参看:man bash搜索(list)
{ list; } 不会启子shell, 在当前shell中运行,会影响当前shell环境, 帮助参看:man bash 搜索{ list; }
3.17 使用read命令来接受输入
使用read来把输入值分配给一个或多个shell变量,read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量
格式:read [options] [name ...]
常见选项:
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d '字符' 输入结束符
-t N TIMEOUT为N秒
3.18 bash的配置文件
bash shell的配置文件很多,可以分成下面类别
按生效范围划分两类:
全局配置
个人配置
shell登录两种方式分类:
交互式登录:
直接通过终端输入账号密码登录
使用 su - UserName 切换的用户
(文件之间的调用关系,写在同一个文件的不同位置,将影响文件的执行顺序)
非交互式登录:
su UserName
图形界面下打开的终端
执行脚本
任何其它的bash实例
按功能划分分类:
profile类
profile类为交互式登录的shell提供配置
Bashrc类
bashrc类:为非交互式和交互式登录的shell提供配置
3.19 编辑配置文件生效
修改profile和bashrc文件后需生效两种方法:
1. 重新启动shell进程
2. source|. 配置文件
3.20 Bash 退出任务
保存在~/.bash_logout文件中(用户),在退出登录shell时运行
功能:
创建自动备份
清除临时文件
脚本编辑:
编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等  

set ts=4

set expandtab

set ignorecase

set cursorline

set autoindent

autocmd BufNewFile *.sh exec ":call SetTitle()"

func SetTitle()

if expand("%:e") == 'sh'

call setline(1,"#!/bin/bash")

call setline(2,"#")

call setline(3,"#********************************************************************")

call setline(4,"#Author: c*******")

call setline(5,"#QQ: 1*******")

call setline(6,"#Date: ".strftime("%Y-%m-%d"))

call setline(7,"#FileName: ".expand("%"))

call setline(8,"#URL: http://www.c******.com")

call setline(9,"#Description: The test script")

call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")

call setline(11,"#********************************************************************")

call setline(12,"")

endif

endfunc

autocmd BufNewFile * normal G   

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!