vim命令:模式化的编辑器
基本模式:编辑模式,输入模式,末行模式;
模式转换:
编辑模式(默认模式) --> 输入模式;
i:insert,在光标所在处输入;
a:append,在光标所在处后方输入;
o:在光标所在处的下方打开一个新行并在行首;
I:在当前光标所在行的行首输入;
A:在光标所在行的行尾输入;
O:在光标所在处的上方打开一个新行;
输入模式 --> 编辑模式
ESC
输入模式无法直接切换到末行模式;输入模式-->编辑模式-->末行模式
编辑模式 --> 末行模式
:
set n:显示行号;
set nonu:取消行号;
10,100d:删除从第10行到第100行;
末行模式 --> 编辑模式
ESC
关闭文件:
编辑模式:ZZ:保存并退出;
末行模式:
:q 退出(仅打开文件后关闭使用)
:q!强制退出,不保存此前的编辑操作;
:wq 保存并退出;
先w再q分步输入也可;
:x 保存并退出;
:w /PATH/TO/SOMEFILE 另存为至指定文件中;
光标跳转(编辑模式):
字符间跳转
h:向左跳转一个字符;
l:向右跳转一个字符;
j:向下跳转一行;
k:向上跳转一行;
单词间跳转
w:跳转至当前至后一个单词词首;
e:跳转至当前至后一个单词词尾;
b:跳转至当前至前一个单词词首;
行首行尾跳转
^:移动到行首的第一个非空白字符;
0:移动到绝对行首;
$:移动到行尾(最后一个字符前);
行间跳转
#G:跳转至由#指定的行;
1G,gg:跳转至第一行;跳转到全文行首的第一个非空白字符;
G:跳转至最后一行;跳转到全文最后一行行首的第一个非空白字符;
ctrl+g:页面最底部出现一个状态信息行,显示的内容是当前编辑的文件名和文件中光标位置;
句间跳转
):跳转至下一句;
(:跳转至前一句;
段间跳转
}:跳转至下一段;
{:跳转至前一段;
翻屏:
ctrl+b:向文件首部翻一屏;
ctrl+f:向文件尾部翻一屏;
ctrl+u:向文件首部翻半屏;
ctrl+d:向文件尾部翻半屏;
Enter:向下一行后翻;
vim的编辑命令(编辑模式):
字符编辑:
x:删除光标所在处的一个字符;
#x:删除光标所在处后的#个字符;
xp:交换光标所在处的字符与其后面字符的位置;
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除;其实是剪切;
dd:删除光标所在处一整行;
#dd:删除光标所在处的行下面的共#行;
dw:删除光标当前至下一个单词词首;
de:删除光标当前至后一个单词词尾;
db:删除光标当前至前一个单词词首;
d$:删除光标所在处至行尾;
d0:删除光标之前至绝对行首;
d^:删除光标之前至行首第一个非空白字符;
dG:删除光标所在处至全文尾;
D:删除光标所在处至行尾;
粘贴命令:
P(大写):缓存区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至光标所在处的前方;
p(小写):缓存区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至光标所在处的后方;
复制命令:
y:复制,工作行为相似于d命令;
Y^:复制光标当前所在处至行首;
y$:复制光标当前所在处至行尾;
y0:复制光标当前所在处至行首
yy:复制光标当前所在处的一整行;
#yy:复制光标当前所在处起始及以下共#行;
ye:复制光标当前至后一个单词词尾;
#ye:复制光标当前或后#个单词词尾;
yw:复制光标当前至下一个单词词首;
#yw:复制光标当前或下#个单词词首;
yb:复制光标当前或前一个单词词首;
#yb:复制光标当前或前#个单词词首;
改变命令:可与删除中同样的动作配合使用;
编辑模式 --> 输入模式,按Back键实现删除操作;
c$:删除光标当前所在处至行尾并切换到输入模式;
c^:删除光标当前所在处至行首并切换到输入模式;
c0:删除光标前至行首并切换到输入模式;
cb:删除光标当前或前一个单词词首并切换到输入模式;
#cb:删除光标当前或前#个单词词首并切换到输入模式;
ce:删除光标当前或后一个单词词尾并切换到输入模式;
#ce:删除光标当前或后#个单词词尾并切换到输入模式;
cw:删除光标当前或下一个单词词首并切换到输入模式;
#cw:删除光标当前或下#个单词词首并切换到输入模式;
cc:删除光标所在的行,并转换为输入模式;
#cc:删除光标所在处的起始及以下共#行,并转换为输入模式;
#C:删除光标所在处的起始及以下共#行,并转换为输入模式;
可视化模式:类似用鼠标拖选;
v(小写):按字符选定;
V(大写):按行选定;
结合编辑命令使用:d(删除),c(删除并修改),y(复制)
替换命令:替换字符
r:启动替换字符,输入一个字符,替换为光标处的字符;
R:连续替换当前至后面多个字符;
撤销操作:
u:撤销一次操作;一般可撤销为50步操作;
#u:撤销#次操作;
欲撤消在一行中所做的改动,请输入:U (大写的U)
取消撤销操作:
Ctrl+r:恢复此前的撤销操作;
.:重复执行前一个编辑操作;
末行模式:可用vim内置接口,执行很多命令;
内建的命令行接口
末行模式切换到编辑模式:2次Esc键;
地址定界:
:# 直接跳转至第#行;
:. 当前行;
:$ 全文最后一行行首;
:% 全文;
:1,$ 全文;
:#,## 指定从第#行到第##行;
:#,+# 指定行范围,左侧为起始行绝对编号,右侧为相对左侧行号的偏移量;
:.,+# 当前行至下#行;
:#,$-1 第#行到倒数第二行;
:$-# 倒数第#行;
/pattern/:从光标所在处起始向文件尾部,第一次被模式所匹配到的行;
/pat1/,pat2/:从光标所在处起始,第一次由pat1匹配到的行开始,至第一次由pat2匹配到的行结束之间的所有行;
:搜索范围 w /PATH/TO/SOMEFILE:将范围内的文本保存至指定文件中;即另存为;
:搜索范围 r /PATH/FROM/SOMEFILE:将指定的文件中的文本读取并插入至指定位置;即文件合并;
例如:
:5r /root/test.txt表示将test.txt文件插入到当前文件第5行下方;
:r !COMMAND 读取外部的命令结果,到当前光标处;
例如
:r !ls:使用外部ls
:!:执行外部命令
例如
:!dir
查找
/PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配到的字符串;
?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的字符串;
n:下一个,与命令方向相同;
N:上一个,与命令方向相反;
查找并替换:根据查找条件,将其结果执行处理;
s:末行模式的命令;使用格式:
:搜索范围 s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用正则表达式;
替换为的内容:不能使用正则表达式,但可引用;
/:为命令分隔符,可随意指定特殊符号,只要不与命令冲突即可,如@、#等,否则使用/路径分隔符同命令分隔符时需要转义;
修饰符:
i:忽略大小写;
g:全局替换,意味着一行中如果匹配到多次,则均替换;如果不加全局标识,仅从光标处之后执行一次;
c:提示是否进行替换;
练习:
1、全文查找this替换成This(只替换每一行第一次匹配到的)
:%s/this/This/
2、从第1行到20行把所有this,替换成THIS;
:1,20s/this/THIS/g
3、查找时不区分大小写;
:1,20s/this/THIS/i
4、查找全文/cgroup/systemd全部替换为/etc/sysconfig;
:%s/\/cgroup\/systemd/\/etc\/sysconfig/g:/需要转义
:%s@/cgroup/systemd@/etc/sysconfig@g:@不需要转义
5、查找全文,以t开头单词,替换为T;
:%s#\#T\1#g
6、查找所有以t开头的单词,后面加上er;
:%s#\#&er#g
7、删除开头为#的行;
:%s@^#@@
bash脚本编程之算术运算:
算术运算符:
+,-
*,/
%:取余;
**:次方;
算术运算格式:
(1)let VAR=算术表达式;放在VAR变量中以便引用;
例如:let a=$num1+$num2;
(2)VAR=$[算术表达式];可单独使用,不用赋值变量;
例如:c=$[$num1+$num2]
或:echo $[$num1+$num2]
(3)VAR=$((算术表达式))
例如:echo $(($num1+$num2))
用法:
num1=3
num2=67
let a=$num1+$num2
echo $a
结果是70
c=$[$num1+$num2]
echo $[$num1+$num2]
echo $(($num1+$num2))
expr $num1 + $num2:是个命令;
d=$(expr $num1 + $num2):要通过命令引用赋值给变量后才能赋值给变量;
$d
d=$(expr $num1 \* $num2)
bash脚本编程之逻辑运算:主要操作的是命令的运行状态结果即退出码;
可认为有一种判断的机制在里面;判断取决于是与运算还是或运算还取决于第一个操作的结果;
运算数:true(1),false(0)
COMMAND运行状态结果:
0:TRUE,成功;
1-255:FALSE,错误;
与:见false(0)为false(0);相当于乘法;
true && true = true
true && false = false
第一个操作数为true,其结果取决于第二个操作数;
false && true = false
false && false = false
第一个操作数为false,其结果至此可判定为false;
用法:
~]# ls /var && cat /etc/fstab
~]# lls /var && cat /etc/fstab:不执行第二个操作
或:见true(1)为true(1);相当于加法;
true || true = true
true || false = true
第一个操作数为true,其结果至此可判定为ture;
false || true = true
false || false = false
第一个操作数为false,其结果取决于第二个操作数;
用法:
~]# id hive || useradd hive:如果用户不存在,则添加用户;
非:取反
! true = false
! fase = true
用法:
~]# ! id hive && useradd hive:如果用户不存在,则添加用户;
优先级:非 (高)<--与 <--或(低)
脚本练习:
1、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中
[root@centos7 ~]#vim /bin/backup.sh
!/bin/bash
description: backup etc dir
today=date +%F-%T
echo "starting backup"
cp -av /etc/ /root/etc$today
echo "backup is finished"
unset today
[root@centos7 bin]#cd /bin
[root@centos7 bin]#chmod +x backup.sh
[root@centos7 bin]#bash -x backup.sh
[root@centos7 bin]#cd
[root@centos7 ~]#ls
aaa Documents f2 linux-4.18.13 Public
anaconda-ks.cfg Downloads filenJv linux-4.18.13.tar.xz teasong1.wav
backup_etc.sh dpt hello.c linux.txt Templates
cat etc2019-05-30-15:31:46 //成功
2、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统
nologin.sh:
[root@centos7 bin]#vim nologin.sh
!/bin/bash
[ -f /etc/nologin ] && echo "already can not access"||(touch /etc/nologin && echo "create /etc/nologin success")
login.sh:
[root@centos7 bin]#vim login.sh
!/bin/bash
[ -f /etc/nologin ] && (rm -f /etc/nologin;echo " delete /etc/nologin success") || echo "already can access"
[root@centos7 bin]#chmod +x nologin.sh
[root@centos7 bin]#bash -n nologin.sh //检查语法有无错误
[root@centos7 bin]#bash -x nologin.sh //执行脚本
- '[' -f /etc/nologin ']'
- touch /etc/nologin
- echo 'create /etc/nologin success'
create /etc/nologin success
[root@centos7 bin]#./nologin.sh
already can not access
[root@centos7 bin]#chmod +x login.sh
[root@centos7 bin]#bash -n login.sh
[root@centos7 bin]#./login.sh
delete /etc/nologin success
[root@centos7 bin]#./login.sh
already can access
[root@centos7 bin]#
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
[root@centos7 bin]#vim disk.sh
!/bin/bash
echo MAX=df | sed -nr '/^\/dev\/sd/s/.* ([0-9]+%).*/\1/p'|sort -nr |head -n1
~
~
"disk.sh" [New] 12L, 423C written
[root@centos7 bin]#chmod +x disk.sh
[root@centos7 bin]#bash -n disk.sh
[root@centos7 bin]#disk.sh
MAX=18%
[root@centos7 bin]#