编辑器 - vim
-
启动vim。可以通过
vi
或vim
命令来启动vim,启动时可以指定文件名来打开一个文件,如果没有指定文件名,也可以在保存的时候指定文件名。[root ~]# vim guess.py
-
命令模式、编辑模式和末行模式:启动vim进入的是命令模式(也称为Normal模式),在命令模式下输入英文字母
i
会进入编辑模式(Insert模式),屏幕下方出现-- INSERT --
提示;在编辑模式下按下Esc
会回到命令模式,此时如果输入英文:
会进入末行模式,在末行模式下输入q!
可以在不保存当前工作的情况下强行退出vim;在命令模式下输入v
会进入可视模式(Visual模式),可以用光标选择一个区域再完成对应的操作。 -
保存和退出vim:在命令模式下输入
:
进入末行模式,输入wq
可以实现保存退出;如果想放弃编辑的内容输入q!
强行退出,这一点刚才已经提到过了;在命令模式下也可以直接输入ZZ
实现保存退出。如果只想保存文件不退出,那么可以在末行模式下输入w
;可以在w
后面输入空格再指定要保存的文件名。 -
光标操作。
- 在命令模式下可以通过
h
、j
、k
、l
来控制光标向左、下、上、右的方向移动,可以在字母前输入数字来表示移动的距离,例如:10h
表示向左移动10个字符。 - 在命令模式下可以通过
Ctrl+y
和Ctrl+e
来实现向上、向下滚动一行文本的操作,可以通过Ctrl+f
和Ctrl+b
来实现向前和向后翻页的操作。 - 在命令模式下可以通过输入英文字母
G
将光标移到文件的末尾,可以通过gg
将光标移到文件的开始,也可以通过在G
前输入数字来将光标移动到指定的行。
- 在命令模式下可以通过
-
文本操作。
- 删除:在命令模式下可以用
dd
来删除整行;可以在dd
前加数字来指定删除的行数;可以用d$
来实现删除从光标处删到行尾的操作,也可以通过d0
来实现从光标处删到行首的操作;如果想删除一个单词,可以使用dw
;如果要删除全文,可以在输入:%d
(其中:
用来从命令模式进入末行模式)。 - 复制和粘贴:在命令模式下可以用
yy
来复制整行;可以在yy
前加数字来指定复制的行数;可以通过p
将复制的内容粘贴到光标所在的地方。 - 撤销和恢复:在命令模式下输入
u
可以撤销之前的操作;通过Ctrl+r
可以恢复被撤销的操作。 - 对内容进行排序:在命令模式下输入
%!sort
。
- 删除:在命令模式下可以用
-
查找和替换。
- 查找操作需要输入
/
进入末行模式并提供正则表达式来匹配与之对应的内容,例如:/doc.*\.
,输入n
来向前搜索,也可以输入N
来向后搜索。 - 替换操作需要输入
:
进入末行模式并指定搜索的范围、正则表达式以及替换后的内容和匹配选项,例如::1,$s/doc.*/hello/gice
,其中:g
- global:全局匹配。i
- ignore case:忽略大小写匹配。c
- confirm:替换时需要确认。e
- error:忽略错误。
- 查找操作需要输入
-
参数设定:在输入
:
进入末行模式后可以对vim进行设定。-
设置Tab键的空格数:
set ts=4
-
设置显示/不显示行号:
set nu
/set nonu
-
设置启用/关闭高亮语法:
syntax on
/syntax off
-
设置显示标尺(光标所在的行和列):
set ruler
-
设置启用/关闭搜索结果高亮:
set hls
/set nohls
说明:如果希望上面的这些设定在每次启动vim时都能自动生效,需要将这些设定写到用户主目录下的.vimrc文件中。
-
-
高级技巧
-
比较多个文件。
[root ~]# vim -d foo.txt bar.txt
-
打开多个文件。
[root ~]# vim foo.txt bar.txt hello.txt
启动vim后只有一个窗口显示的是foo.txt,可以在末行模式中输入
ls
查看到打开的三个文件,也可以在末行模式中输入b <num>
来显示另一个文件,例如可以用:b 2
将bar.txt显示出来,可以用:b 3
将hello.txt显示出来。 -
拆分和切换窗口。
可以在末行模式中输入
sp
或vs
来实现对窗口的水平或垂直拆分,这样我们就可以同时打开多个编辑窗口,通过按两次Ctrl+w
就可以实现编辑窗口的切换,在一个窗口中执行退出操作只会关闭对应的窗口,其他的窗口继续保留。 -
映射快捷键:在vim下可以将一些常用操作映射为快捷键来提升工作效率。
-
例子1:在命令模式下输入
F4
执行从第一行开始删除10000行代码的操作。:map <F4> gg10000dd
。例子2:在编辑模式下输入
__main
直接补全为if __name__ == '__main__':
。:inoremap __main if __name__ == '__main__':
说明:上面例子2的
inoremap
中的i
表示映射的键在编辑模式使用,nore
表示不要递归,这一点非常重要,否则如果键对应的内容中又出现键本身,就会引发递归(相当于进入了死循环)。如果希望映射的快捷键每次启动vim时都能生效,需要将映射写到用户主目录下的.vimrc文件中。 -
-
录制宏。
-
在命令模式下输入
qa
开始录制宏(其中a
是寄存器的名字,也可以是其他英文字母或0-9的数字)。 -
执行你的操作(光标操作、编辑操作等),这些操作都会被录制下来。
-
如果录制的操作已经完成了,按
q
结束录制。 -
通过
@a
(a
是刚才使用的寄存器的名字)播放宏,如果要多次执行宏可以在前面加数字,例如100@a
表示将宏播放100次。 -
可以试一试下面的例子来体验录制宏的操作,该例子来源于Harttle Land网站,该网站上提供了很多关于vim的使用技巧,有兴趣的可以了解一下。
-
-
软件安装和配置
使用包管理工具
- yum - Yellowdog Updater Modified。
yum search
:搜索软件包,例如yum search nginx
。yum list installed
:列出已经安装的软件包,例如yum list installed | grep zlib
。yum install
:安装软件包,例如yum install nginx
。yum remove
:删除软件包,例如yum remove nginx
。yum update
:更新软件包,例如yum update
可以更新所有软件包,而yum update tar
只会更新tar。yum check-update
:检查有哪些可以更新的软件包。yum info
:显示软件包的相关信息,例如yum info nginx
。
- rpm - Redhat Package Manager。
- 安装软件包:
rpm -ivh <packagename>.rpm
。 - 移除软件包:
rpm -e <packagename>
。 - 查询软件包:
rpm -qa
,例如可以用rpm -qa | grep mysql
来检查是否安装了MySQL相关的软件包。
- 安装软件包:
下面以Nginx为例,演示如何使用yum安装软件。
[root ~]# yum -y install nginx
...
Installed:
nginx.x86_64 1:1.12.2-2.el7
Dependency Installed:
nginx-all-modules.noarch 1:1.12.2-2.el7
nginx-mod-http-geoip.x86_64 1:1.12.2-2.el7
nginx-mod-http-image-filter.x86_64 1:1.12.2-2.el7
nginx-mod-http-perl.x86_64 1:1.12.2-2.el7
nginx-mod-http-xslt-filter.x86_64 1:1.12.2-2.el7
nginx-mod-mail.x86_64 1:1.12.2-2.el7
nginx-mod-stream.x86_64 1:1.12.2-2.el7
Complete!
[root ~]# yum info nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name : nginx
Arch : x86_64
Epoch : 1
Version : 1.12.2
Release : 2.el7
Size : 1.5 M
Repo : installed
From repo : epel
Summary : A high performance web server and reverse proxy server
URL : http://nginx.org/
License : BSD
Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
: IMAP protocols, with a strong focus on high concurrency, performance and low
: memory usage.
[root ~]# nginx -v
nginx version: nginx/1.12.2
移除Nginx。
[root ~]# yum -y remove nginx
下面以MySQL为例,演示如何使用rpm安装软件。要安装MySQL需要先到MySQL官方网站下载对应的RPM文件,当然要选择和你使用的Linux系统对应的版本。MySQL现在是Oracle公司旗下的产品,在MySQL被收购后,MySQL的作者重新制作了一个MySQL的分支MariaDB,可以通过yum进行安装。
[root mysql]# ls
mysql-community-client-5.7.22-1.el7.x86_64.rpm
mysql-community-common-5.7.22-1.el7.x86_64.rpm
mysql-community-libs-5.7.22-1.el7.x86_64.rpm
mysql-community-server-5.7.22-1.el7.x86_64.rpm
[root mysql]# yum -y remove mariadb-libs
[root mysql]# yum -y install libaio
[root mysql]#rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
...
[root mysql]#rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
...
[root mysql]#rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
...
[root mysql]#rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
...
说明:由于MySQL和MariaDB的底层依赖库是有冲突的,所以上面我们首先用
yum
移除了名为mariadb-libs的依赖库并安装了名为libaio支持异步I/O操作的依赖库。关于MySQL和MariaDB之间的关系,可以阅读维基百科上关于MariaDB的介绍。
移除安装的MySQL。
[root ~]# rpm -qa | grep mysql | xargs rpm -e
下载解压配置环境变量
下面以安装MongoDB为例,演示这类软件应该如何安装。
[root ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
--2018-06-21 18:32:53-- https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
Resolving fastdl.mongodb.org (fastdl.mongodb.org)... 52.85.83.16, 52.85.83.228, 52.85.83.186, ...
Connecting to fastdl.mongodb.org (fastdl.mongodb.org)|52.85.83.16|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 100564462 (96M) [application/x-gzip]
Saving to: ‘mongodb-linux-x86_64-rhel70-3.6.5.tgz’
100%[==================================================>] 100,564,462 630KB/s in 2m 9s
2018-06-21 18:35:04 (760 KB/s) - ‘mongodb-linux-x86_64-rhel70-3.6.5.tgz’ saved [100564462/100564462]
[root ~]# gunzip mongodb-linux-x86_64-rhel70-3.6.5.tgz
[root ~]# tar -xvf mongodb-linux-x86_64-rhel70-3.6.5.tar
mongodb-linux-x86_64-rhel70-3.6.5/README
mongodb-linux-x86_64-rhel70-3.6.5/THIRD-PARTY-NOTICES
mongodb-linux-x86_64-rhel70-3.6.5/MPL-2
mongodb-linux-x86_64-rhel70-3.6.5/GNU-AGPL-3.0
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongodump
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongorestore
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoexport
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoimport
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongostat
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongotop
mongodb-linux-x86_64-rhel70-3.6.5/bin/bsondump
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongofiles
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoreplay
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoperf
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongod
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongos
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongo
mongodb-linux-x86_64-rhel70-3.6.5/bin/install_compass
[root ~]# vim .bash_profile
...
PATH=$PATH:$HOME/bin:$HOME/mongodb-linux-x86_64-rhel70-3.6.5/bin
export PATH
...
[root ~]# source .bash_profile
[root ~]# mongod --version
db version v3.6.5
git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
distmod: rhel70
distarch: x86_64
target_arch: x86_64
[root ~]# mongo --version
MongoDB shell version v3.6.5
git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
distmod: rhel70
distarch: x86_64
target_arch: x86_64
说明:当然也可以通过yum来安装MongoDB,具体可以参照官方网站上给出的说明。
源代码构建安装
-
安装Python 3.6。
[root ~]# yum install gcc [root ~]# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz [root ~]# gunzip Python-3.6.5.tgz [root ~]# tar -xvf Python-3.6.5.tar [root ~]# cd Python-3.6.5 [root ~]# ./configure --prefix=/usr/local/python36 --enable-optimizations [root ~]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel [root ~]# make && make install ... [root ~]# ln -s /usr/local/python36/bin/python3.6 /usr/bin/python3 [root ~]# python3 --version Python 3.6.5 [root ~]# python3 -m pip install -U pip [root ~]# pip3 --version
说明:上面在安装好Python之后还需要注册PATH环境变量,将Python安装路径下bin文件夹的绝对路径注册到PATH环境变量中。注册环境变量可以修改用户主目录下的.bash_profile或者/etc目录下的profile文件,二者的区别在于前者相当于是用户环境变量,而后者相当于是系统环境变量。
-
安装Redis-3.2.12。
[root ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz [root ~]# gunzip redis-3.2.12.tar.gz [root ~]# tar -xvf redis-3.2.12.tar [root ~]# cd redis-3.2.12 [root ~]# make && make install [root ~]# redis-server --version Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=5bc5cd3c03d6ceb6 [root ~]# redis-cli --version redis-cli 3.2.12
配置服务
我们可以Linux系统下安装和配置各种服务,也就是说我们可以把Linux系统打造成数据库服务器、Web服务器、缓存服务器、文件服务器、消息队列服务器等等。Linux下的大多数服务都被设置为守护进程(驻留在系统后台运行,但不会因为服务还在运行而导致Linux无法停止运行),所以我们安装的服务通常名字后面都有一个字母d
,它是英文单词daemon
的缩写,例如:防火墙服务叫firewalld,我们之前安装的MySQL服务叫mysqld,Apache服务器叫httpd等。在安装好服务之后,可以使用systemctl
命令或service
命令来完成对服务的启动、停止等操作,具体操作如下所示。
-
启动防火墙服务。
[root ~]# systemctl start firewalld
-
终止防火墙服务。
[root ~]# systemctl stop firewalld
-
重启防火墙服务。
[root ~]# systemctl restart firewalld
-
查看防火墙服务状态。
[root ~]# systemctl status firewalld
-
设置/禁用防火墙服务开机自启。
[root ~]# systemctl enable firewalld Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service. Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service. [root ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
计划任务
-
在指定的时间执行命令。
- at - 将任务排队,在指定的时间执行。
- atq - 查看待执行的任务队列。
- atrm - 从队列中删除待执行的任务。
指定3天以后下午5点要执行的任务。
[root ~]# at 5pm+3days at> rm -f /root/*.html at> <EOT> job 9 at Wed Jun 5 17:00:00 2019
查看待执行的任务队列。
[root ~]# atq 9 Wed Jun 5 17:00:00 2019 a root
从队列中删除指定的任务。
[root ~]$ atrm 9
-
计划任务表 - crontab。
[root ~]# crontab -e * * * * * echo "hello, world!" >> /root/hello.txt 59 23 * * * rm -f /root/*.log
说明:输入
crontab -e
命令会打开vim来编辑Cron表达式并指定触发的任务,上面我们定制了两个计划任务,一个是每分钟向/root目录下的hello.txt中追加输出hello, world!
;另一个是每天23时59分执行删除/root目录下以log为后缀名的文件。如果不知道Cron表达式如何书写,可以参照/etc/crontab文件中的提示(下面会讲到)或者用搜索引擎找一下“Cron表达式在线生成器”来生成Cron表达式。和crontab相关的文件在
/etc
目录下,通过修改/etc
目录下的crontab文件也能够定制计划任务。[root ~]# cd /etc [root etc]# ls -l | grep cron -rw-------. 1 root root 541 Aug 3 2017 anacrontab drwxr-xr-x. 2 root root 4096 Mar 27 11:56 cron.d drwxr-xr-x. 2 root root 4096 Mar 27 11:51 cron.daily -rw-------. 1 root root 0 Aug 3 2017 cron.deny drwxr-xr-x. 2 root root 4096 Mar 27 11:50 cron.hourly drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.monthly -rw-r--r-- 1 root root 493 Jun 23 15:09 crontab drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.weekly [root etc]# vim crontab 1 SHELL=/bin/bash 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 3 MAILTO=root 4 5 # For details see man 4 crontabs 6 7 # Example of job definition: 8 # .---------------- minute (0 - 59) 9 # | .------------- hour (0 - 23) 10 # | | .---------- day of month (1 - 31) 11 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 12 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 13 # | | | | | 14 # * * * * * user-name command to be executed