vim操作:
在磁盘上进行操作
保存退出:
ZZ 保存退出 ZQ 不保存退出
光标移动
行移动:
字符:键盘方向键(或h、l、j、k) 单词: w:下一个单词的词首 e:当前或下一单词的词尾 b:当前或前一个单词的词首
行首行尾:
^ 跳转至光标当前行行首的第一个非空白字符 0 跳转光标当前行至行首 $ 跳转光标当前行至行尾
多行跳转:
1G 或 gg 跳转到第一行 G 跳转到最后一行
段移动:
} 下一段 { 上一段
页移动:
PageDown(或Ctrl+f):下翻一屏 PageUp(或Ctrl+b):上翻一屏 H:页首 M:页中间行 L:页底
字符编辑:
x 剪切光标处的字符 #x 剪切光标处起始的#个字符 xp 交换光标所在处的字符及其后面字符的位置 ~ 转换大小写
查找:
/PATTERN:从当前光标所在处向文件尾部查找 ?PATTERN:从当前光标所在处向文件首部查找 n:表示下一个(next),与命令同方向 N:与命令反方向
删除:d (delete)
dd 删除当前光标所在行(3dd 删除光标向下3行内容) dw 删除当前光标所在位置的单词 d$(或dD) 删除当前光标所在位置至行尾的内容 dG 删除当前光标所在行至文本末尾的内容
复制:y (yank)
y 表示复制,可以在y后面使用和d命令相同,p 表示粘贴 yy 复制光标所在行,粘贴时在光标下一行;支持5yy y$ 复制光标到行尾的内容,y$粘贴时在光标所在位置;支持5y$ yG 复制当前光标所在行至文本末尾的内容
粘贴:p
p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面 P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
撤销:u
将缓冲区的数据保存到文件中并退出vim:
q:如果未修改缓冲区数据,退出 q!:取消所有对缓冲区数据的修改并退出 w filename:将文件保存到另一个文件中 wq:将缓冲区数据保存到文件中并退出 x 写入并退出 r filename 读文件内容到当前文件中 w filename 将当前文件内容写入另一个文件 !command 执行命令 r!command 读入命令的输出
光标位置:跳转光标
格式::start_pos,end_pos CMD # #具体第#行,例如2表示第2行 #,# #从左侧#表示起始行,到右侧#表示结尾行 . #当前行 $ #最后一行 .,$-1 #当前行到倒数第二行 % #全文, 相当于1,$ /pattern/ #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
光标地址选定后 + CMD: 配合上面的光标位置
d #删除 y #复制 w file #将范围内的行另存至指定文件中 r file #在指定位置插入指定文件中的所有内容
替换:
格式:s/要查找的内容/替换为的内容/修饰符 vim编辑器会跳到old第一次出现的地方,并用new来替换;可以对替换命令作一些修改来替换多处文本。
分隔符: /,#,@
修饰符:
i #忽略大小写 g #全局替换,默认情况下,每一行只替换第一次出现 gc #全局替换,每次替换前询问
示例:
:s/old/new/g:一行命令替换所有old :n,ms/old/new/g:替换行号n和m之间所有old :%s/old/new/g:替换整个文件中的所有old :%s/old/new/gc:替换整个文件中的所有old
可视化模式
主要作用:可视化复制、删除和粘贴 进入可视化模式,在普通模式下按下 可视化按键 即可 允许选择的类型: v 面向字符,-- VISUAL -- V 面向整行,-- VISUAL LINE -- ctrl + v 面向块,-- VISUAL BLOCK --
类型1: v 面向字符
用法:在普通模式下,输入v
群体:一个一个的字符 复制粘贴删除
行首插入:
类型2:V 面向整行
用法:在普通模式下,输入V
群体:一行一行的字符 复制粘贴删除
行首插入:
类型3:ctrl + v 面向块
用法:在普通模式下,输入ctrl + v
群体:一行一行的字符 复制粘贴删除
行首插入:
1、先将光标移动到指定的第一行的行首 2、输入ctrl+v 进入 可视化模式 3、向下移动光标,选中希望操作的每一行的第一个字符 4、输入大写字母 I 切换至插入模式 5、输入 # 6、按 ESC 键 两次
插入模式:
a 在光标后追加内容 A 在光标的行尾追加内容 o 在当前光标所在行的下方打开一个新行
i 在光标追处加内容 I 在行首插入 O 在当前光标所在行的上方打开一个新行 插入模式下 ESC 进入普通模式
多文件编辑:
vim FILE1 FILE2 FILE3 ... :next 下一个 :prev 前一个 :first 第一个 :last 最后一个 :wall 保存所有 :qall 不保存退出所有 :q!all 强制不保存退出所有 :wqall保存退出所有
多窗口编辑:
vim -o|-O FILE1 FILE2 ... -o: 水平或上下分割 -O: 垂直或左右分割(vim only) 窗口间切换:Ctrl+w 两次
:wall 保存所有 :qall 不保存退出所有 :q!all 强制不保存退出所有 :wqall保存退出所有
vi/vim环境定制:
显示行号:
显示:set number,简写 set nu 取消显示:set nonumber, 简写 set nonu
自动缩进:
启用:set autoindent,简写 set ai 禁用:set noai
复制保留格式: ----
启用:set paste 禁用:set nopaste
显示Tab ^I和换行符 和$显示:
启用:set list 禁用:set nolist
高亮搜索:
启用:set hlsearch 禁用:set nohlsearch 简写:nohl
语法高亮:
启用:syntax on 禁用:syntax off
更改文件格式:
启用windows格式:set fileformat=dos 启用unix格式:set fileformat=unix 简写 set ff=dos|unix
设置Tab
将Tab 设置成 空格
启用:set expandtab 默认为8个空格代替Tab 禁用:set noexpandtab 简写:set et
指定Tab 设置成 任意空格
启用:set tabstop=# 指定#个空格代替Tab 简写:set ts=4
调节代码格式:
普通模式: 向右缩进 >> 向左缩进 << 设置缩进为4个字符 set shiftwidth=4
设置光标所在行的标识线:
启用:set cursorline,简写 set cul 禁用:set nocursorline
个人环境定制:
vim定制个人用户环境 配置文件:
例如:echo vim $HOME/.vimrc 输入: set number set cul 保存退出;重新用vim编辑器打开文件,会自动加载$HOME/.vimrc里的配置
命令类型:
内部命令:
由shell自带的,通过某种命令形式提供,用户登录自动加载并常驻内存
type -a history
外部命令:
在路径下有对应的可执行文件,当执行命令时加载到内存中,执行完后清除:
type -a useradd
alias 别名命令
对于较长的命令,定义成较短的别名方便执行
查看当前shell命令:alais
定义别名:alias new_cmd='cmd'
删除别名:unalias new_cmd
删除所有:unalias -a
持久化别名配置:
vim /etc/profile
查看历史命令:history
history:查看用户历史命令
内部命令:存储在内存中,用户正常退出时刷写到文件里 ~/.bash_history
[19:28:25 root@localhost ~]# history
命令历史相关环境变量:已经在:/etc/profile中加入第四条
HISTSIZE:命令历史记录的条数 HISTFILE:指定历史文件,默认为~/.bash_history HISTFILESIZE:命令历史文件记录历史的条数 HISTTIMEFORMAT="%F %T `whoami` " 显示时间和用户 *
执行命令
:执行 内的命令
调用命令行历史命令:
重复前一个命令:
使用上方向键,并回车执行 输入 !! 并回车执行 输入 !-1 并 回车执行 # !-n:执行history历史中倒数第n个命令 # !n 执行history命令输出对应序号n的命令 按 Ctrl + p 并回车执行 # bash快捷键,例如:Curl + c
重复指定命令字符名的命令:
!string 重复前一个以“string”开头的命令 !?string 重复前一个包含string的命令 !string:p 仅打印命令历史,而不执行
表示引号里的一串字符为一个整体:
' '# 单引号:单引号内的任意字样都会被原样输出,无法使用变量、转义等操作
" "# 双引号:双引号内可以使用变量、转译、通配符,都可以进行翻译
[20:29:03 root@localhost ~]# a=1 [20:29:05 root@localhost ~]# [20:29:05 root@localhost ~]# echo '$a' $a [20:29:12 root@localhost ~]# echo "$a" 1
执行符号内的命令:
$( ) [20:30:05 root@localhost ~]# a=echo 1
[20:30:15 root@localhost ~]# echo $a
echo 1
[20:30:46 root@localhost ~]# a=$(echo 1) [20:30:53 root@localhost ~]# echo $a
1
扩展:
$[ ] # 表示计算器,只支持整数运算;b=$[10+5] 其他计算工具: bc # 支持浮点数 expr 1 + 5 # 只支持整数 ${ } # 引用变量;截取字符串
引用变量基础上,截取字符串
获取字符串长度
格式: ${#VAR} [18:05:38 root@localhost ~]# a=123 [18:05:40 root@localhost ~]# echo ${a} 123 [18:05:45 root@localhost ~]# echo ${#a} 3 [18:05:49 root@localhost ~]# a=1234 [18:05:53 root@localhost ~]# echo ${#a} 4
字符串切片
格式: ${VAR:offset} ${VAR:offset:length} 截取从 offset 个字符开始,向后 length 个字符 [18:05:49 root@localhost ~]# a=1234 [18:08:28 root@localhost ~]# echo ${a:0:1} 1 [18:08:45 root@localhost ~]# echo ${a:0:2} 12
替换字符串
${VAR:/替换的字符/替换后的字符} ${VAR://替换的字符/替换后的字符} 一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符。 [18:15:46 root@localhost ~]# a="1123 1123 1123" [18:17:37 root@localhost ~]# echo ${a/1/2} 2123 1123 1123 [18:17:39 root@localhost ~]# echo ${a/11/2} 223 1123 1123 [18:17:56 root@localhost ~]# echo ${a//11/2} 223 223 223
查找
d:通过指定路径下查找文件
工作特点:
-
查找速度略慢
-
精确查找
-
查找条件丰富
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件 处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件:
根据文件名和inode查找
常用参数: -name "文件名称" # 支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来 ** -iname "文件名称" # 不区分字母大小写 -inum n # 按inode号查找 -samefile name # 相同inode号的文件 -links n # 链接数为n的文件
范例:
find / -name "ifcfg-eth0" find / -name "ifcfg-eth0" find / -name "*.txt" find /var -name "log*"
根据文件类型查找 常用参数: -type TYPE TYPE可以是以下形式: f # 普通文件 ** d # 目录文件 ** l # 符号链接文件 s # 套接字文件 b # 块设备文件 c # 字符设备文件 p # 管道文件
范例: #查看/home的目录
find /home -type d
根据属主、属组查找
常用参数:
-user USERNAME #查找属主为指定用户(UID)的文件-group GRPNAME #查找属组为指定组(GID)的文件 -uid userID #查找属主为指定的UID号的文件 -gid GroupID #查找属组为指定的GID号的文件 -nouser #查找没有属主的文件 -nogroup #查找没有属组的文件
范例:
find / -user super find /-group tenant
根据文件大小来查找
常用参数:
-size[+|-]#UNIT #常用单位:k,M,G,c(byte),注意大小写敏感#UNIT:#表示(#-1,#],如:6k 表示(5k,6k]
-#UNIT #表示[0,#-1],如:-6k 表示[0.5k]
+#UNIT #表示(#,∞),如:+6k 表示(6k,∞) 范例:
find / -size +10G
/proc/kcore find:'/proc/25229/task/25229/fd/6’: No such file or directory find:'/proc/25229/task/25229/fdinfo/6’: No such file or directory find:'/proc/25229/fd/5’:No such file or directoryfind::'/proc/25229/fdinfo/5’:No such file or directory
[rootacentos8 ~l#ll -h /proc/kcore
-r-------- 1 root root 128T Dec 14 2020 /proc/kcore
[rootacentos8 ~l#du -sh /proc/kcore
0 /proc/kcore
文件权限:-perm 数字
find ./ -perm 600
find ./ -perm 600 -ls
指定搜索目录层级:
-maxdepth level #最大搜索目录,指定目录下为第一级
-mindepth level # 最小搜索目录
例: find /etc -mindepth 2 -maxdepth 2
排除目录:
-path 指定路径查找
-prune 若符合条件的是一个目录,则不进入目录查找
例:
#查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
find /etc -path'/etc/security'-a -prune -o -name "*.conf'
#查找/etc/下,除/etc/security和/etc/systemd,/etc/dbus-1三个目录的所有.conf后缀的文件
find /etc ( -path "/etc/security" -o -path" /etc/systemd" -o -path "/etc/dbus-1" )-a -prune -o -name "*.conf"
#排除/proc和/sys日录
find / ( -path /sys -o -path /proc ) -prune -o -type f -mmin -1 -print
空文件或目录
常用参数 -empty
find / -type d -empty
练习:构建find练习文件环境,使用find命令查找条件
mkdir {1..50}
touch {1..50}/{1..100}.log
mkdir {1..50}
是在当前目录下创建一系列从1到50的目录,每个数字代表一个子目录。
touch {1..50}/{1..100}.log` 这一行用于在每个刚刚创建的子目录下生成100个名为.log的空文本文件
find ./ -name "*.log"查找所有log文件
限制多少目录下的文件:
find ./number -name "*.log"
find ./10 -name "*.log"
最大深度下搜索
find ./ -amxdepth 1 |ls -l
逻辑组合条件:
与: -a
或:-o
非:-not
示例:
find /etc/ -type f -o -type l |wc -l
find ! -user root ! -user super -ls