LINUX基础整理-SHELL脚本-VIM及正则表达式
### SHELL 脚本
程序: 指令 + 数据
算法 + 数据结构
变量赋值:name = value
编程语言:
强类型语言
弱类型语言
bash 把所有变量统统视作字符型
bash 中的变量无需要事先声明,相当于,把声明和赋值过程同时实现。
声明:类型、变量名
变量替换:
把变量名出现的位置替换为其所指向的内存空间中的数据
变量引用:
${var_name},$var_name
变量名:
字符、数字、下划线
不能以数字开头
bash 变量类型
本地变量 : 作用域仅为当前shell进程
环境变量 : 作用域为当前shell进程及其子进程
局部变量 : 作用域为某代码片断(函数上下文)
位置参数变量 :当执行脚本的Shell进程传递的参数
特殊变量 : shell 内置的有特殊功用的变量
本地变量
变量赋值:name = value
查看变量 : set
撤销变量 : unset name
环境变量:
变量赋值
1. export name = value
2. name = value
export name
3. declare -x name = value
4. name = value
declare -x name
查看环境变量 :
export
declare -x
printenv
env
撤销环境变量:
unset name
只读变量:
1. declare -r name
2. readonly name
只读变量无法重新赋值、并且不支持撤销
逻辑运算
运算符: True /False
短路法则
~]# COMMAND1 && COMMAND2
COMMAND1 为‘假’,则COMMAND2 不会执行
COMMAND1 为‘真', 则COMMAND2 必须执行
~]# COMMAND1 || COMAND2
COMMAND1 为‘真’ 则COMMAND2 不会执行
COMMAND1 为‘假’ 则COMMAND2 必须执行
示例 ~]# id $username || useradd $username
#### Shell 脚本编程的实现
根据运行方式:
编译运行: 源代码---编译器--- 程序文件
解释运行: 源代码---运行时启动解释器、则解释器边解释、边运行
调用方式:
shell: 利用系统上的命令及编程组件进行编程
完整编程:利用库或编程组件进行编程
编程模型:
过程式:以指令为中心来组织代码,数据 是服务于代码
顺序执行
选择执行
循环执行
对象式:以数据为中心来组织代码、围绕数据来组织指令
类(class):实例化对象 ---- method
如何写shell
脚本第一行、顶格:给出shebang,解释路径,用于指明解释执行当前 脚本的解释器程序文件
常见的解释器:
#!/bin/bash
#!/usr/bin/pton
#!/usr/bin/perl
文本编程器:
行编辑器: sed
全屏幕编程器:nano 、vim 、 vi
Shell 脚本是什么?
命令的堆积
很多命令不具备有重复性、需要有程序逻辑来判断运行条件是否满足、以避免其运行中发生错误
示例:
~]# cat demo01.sh
#!/bin/bash
useradd user3
echo "user3" | passwd --stdin user3
mktemp -d /tmp/text.XXXXX
~]# chmod +x demo01.sh
~]# ./demo01.sh
运行脚本
1. 赋值执行权限 、并直接运行此程序文件:
chmod +x /PATH/TO/FILE
./FILE or bash FILE
脚本中的空白行、会被pass,以#开头被标识为注释行、不执行
练习: 写一个脚本、实现以下功能
1. 显示/etc/目录下所有以p开头的文件或者目录本身
2. 显示/var 上膛下所有文件或者目录本向、并显示结果的小写字母转换为大写后显示
3. 创建临时文件/tmp/myfile.XXXXX
[root@DEMO data]# cat test.sh
#!/bin/bash
ls -d /etc/[pP]*
ls -d /var/* | tr 'a-z' 'A-Z'
mktemp /tmp/myfile.xxxx
bash 的配置文件
两类:
profile 类: 为交互式登陆的shell 提供配置 --- 通过终端输入用户名和密码打开的shell进程
bashrc 类: 为非交互式登陆的Shell 提供配置 --- 使用 su USERNAME 打开的shell进程、通过图形界面下打开的终端、 运行脚本
profile类:
全局:对所有用户都生效
/etc/profile
/etc/profile.d/*.sh
用户个人:仅对当前用户有效
~/.bash_profile
功能:
1. 用于定义环境变量
2. 运行命令或者脚本
bashrc类:
全局:/etc/bashrc
个人:~/.bashrc
功能:
1. 定义本地变量
2. 定义命令别名
交互式登陆Shell 进程:
/etc/profile --> /etc/profile.d/* -->/.bash_profile --> /.bashrc --->/etc/bashrc
非交互式登陆Shell 进程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
命令行中定义的特性---立即生效
配置文件定义的特性---对新的shell 进程生效
让配置文件定义特性生效:
1. 通过命令重新定义一次
2. 让Shell 进程重新读配置
~]# source /PATH/FROM/CONFIG_FILE
~]# ./PATH/FROM/CONFIG_FILE
问题1: 定义对所有用户都生效的命令别名
问题2: 让CentOS 用户登陆时、显示欢迎信息、并显示当前系统时间
~]# animal=sheep
~]# echo "There are some $animals"
There are some
~]# echo "There are some ${animal}s"
There are some sheeps
### 正则及grep
三剑客
grep: 文本过滤工具
sed: 流编辑器
awk: 格式化文本
正则表达式: re
由一类特殊字符及文本字符所编写的模式、其中有一些字符不表示其字面意义
两类:
基本正则表达式: BRE
扩展正则表达式: ERE
元字符:
\{helo[[:space:]]\+\}\+
grep : 全文搜索第一行,如果模式能匹配则显示这一行、而不是这个本身
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-i: 忽略字符大小
-o:只显示匹配字符的本身、而不是显示每行
-v: 反向显示(意思匹配不到的显示)
-E: 支持使用扩展的正则表达式字符
-q: 静默模式-只返回状态码,不显示结果
-A # : 同时显示匹配到的每一行的,下面的#行
-B # : 同时显示匹配到的每一行的,上面的#行
-C # :同时显示匹配到的每一行的、上下的#行
基本正则表达式元字符
字符匹配
. : 任意单个字符
[]: 匹配指定范围的任意单个字符
[^]: 匹配指定范围外的任意单个字符
[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:]
匹配次数
* : 匹配其前面的字符任意次: 0,1,多次
\?:匹配前面的字符0次或者次
\+: 匹配前面的字符至少出现1次
\{m}:匹配前面的字符M次
\{m,n}:匹配胶面的字符出现到少m次、至多出现N次
\{0,n}: 至多出现N次
\{m,}: 到少出现M次
位置锚定
^: 行首锚定---用于模式的最左侧
$: 行尾锚定---用于模式的最右侧
^PATTERN$: 用于PATTERN来匹配行
^$: 空白行
^[[:space:]]*$ : 空行或者包含字符的行
单词分割:
\< or \b :词首锚定、用于单词模式的左侧
\> or \b :词尾锚定、用于单词模式的右侧
\<PATTERN\>: 匹配完整单词
分组及引用
\(\): 将一个或者多个字符***在一起
\(xy\)*ab
注意:分组的括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中
~]# grep "\(l..e\).*\1*" FIELS
在上述命令中 \1 所表示的内容主浊 \(l..e\) 所匹配到的内容
练习:
1. 显示 /etc/passwd 文件中不能/bin/bash结尾的行
~]# grep -v "/bin/bash\>" /etc/passwd
2. 找出/etc/passwd 文件中的两位数或者三位数
~]# grep "\<[0-9]{2,3}\>" /etc/passwd
3. 找出/etc/rc.d/rc.sysinit文件中,以至少一个空白字符开头、且后面非空白字符的行
~]# grep "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfggrep "\<[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg
4. 找出'netstat -tan" 命令的结果中以LISTEN 后面跟0、1 或者多个空白字符结尾的行
~]# netstat -tan | grep "LISTEN[[:space:]]*$"
#### EGREP
扩展正则表达式的元字符
1. 找出/proc/meminfo 文件中, 所有在大写或者小写S开关的行,
~]# grep "^[Ss]" /proc/meminfo
~]# grep -i "^s" /proc/meminfo
~]# grep -E "^(s|S)" /proc/meminfo
2. 显示当前系统上root,centos,或者user1用户的相关信息
~]#grep -E "^(root|centos|user)\>" /etc/passwd
3. 找出/etc/rc.d/function文件中某单词后面跟一个小括号的行
~]# grep -i "\<[a-z]\+(" /etc/rc.d/init.d/functions
~]# grep -Eo "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4. 使用echo 命令输出一绝对路径、使用egrep 取基名
~]# echo "/etc/sysconfig |grep -E -o "[^/]+/?$"
5. 找出ifconfig 命令结果中的1-255的数数值
~]#ifconfig | egrep -o "\<[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"
~]# grep -E "^[^:]" /etc/passwd
~]# ]# grep -E -o "^([^:]+\>).*\1$" /etc/passwd
#### fgrep
不支持正则表达式元字符
#### 其它命令 wc,cut,sort,uniq,diff,patch
wc: 统计个数
cut: 从一行中移除片段
-d: 跟字符 确认以此字符为分割符
-f FILE: 选出的字段
#: 指定的单个字段
#-#:连续字段
#,#: 离散字段
~]# wc -l /etc/rc.d/init.d/function | cut -d' ' -f1
sort: 排序
-n: 基于数值大小而非字符进行排序
-t CHAR: 指定分隔符
-K: 指定排序比较字段
-r: 逆顺排序
-f: 忽略字符的大小
-u: 重复的内容只保留一份
~]# cut -d: -f7 /etc/passwd |sort -u |wc -l
uniq: 重复数据只保留一份
-c: 显示很行的重复次数
-u: 只显示末重复的行
-d: 只显示重重复次数超过二次的行
diff: 二个文件对比
diff file1 file2
patch: 打补丁
patch -i 补丁文件 需要更新的文件
-i : 安装补丁
-i -R : 还原文件
练习使用Cut 取一个IP地址
### vim
i: 在光标所在处理输入
a: 在光标所在处后面输入
o: 在光标所在处增加一个新行
I: 在光标行首输入
A:在光标所尾部输入
O: 在光标处上放打开一行
字符间跳转
h:左
j:下
k:上
l:右
# COMMAND 跳转由#指定个数的字符
单词间跳转:
w: 下一个单词的词首
e: 当前或者下一个单词尾
b: 当前或者前一个单词首
同样支持# COMMAND命令
行首行尾跳转
^: 跳转到行首第一个非空字符
0: 跳转到绝对行首
$: 跳转到行尾
段之间
}
{
句间
(
)
翻屏:
Ctrl + f: 向下
Ctrl + b: 向上
ctrl + d: 向下半屏
Ctrl + u: 向上半屏
K : 向上一行
Enter: 向下一行
### vim 编辑命令
字符编辑
X: 删除光标所在处字符
#X: 删除光标所在处起始的#个字符
xp: 交换光标所在处的字符与其后面字符的位置
替换命令:
r 'str': 替换光标所处的字符为'str'
删除命令:
d: 删除命令、可结合光标跳转字符 、实现范围删除
d$: 删除光标到行尾的蹭所所有的字符
d^: 删除光标到行首的中间所有的字符
dw: 删除光标到下一个单词中间的所有字符
dd: 删除光标所在处的行
#dd: 删除光标所在处的行、起始的#行
粘贴命令:
p: 缓冲区中的内容如果为整行、则粘贴在当前光标所在行的下方、否则、则粘贴到当前光标所在处的后方
P:缓冲区中的内容如果为事行、则粘贴在当前光标所在行的上方、否则、则粘贴到当前光标所在处的前方
复制命令:
y: 复制工作行为相似于d命令
y$
y^
yw
yy: 复制一整行
改变命令:
编辑模式---输入模式---实现删除
c$
c^
c0
cb
cw
ce
支持使用 # COMMAND
cc: 删除光标所在的行、并转换为输出模式
可视化模式:
v: 按字符 选定
V: 按行选择
撤销操作:
u: 撤销当前的操作
#u: 撤销当前#个操作
恢复撤销操作:
ctrl + r
重担执行前一个编辑操作
.
vim 自带练习教程
vimtutor
vim 末行的模式:
内建的命令行接口
1. 地址定界: start_pos[,end_pos]
#: '#' 代表数据、表示特定的行, '5' 就表示第五行
.: 表示当前行
$: 表示最后一行
#1,#2 : 表示从"#1" 行开始到"#2" 行结束
#1,+# :表示'#1' 行开始、"+#" 表示行的偏移量
3,+7: 表示从第3行开始、向后再7行。一共8行
%: 表示全文
/parten/ : 表示第一次被’parten' 匹配的行。
/pat1/,/pat2/: 表示从光标所在处起始、第一次由pat1匹配开始、到第一次由pat2 匹配到地行结束之间所有行
可同编辑命令一同使用,实现编辑操作
d : 删除
y :复制
c :改变
w /PATH/TO/SOMEFILE :将范围内的文件保存到特定的文件
r /PATH/TO/SOMEFILE :将指定的文件读取并插入到指定位置
2. 查找
/PATTERN: 从当前光标所在处向文件的尾部查找能够被当前模式匹配到的所有字符串
?PATTERN: 从发前光标所在处向文件的首部查找能够被当前模式匹配到的所有字符串
n: 下一个、与命令方向相同
N: 上一个、与命令方向相反。
3. 查找并替换
s: 末行模式的命令
使用格式: s/ 要查找的内容/替换为的内容/修饰符
要查找内容: 可使用正则表达式
替换为的内容: 不能使用正则表达式、但可以引用
如果”要查找的内容"部分在模式中使用分组符号:在“替换为的内容”中使用后引用
可直接引用查找模式匹配到的全部文本,使用使用&符号
修饰符:
i: 忽略大小写
:1,20s/this/This/ ----> 把1到20行中所有的小写this,替换为大写的This(默认情况下只替换了第行第一个被匹配的信息)
g: 全局替换
:1,20s/this/This/G ----> 把1到20行中所有的小写this,替换为大写的This
/ : 此符号是分割符号、可以替换为其它的分割符号、例如@
:%s@\<t\([[:aplpha:]]\+\)\>@T\1@g ---> 把全文中所有的的t替换为T
:%s@\<t\[[:aplpha::]]\+\>@&er@g ---> 把所有以t开头的字符都增加一个er
练习:
1. 复制/etc/grub2.cfg 文件到/tmp ,用查找替换命令删除文件中以空白字符开头的行的行首字符
:%s@^[[:space:]]+\@@
2. 复制/etc/rc.d/init.d/function 到/tmp, 用查找命令替换文件中的每个以空白字符开头的行、行首加上#
:%s@^[[:space:]]\+@#&@g
:%s@^[[:space:]]\+[^[:space:]]@#&@g
3. 为/etc/grub2.cfg 文件前三行加上#号
:1,3@^[[:space:]]\+@#&@g
4. 将/etc/yum.repos.d/centos-Base.repo 文件所有的enable=0替换为enable=1,所有的gpgcheck=1 替换为gpgcheck=0
:%s@\(enable\|gpgcheck\)=0@\1=1@g
#### vim 多文件功能
:next----> 下一个文件
:prev ---- 上一个文件
: last ----切换到最后一个文件
: first ---切换到第一个文件
退出所有文件
:wqall 保存所有文件并退出
:wall 保存所有文件
多窗口:
-o: 水平分割窗口
-O: 垂直分割窗口
ctrl + w 加向下或者向上窗口
设置行号:
set nu
set nonu
括号匹配
set showmatch or set sm
set nosm
自动缩进
set ai
set unai
搜索高亮
set hlsearch
set nohlsearch
语法高亮:
syntax on
syntax off
### bash 算术运算格式
算术运算
let sum = $num1 + $num2
$[算术运算表达式]
$((算术运算表达式))
- 点赞
- 收藏
- 关注作者
评论(0)