vim编辑器
vim [options] [file ..]
+#:打开文件后,让光标停在第#行的行首
+/PATTERN:打开文件后,直接让光标处于第一个被PATTER匹配到的行的行首
+:打开文件后,光标直接停在文件尾部的行首
vim [options] -
vim [options] -t tag
vim [options] -q [errorfile]
ex
view
gvim gview
rvim rview rgvim rgview
*
模式转换:
*
编辑模式---->输入模式
i:insert,在光标所在处输入
a:append,在光标所在处后面输入
o:在光标所在行的下方打开一个新行
I:在当前光标所在行的行首输入
A:在当前光标所在行的行尾输入
O:在当前所在行的上方打开一个新行
c:
C:
*
输入模式--->编辑模式
ESC
*
编辑模式--->末行模式
:
*
末行模式--->编辑模式
ESC
*
关闭文件:
:q 退出
:q! 强制退出,丢弃所做的修改
:wq 保存退出
:x 保存退出
:w /PATH/TO/SOMEHERE
ZZ 保存退出
*
光标跳转:
*
字符间跳转:
h j k l 左右上下
*
#COMMAND:跳转有指定的个数的字符;
*
单词间跳转:
w:下一个单词的词首
e:当前或下一个单词的词尾
b:当前或前一个单词的词首
*
行首行尾跳转:
^:跳转至行首的第一个非空白字符
0:跳转至行首
$:跳转至行尾
*
行间移动:
#G:跳转至由#指定行
G:跳转至最后一行
1G,gg:第一行
*
句间移动:
(
)
*
段落间移动
{
}
*
字符编辑:
x:删除光标处的字符
#x:删除光标所在处起始的#个字符
xp:交换光标所在处的字符及其后面字符的位置
*
替换命令(r)
r:替换光标所在处的字符
删除命令:
d:删除命令 ,可结合光标跳转字符,实现范围删除
d$:删除光标
d^:
d0:
dw
de
db
#COMMAND
dd:表示删除光标所在的行
#COMMAND :多行删除
D:
删除的内容一般保存在缓冲区
粘贴命令(鹏,putpaste):
p:缓冲区存的如果为整行,则粘贴在光标所在行的下方;否则,则粘贴在光标所在处的后面
P:缓冲区存的如果为整行,则粘贴在光标所在行的上方;否则,则粘贴在光标所在处的后面
复制命令(以,yank)
y:复制,工作行为类似于d命令
y$
Y
y^
y0
ye
yw
yb
#COMMAND
yy复制行
#yy复制多行
改变命令(存,change)
c:修改
编辑模式--->输入模式
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除并输入新内容
#cc:删除多行并输入新内容
可视化模式:
v:按字符选定
V:按行选定
note:经常结合编辑命令
d,c,y
撤销此前的编辑
u(undo)撤销此前的操作
#u:撤销指定次数的操作
撤销此前的撤销
Ctrl+r
重复前一个编辑操作:
.
翻屏操作:
Ctrl+f:向文件尾部翻一屏
Ctrl+b:向文件首部翻一屏
Ctrl+d:向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
vim自带的l练习 教程
vimtutor
vim中的末行模式:
内建的命令行接口
(1)地址定界:
:start_pos,end_pos
#:具体第#行
#,#:从左侧#表示行起始,到右侧#行表示行结尾
#+#:从左侧#表示行起始,加上右侧#行表示行结尾
.:当前行
$:最后一行
.,$-1
%:全文,相当于1,$
/part1/,/part2/,
从第一次被part匹配的行开始,一直到第一次被part2匹配的行结束
#,/part/
/part/,$
使用方式:
后跟一个编辑命令
y
w /PATH/TO/SOMEHERE:将范围的行另存至指定文件中
r /PATH/FROM/SOMEFILE:在指定位置插入指定文件中的所有内容
(2)查找
/ PATTERN:从光标所在处向文件尾部查找
?PATTERN:从光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
(3)查找并替换
s:在末行模式下完成查找替换操作
s/要查找的内容/替换的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,单可以使用\1,\2,...等后向引用符号;还可以使用&引用前面查找是查找时的整个内容
i:忽略大小写
g:全局替换;默认情况下,每一行只替换第一次出现
查找替换中的分隔符/可替换为其他字符,例如
s@@@
s###
多文件模式:
vim FILE1 FILE2 FILE3 ....
:next下一个
:prev前一个
:first第一个
:last最后一个
:q退出当前
:wall 保存所有
:qall退出所有
窗口分割模式:
vim -o | -O FILE1 FILE2...
-o水平分割
-O垂直分割
Ctrl+w ,Arrow
单文件窗口分割:
Ctrl+w,s:split,水平分割
Ctrl+w,v:vertical,垂直分割
定制vim的工作特色
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
末行:当前vim有效
(1)行号:
显示:set number ,简写为set nu
取消显示:set nonumber,简写为set nonu
(2)括号匹配
匹配:set showmatch 简写为set sm
取消:set nosm
(3)自动缩进
启用:set ai
禁用:ste noai
(4)高亮搜索
启用:set hlsearch
禁用:set 弄hlsearch
(5)语法高亮
启用:syntax on
禁用:syntax off
(6)忽略字符的大小写
启用:set ic
不忽略:set noic
正则表达式
grep:Global search REgular expression and Print out the line。
作用:文本搜索工具,根据用户指定的模式,对目标文本逐行进行匹配检查,打印匹配到的行
模式:有正则表达式字符及文本字符所编写的过滤条件
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能。
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
egerp,grep -E,支持扩展表达式
把模式套到文本上检查文本的匹配与否的软件程序,成为正则表达式引擎
基本正则表达式元字符
1.字符匹配:
.:匹配任意单个字符
[]:指定范围内任意单个字符
[^]:指定范围外的单个字符
2.匹配次数:用作指定次数的字符后面,用于指定指定前面的字符出现的次数
*:匹配前面的字符任意次
.*:任意长度的任意字符
\?:匹配前面的字符0或1次,即前面的可有可无
\+:匹配前面的字符至少一次
\{m\}:任意字符出现的m次
\{m,n}:至少m次,至多n次
贪婪模式:能匹配到多少就匹配多少
3.位置指定:用于指定的字符出现的位置
^:行首锚定,最左侧
$:行位锚定,最右侧
^PATERN$:用于模式匹配整行
^$:空行:
\< ,\b :词首锚定,用于单词模式的左侧
\>,\b:词尾锚定,用于单词模式的右侧
\<PATTERN>:匹配整个单词
分组:
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
分组括号中模式所匹配的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为\1,\2,\3,...
\1:从左侧起,第一个左括号以与之匹配右括号之间的模式匹配到字符
后向引用:引用前面分组的括号中的模式所匹配到的字符 ,而非模式本身
egrep及扩展的正则表达式
扩展的正则表达式元字符:
次数匹配:
?:匹配前面的字符0或1次,即前面的可有可无
+:匹配前面的字符至少一次
{m\}:任意字符出现的m次
{m,n}:至少m次,至多n次
分组:()
后向引用:\1,\2,\3,...
或者:a|b
(C|c)at :Cat或cat
fgrep:不支持正则表达式搜索,直接搜索
shell脚本初步
逻辑运算: 布尔型 true,false
与 或 非 亦或(相同为假,不同为真)
短路运算:与:有一个为0,结果必为0
第一个为0,结果为0
第一个为1,第二个必须参与运算
或 有一个为1,结果为1
第一个为1,结果为1
第一个为0,第二个必须参与运算
脚本须符合shebang机制 即 #!/bin/bash
大部分情况下,脚本需要加执行权行才可以运行 chmod+x XXX.sh
可以有四种方法运行脚本 #管道的方法,吧脚本传给bash
#吧文件路径添加到PATH变量里
#加执行权限,用绝对路径或相对路径发
#bash 加脚本 #不需要有执行权限
#source加脚本 #不需要执行权限
#bash 是相当于开启一个子进程执行脚本,source相当于在当前进程执行脚本
#相对来讲bash更安全一些,source容易修改当前的变量
#在修改配置文件的时候才建议使用source执行脚本
脚本的常见错误 #语法错误 语法出错后续行不会继续执行
#逻辑错误 系统判断不出逻辑错误
#命令错误 命令出错会继续执行后续行命令
可以用 bash -n 检查语法错误
#只是检查脚本中的语法,并不执行脚本
可以用 bash -x 检查命令执行过程 #逐行执行,并显示执行过程
#执行脚本并逐行显示执行的过程
变量可已存放命令比如
HAHA=date
[root@21:22:24 ~]145# $HAHA
Thu Apr 2 21:22:30 CST 2020
变量可以是很多种方式比如 : NAME=li
NAME=`whoami`
NAME=$USER
NAME=/etc/*
NAME="wang
li
zhao
qian"
$_存放的是前一个命令的最后一个参数
$-存放系统的关键字
$$是自己当前shell的PID
$PPID是父进程的ID
注意区别:
HAHA=`seq 5`
[root@13:27:59 ~]71# echo $HAHA
1 2 3 4 5
[root@13:28:04 ~]72# echo $"HAHA"
HAHA
[root@13:28:10 ~]73# echo "$HAHA"
1
2
3
4
5
注意区别:
[root@13:35:33 ~]77# QQQ=123
[root@13:35:41 ~]78# WWW=$QQQ
[root@13:35:48 ~]79# echo $QQQ
123
[root@13:35:52 ~]80# echo $WWW
123
[root@13:35:57 ~]81# QQQ=456
[root@13:36:05 ~]82# echo $QQQ
456
[root@13:36:07 ~]83# echo $WWW
123
[root@13:36:20 ~]86# unset QQQ
[root@13:36:32 ~]87# echo $QQQ
[root@13:36:33 ~]88# echo $WWW
123
为什么因为变量里的"="是赋值的意思不是等于号的意思,WWW的值赋值给了$QQQ也就是123,所以$QQQ改变凉了$WWW也是123,即使变量$QQQ被删除,也不会影响$WWW的值!
数字不可以作为变量名# 1=haha echo$1
下划线可以作为变量名称,下划线不可以作为主机名
横线可以作为主机名,横线不可以做为变量名
#echo $NAME_$AGE
#20
#echo ${NAME}_$AGE
#mage_20
普通变量无法在子进程或父进程使用 只能在当前终端使用 #脚本调用脚本也不继承
在自身进程里的变量优先级高于父进程的变量(如果重名的话)
export 可以声明环境变量 #
# export HAHA=baba
或者 # HAHA=baba # export HAHA
true 返回一个成功状态码
false返回一个错误状态码
set查看所有变量
set --清空位置变量
set -o 查看一些set的参数 #set -o xxx=on/off
set -e 当脚本中有一条命令出错后,就会停止执行脚本(只针对命令?)
set -u 如果脚本中存在没定义的变量,则不允许运行脚本
env即可查看所有的环境变量
readonly定义只读变量 exit当前窗口即可删除只读变量 只读变量只对当前窗口有效
位置变量 $0 $1 $2 $@ $*
#$0表示自身(命令和路径)
#$!表示第一个参数 $2表示第二个参数 $45表示第45个参数
#$@ 表示全部参数 #如果存在嵌套脚本,"$@"表示全部的独立参数
#$*表示全部参数 #如果存在嵌套脚本,"$*"表示把全部的参数当成一个参数
# $#显示本脚本参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
注意:如果想表示$45变量需要把45括起来,否则显示成$4加上字符5 #${45}才能表示出来
$?状态码 (只能查询上一条的执行结果)
#0表示上一条命令执行成功
#1-255表示执行失败
echo $?
0
print 相当于高级版本的echo #个人感觉用处不大
bash运算
let
$[] echo -e "\e[1;$[RANDOM%7+31]mhello world\e[0m" #实现随机颜色
$(())
expr # expr 2 \* 3 3 - 1 #只能取整数,且不支持浮点数
$( arg1 arg2 arg3 )
echo xxx |bc
与或非
与或非 true是1 false是0
$?里 1是上个命令执行失败 0是执行成功
变量互换
# i=10;j=20;k=$i;i=$j;j=$k;echo $i $j
i=20;j=10
# i=10;j=20:i=$[ij];j=[ij];i=[i^j];echo %i $j
i=20;j=
###异或三次可以实现两个值互换,就不需要第个那样的传统方法了
脚本
比较的命令:
test # test -a xxx
[] # [ $I -eq $Q ]
[[]] #支持正则表达式跟通配符 #[[ 条件 =~ 正则]] [[ 条件 == 通配符 ]]
#注意需要转义 # [[ $FILE =~ \.log$ ]] (匹配.log结尾的文件)
#注意是匹配的扩展正则表达式
数值判断: (只能用于数字判断)
# -eq 等于
# -ne 不等于
# -gt 大于
# -ge 大于等于
# -lt 小于
# -le 小于等于
# $SRT1 = $STR2 判断字符串是否相等(内容)
# $SRT1 != $STR2 判断字符串是否不等(内容)
字符串测试:
# = 是否字符串两边相等
# != 是否字符串两边不等
# == 用于[[]]匹配通配符模式
# =~ 用于[[]]匹配正则表达式
状态判断:
# -v 判断变量是否存在,(空也被判定为true)#(-R 也是判断变量是否存在,空则反馈false)
# -a 判断文件是否存在
# -b 判断是不是块文件
# -c 判断是不是字符文件
# -d 判断是不是文件夹
# -e 判断文件是否存在
# -f 判断是不是普通文件
# -z 字符串是空 (没定义或者是空值)
# -n 字符串非空
# -s 判断存在且大小大于0
# -h 判断是不是软链接
# -L 判断是不是软链接
# (判断软链接时,判断的是软链接指向的文件,如指向的件 是普通文件,则判定为普通文件)
权限判读:
# -r 判断文件是否有r权限
# -w 判断文件是否有w权限
# -x 判断文件是否有x权限
# [ -x "aa.txt" ] 判断aa.txt文件是不是又x权限
# 根据实际权限来判定,不见得是LL看见的文件权限
# () 开启一个子进程并执行()里的内容 #()里的变量不影响当前进程变量
#()可已继承父进程变量
# {} 不开启子进程,在当前进程执行{}里的内容 #{}里的变量影响当前进程变量
#(){}都可以将多个命令组合到一起执行,但结果不同
组合写法:[]
# -a 并且
# [ -f "$FILE" -a -x "$FILE" ] # $FILE文件是否是普通文件,并且具有执行权限 #条件全部满足就反馈true
# -o 或
# [ -f "$FILE" -o -x "$FILE" ] # $FILE文件是否是普通文件,或者$FILE是否具有执行权限 #满足一个条件就反馈true
# ! 取反
# ! [ -d /etc] echo $? 1
# [ ! -d /etc ] 两种写法都一样
# -a -o 只支持[]写法 [[]]不支持此写法
组合写法: && ||
# && 短路与 # id wang &> /dev/null && echo " $ID exits "
# || 短路或
比较[[]]的注意事项
在比较时[] | [[]] 内必须要有空格,如没有,则会被判定为变量赋值
为避免在[] | [[]] 是出现错误,建议在[] | [[]] 左侧变量加上""
# 在 [[ $"XX" == 通配符 ]] 右侧通配符加""只代表 ""里的内容本身,不带有其他含义
# 或者[[ "$XX" == 通配符]] 只想作为内容本身,也可以转义
来源:https://www.cnblogs.com/tongsheng/p/12640483.html