@[TOC](开发、部署系统环境 - Linux 环境(ubuntu))
现在部署服务器系统很多都在使用 linux 环境,和 windows 差距很大,尤其是纯命令行的服务器版。linux 的命令行和 windows 的命令行也不一样。看了网上介绍,大多数推荐 ubuntu 或 centos,不过因为个人学习使用,再加上 centos 不再进行维护,所以选择了 ubuntu 的服务器版。
个人使用的是 windows 系统,使用 VMware 来安装 linux 系统。
安装 VMware,完成后创建虚拟机。然后加载系统镜像,安装系统。
如果需要手动配置 ipv4,需要注意的是 subnet 填入网关ip使用子网,格式为 ip/子网。nameserver 即是 dns。
需要注意的是,安装时候会要求选择镜像地址,改成阿里云的 Ubuntu 镜像地址
http://mirrors.aliyun.com/ubuntu
当安装完成后会有提示,之后就可以重启了。用虚拟机会有个报错,意思是无法移除安装介质,这时候可以不管,之后在 VMware 里移除。
重启完成后,会提示用户登录,用户名和密码都在安装时进行了设置(注意用户名是 nick name),输入正确后就进入了服务器。
然后可以输入一些指令查看安装信息
lsb_release -a 查看系统版本
ip addr 查看ip地址
输入命令
sudo apt-get install openssh-server
可能会暂停,有提示,直接 Y。安装完成后可以输入命令查看是否成功
ps -e |grep ssh
dpkg -l | grep ssh
如果有 openssh-server 就是成功了,此时使用自己的 ssh 工具登录即可。如果没有,则需要开启 ssh 服务
/etc/init.d/ssh start
$ sudo passwd root # 给 root 用户添加密码
[sudo] password for dummy: # 此处需输入普通用户的登录密码
New password: # 此处输入 root 用户的登录密码(新设置密码)
Retype new password: # 此处再次输入 root 用户的登录密码(确认与上面的密码输入一致)
passwd: password updated successfully # 创建完成 root 用户
$ su root # 切换为 root
Password: # 此处输入上面设置的 root 用户登录密码,回车即可登录至 root 用户
# exit # 退出登录 root 用户,回到普通用户登录态
然后可以开启 root 用户的 ssh 登录许可
# 打开ssh服务配置文件所在的文件夹
cd /etc/ssh/
# 使用vim编辑器对配置文件进行编辑
# vim的基本使用方法(按字母“i”进入编辑模式,按ESC退出编辑模式,“:wq”保存退出)
vim sshd_config
进入后按 i 进入编辑模式,然后找到 # port 22 改为 port 22 (将 # 去掉),再找到 #PermitRootLogin prohibit-password,改为 PermitRootLogin yes,然后按 ESC退出编辑模式,再输入 :wq
保存退出。
最后重启 ssh 服务
service sshd restart
都直到 ubuntu 换成国内的源会快很多,但是 docker 的原生 ubuntu 镜像运行的容器连 vi 都没有,需要换源只能手动进行了。需注意的是,源的版本需要和 ubuntu 版本一致,这里版本指的不是版本号,而是 codename 代码版本,可以通过 lsb_release -a
来查看
codename 里显示的就是代码版本了。在换的源中间可以指定代码版本,例如我的就是 focal。docker 原生的 ubuntu 连 lsb_release
都没有,可以使用 apt install lsb-release
来安装,或直接换 focal 的源。
rm /etc/apt/sources.list # 删除默认的源文件
# 也可以重命名源文件,以做备份
# mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 添加 163 的镜像源
echo "deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse" >/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
# 添加阿里云的镜像
echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" >/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
# 添加清华源
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse" >/etc/apt/sources.list
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
# 添加中科大源
echo "deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse" >/etc/apt/sources.list
echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
如果 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区。NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量,因此配置一个 NTP 对时间进行同步并不能解决时区不正确的问题。所以在用了国外云计算服务商如 Microsoft Azure 或其它 VPS、虚拟机时,需要注意是否与中国大陆的时区一致。
# 查看当前系统时间
date
# 获取/修改当前系统时区 TZ 值,会引导用户一步一步进行区域选择
tzselect
# linux 是一个多用户系统,每个用户都可以设置自己的时区
export TZ='Asia/Shanghai'
# 执行完成之后需要重新登录系统或刷新 ~/.bashrc 生效。
source ~/.bashrc
# 要更改 Linux 系统整个系统范围的时区
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
如果 Linux 系统使用 Systemd,还可以使用 timedatectl 命令来更改 Linux 系统范围的时区。在 Systemd 下有一个名为 systemd-timedated 的系统服务负责调整系统时钟和时区,可以使用 timedatectl 命令对此系统服务进行配置。
timedatectl set-timezone 'Asia/Shanghai'
ubuntu 使用的防火墙名为UFW(Uncomplicated Fire Wall),是一个iptable的管理工具。常用命令如下:
命令 | 说明 |
---|---|
ufw status | 查看防火墙状态,inactive是关闭,active是开启 |
ufw status verbose | 查看防火墙详细信息 |
ufw disable | 关闭防火墙 |
ufw enable | 开启防火墙,开启防火墙的状态下,只有系统允许的端口才能被其他主机访问。 |
ufw reload | 重启防火墙 |
ufw allow 端口号 | 开放指定端口号 |
ufw delete allow 端口号 | 关闭指定端口 |
ufw deny 端口号 | 不允许访问指定端口号 |
ufw激活后的默认的策略是允许出去,不允许流量进来,这个可以在ufw的配置文件中看到。在配置文件/etc/default/ufw
中可以看到DEFAULT_OUTPUT_POLICY="ACCEPT"
,如果需要端口可以出去,则需要自己配置。
可以通过ufw的命令来直接修改端口规则。
ufw allow port_number/protocol
ufw配置了一些特定的端口的规则,可以直接用。
ufw allow http #允许http连接
ufw deny http #阻止http连接
这些特定的端口定义在文件/etc/services
中,也可以自己配置端口的规则。
ufw allow 2222/tcp #允许2222端口的TCP
ufw allow 2222/udp #允许2222端口的UDP
ufw deny 2222/tcp #阻止2222端口的TCP
ufw deny 2222/udp #阻止2222端口的UDP
如果不带有TCP或者UDP,则默认两种都可以。
ufw allow 2222 #允许2222端口的连接
ufw deny 2222 #阻止2222端口的连接
如果要配置一组连续的端口,则可以这样。
ufw allow 2200:2222/tcp #允许2200到2222端口的TCP
ufw deny 2200:2222/tcp #阻止2200到2222端口的UDP
可以设置特定的IP可以连接过来。
ufw allow from xx.xx.xx.xx to any port 2222 #允许特定IP通过端口2222
ufw deny from xx.xx.xx.xx to any port 2222 #阻止特定IP通过端口2222
还可以设置特定的子网连接
ufw allow from xx.xx.xx.xx/24 #允许特定子网连接
ufw deny from xx.xx.xx.xx/24 #阻止特定子网连接
默认的规则都是进,我们可以通过in
和out
配置。
ufw allow in 2222 #允许2222端口的流量进来
ufw deny in 2222 #阻止2222端口的流量进来
ufw allow out 2222 #允许2222端口的流量出去
ufw deny out 2222 #阻止2222端口的流量出去
删除有两种方式。通过在规则前面加上delete删除规则。
ufw delete allow 2222/tcp #删除 allow 2222/tcp这条规则
还有一种方法是通过查看规则序列号来删除。
ufw status numbered
#执行后的接结果
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 8080/tcp ALLOW IN Anywhere
ufw delete 3 #删除第三条规则。
需注意的是,UFW(iptables)规则的匹配基于规则出现的顺序,一旦匹配某个规则,检查便会停止。因此,如果某个规则允许访问TCP端口22(如使用udo ufw allow 22),后面另一个规则指示拦截某个IP地址(如使用 ufw deny proto tcp from 202.54.1.1 to any port 22)。最终,允许访问TCP端口22的规则会被使用,而后一个拦截黑客IP地址 202.54.1.1 却没有被使用。这都是由于规则的顺序造成的。为避免这类问题,
你需要编辑 /etc/ufw/before.rules
文件,在"# End required lines"之后使用"Block spammers"添加规则。配置完后需要重新加载 ufw reload
。
另外 ufw 是 iptables 的管理工具,一些应用服务会自动添加规则到 iptables 里(例如 docker),这些在 ufw 是不显示的,可以使用 iptables -L
来查看。
查看当前使用的 ip 地址
# 查看所有使用的 ip 地址,会有多个,包括虚拟ip。一般名称以 ens 开头的是物理网卡
ip addr
# 查看网卡信息,会有很多 Ip 信息
ifconfig -a
使用命令行修改 ip 地址(重启可能会失效)
# 静态 ip
ifconfig 网卡名 ip地址 netmask 子网掩码
# 动态 ip
dhclient -r
dhclient 网卡名
修改配置文件的方式重启不会失效,但是配置文件根据系统的不同所在路径位置不一样。例如 ubuntu 系统 17.10 之前是在 /etc/network/interfaces
,而之后则更改为 /etc/netplan/*.yaml(此文件名也不统一,但都是 .yaml 文件)
。格式为(注:# 是为了注释,修改此文件时不能添加),注意格式缩进严格对齐,每个冒号后面有空格,然后才是内容。
network: #网络
version: 2 #版本
renderer: NetworkManager #渲染器
ethernets: #以太网
ens33: # 网卡名称,可以使用 ifconfig 查看
addresses: [192.168.1.10/24] # ip 地址,必须有方括号
dhcp4: no
dhcp6: no
routes:
- to: default
via: 192.168.1.1 #网关
nameservers: #域名服务器
addresses: [192.168.1.1,114.114.114.114]
如果使用 dhcp 则是:
network:
ethernets:
ens33:
dhcp4: true
version: 2
修改完成后,输入命令,让配置生效
netplan apply
当初始安装完成后,如果使用最简化安装,则连 ping 的工具都没有,需要安装 ping 包。
apt install iputils-ping
还可以安装 vim,这个是文本编辑器
apt -y install vim
在普通用户中,使用此类指令,需要在前面添加 sudo,表示使用管理员执行。但是 linux 出于安全的考虑,使用 sudo 来执行一个程序时,会在一个新的、最小化的环境中执行,也就是说环境变量在 sudo 命令下被重置成默认状态了。所以当一个初始化的环境变量中不包含所要运行的程序所在目录,用 sudo 去执行,会得到 ‘command not found’ 的错误。
这时有2个办法来解决:
vi /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
编辑完成后,按 “ESC” 键切换为命令行模式,输入 “: wq” 保存并退出。linux 系统的命令基本都遵循这个格式:
命令名称 [命令参数] [命令对象]
使用 ls -l 命令可以查看各个文件详细信息,如果文件是可执行文件,则在权限栏里有 x 权限。执行此文件使用命令
./可执行文件名
linux 用户分为普通用户和超级管理员用户,当安装系统时询问创建的用户是普通用户,登录后第一次切换超级管理员 root 时会提示创建账户和密码。之后可以根据需要创建普通用户和管理员用户。
普通用户指令符是 $ ,而管理员指令符是 # 。除了超级管理员 root 的用户目录是 /root 外,其他用户的用户目录在 /home 下。
可以使用 service 命令进行服务操作
service 软件名称 start
service 软件名称 stop
service 软件名称 status
也可以使用更强大的命令 systemctl 启动服务
systemctl start 软件名称
systemctl stop 软件名称
systemctl restart 软件名称
systemctl status 软件名称
systemctl enable 软件名称
systemctl disable 软件名称
enable / disable 是控制软件是否开机启动
可以在路径 /etc/systemd/system/
目录下,创建一个服务文件,例如创建 django.service
文件,并添加以下内容:
[Unit]
Description=My Django Service
After=network.target
[Service]
User=<用户名>
Group=<用户组>
WorkingDirectory=<Django项目目录>
ExecStart=<Python解释器路径> <Django项目目录>/manage.py runserver 0.0.0.0:8000
[Install]
WantedBy=multi-user.target
替换<用户名>
、<用户组>(可以使用 groups 用户名 来获取)
、
和
为实际的用户名称、组、项目路径和Python解释器路径。然后就可以启动服务了。
sudo systemctl enable django.service
sudo systemctl start django.service
可以根据进程号 PID 来关闭进程
命令 &
在后台执行命令或任务进程
kill 进程号
可以添加参数 -9 强制关闭进程
ps
查看进程,可以添加参数 -ef 查看更多信息
jobs
查看后台运行或停止的任务进程
fg / bg
前后台转换,可以将一个任务转换为前台 / 后台,参数为 jobs 命令查看的任务编号前加 %
例如 jobs 查看到 redis-server & 任务编号为1,则可以使用 fg %1 转为前台任务。当转为前台时会占用交互界面,可以使用 ctrl + z 挂起任务,通过交互界面再用命令 bg %1 重新转为后台执行
top
相当于 windows 的任务管理器,可以查看进程运行状况和占用资源,按 q 退出
: 输出重定向,可以将输出结果重定向到另外的地方,例如文本文件。
: 追加输出重定向,同 > 类似,进行追加
yum(黄狗 CentOS的包管理工具) / rpm(红帽的包管理工具) / apt(ubuntu的包管理工具)。
三个工具的使用方法类似,只是系统不同使用的包安装工具不同。
yum search 包名称 : 搜索是否有软件包可以安装
yum install 包名称 : 安装软件包(根据索引)
yum remove 包名称 : 卸载软件
yum update : 更新包管理工具索引
yum upgrade : 根据索引更新现有软件
yum dist-upgrade : 更新系统版本
yum info 包名称 : 查看软件信息
yum list --installed : 查看安装的软件
gcc / make
下载软件源码,一般是 tar 文件,表示打包的文件(有些是 tar.gz 之类的,是将打包文件压缩了,可以先解压为 tar 文件)。可以使用 tar -xvf 来将打包文件解包为文件夹。
如果文件夹下有 Makefile 文件,则可以使用 make 将源代码构建为可执行程序。
make && make install
如果安装过程报错,说明缺少其他支持软件,可以使用包管理工具安装补充。
在用户目录下,有个隐藏文件 .bash_profile (如果没有可以使用 touch .bash_profile 来创建 ),存储的就是环境变量信息。可以使用 vim 来编辑此文件修改环境变量。环境变量写在 PATH=
之后,由冒号分隔。例如
PATH=$PATH:$HOME\bin:/usr/local/python37/bin
export PATH
注意配置完成后需要执行一下激活环境变量
source .bash_profile
linux 可以创建链接,链接分软硬两种。
区别在于硬链接会创建实体,实体引用了源文件(但是并不生产副本,不占用空间),对任意硬链接实体操作相当于操作源文件。但即使删除了源文件,只要硬链接存在源文件就会存在。
而软链接类似于快捷方式,不会创建实体。可以通过软链接使用源链接或源文件。
例如
ln -s /usr/local/python37/bin/python3 /usr/bin/python3
可以给常用命令起别名,来简化操作。例如经常使用长格式查看当前目录文件,可以起别名进行简化
alias ll='ls -l'
或者使用 unalias 来取消别名
unalias ll
可以在 linux 系统中直接进行网络连接,传送下载文件等操作。
ssh 命令可以进行远程访问连接,格式为
ssh 用户名@主机IP
如果使用的是安全连接,则会询问是否接收证书
连接上会询问登录密码,输入后就成功登录了。
scp 可以通过 ssh 创建安全连接复制文件到远程计算机,格式为
scp 源文件路径 用户名@主机IP:目标文件绝对路径
例如
scp code/example01.py hellokitty@114.114.114.114:/home/hellokitty
然后输入密码就发送了。
另外 scp 支持 -r 递归复制文件夹
sftp 用户名@主机IP
如果使用的是安全连接,则会询问是否接收证书
连接上会询问登录密码,输入后就成功登录了。登录类型是 sftp。如果需要退出使用命令 quit 或 bye。
可以使用 lls 命令查看本地文件,使用 lcd 切换本地文件夹。使用 ls、pwd、cd 等命令操作远端文件。
使用 put 将文件推送至远端,使用 get 获取远端文件。
ping 命令和 windows 下的 ping 一样,可以用来检测网络的可达性。不同的是 linux 的 ping 不中断会一直 ping 。
netstat -ntap
n 是以数值方式显示ip地址,a 是所有,p 是显示进程信息
vim 是 linux 上最简单的命令行文本编辑器,可以编辑纯文本文件。
vim 文件路径
如果没有参数,则创建空文件
vim 是命令行文本编辑器,进入 vim 后处于命令模式,可以使用快捷键、快捷命令。如果需要编辑内容,按 i / a 可以进入编辑模式,此时左下角出现 – INSERT --。可以按 ESC 键退出编辑模式,进入命令模式。
在命令模式,输入冒号 (😃 则可以进入末行模式,输入一些指令。输入内容显示在左下角,例如退出当前窗口是 :q
,退出 vim 不保存是 :qa!
。输入回车则进入命令模式。
命令模式下直接输入可执行的快捷命令就是快捷命令,例如删除行为 dd
,删除100行是 100dd
。快捷命令会出现在右下角。
100dd
300G
移动到300行10h
左移10 列10l
右移10 列10j
下移10 行10k
上移10 行10yy
从光标所在行复制10行10p
粘贴10次一些按键组合和特殊按键组成了快捷键,例如 ESC 可以退出当前模式。
每次使用 vim 还需要重新设置缩进、标尺、行号等,十分麻烦。可以创建配置文件,将这些配置记录下来,每次打开 vim 自动加载。
首先进入用户目录,然后创建文件 .vimrc,这是一个隐藏文件。然后使用 vim 编辑此文件
cd ~
touch .vimrc
vim vimrc
进入编辑模式,输入内容
set nu
syntax on
set ts=4
set expandtab
set autoindent
set ruler
set nohls
然后保存退出,就记录了默认配置了。
当使用 vim 同时打开多个文件编辑时,每次只能看到一个文件,但是可以在各文件中进行切换。
vim test1.txt test2.txt test3.txt
在末行模式中,输入 ls 就能够查看当前打开的文档及其编号了。在末行模式输入 b + 空格 + 编号,例如 b 2
就能切换到第2个文件。
可以在末行模式中,输入 vs 将屏幕垂直分成2部分,或输入 sp 将屏幕水平分成2部分。此时按两下 ctrl + w 可以切换分屏。在某个分屏中可以切换成其他文件。
可以在末行模式中, 输入 q! 关闭当前窗口。
在使用 vim 打开2个以上的文件时,添加参数 -d 则进入比对模式
vim -d test1.txt test2.txt
比对模式会直接分屏显示,且将文件不同的地方高亮标出,在编辑时左右也会进行联动。
在文件编辑中,由于断线等原因意外退出,再次连接后,如果重新进行编辑会有提示,当前文件的临时文件(隐藏的.swp文件)存在,可以使用 O 打开只读,E 直接编辑,R 恢复文件,D 删除,Q 退出,A 终止。
注意的是,恢复等操作完成后,这个临时文件可能还存在,需要手动删除,否则还会提示。
当一个操作需要经常重复,则可以录制为宏,方便重复使用
在命令模式,使用快捷命令 q 再加一个字母或数字,例如 a ,则可以进行宏的录制,此时左下角显示 recording。
例如录制个每行行首输入 # 加空格 (python 中的注释此行),然后移动到下一行,则可以挨个进行操作:在命令模式按0将光标移动到行首,进入编辑模式输入 # 和空格,退出到命令模式下移一行。
当宏录制完成后,在命令模式再次按 q 结束录制,则录制好了名称为 ‘a’ 的宏了,这个 a 就是录制时 q 后跟的字母。
使用宏时,在命令模式输入快捷命令: 重复次数 + @ + 宏名。例如 4@a ,就将宏 a 重复了4遍。
命令模式下,输入斜杠(/) 加查找内容,可以从光标位置,自上向下的查找输入的内容,问号是自下向上查找。此时按小写的 n 为顺序搜索,按大写的 N 是逆序搜索。
如果需要替换,则进入末行模式,先输入替换范围,例如从第一行到最后一行(1,$);然后输入 s 表示替换;之后是查找需要替换的字符,例如替换 0(/0);再后是替换的内容,用斜杠和之前内容分隔,例如1000(/1000);之后加斜杠后可以添加其他参数,例如 c 表示需要确认,i 表示忽略大小写,g 表示全局模式(否则每行只查找替换一次),e 表示忽略错误继续查找替换。之后就开始查找替换了,每次查找后会询问是否替换,可以点 y / n。
: 1,$s/0/1000/cge
另外 vim 的搜索和替换是支持正则的。