Linux
# Linux基础
# 前言
平日的学习过程中,接触的比较多的是代码和window系统,而当系统需要去部署,或者要去修改已经部署的项目的时候,这时候就会用到Linux,基本上系统运维都是在Linux上进行的,所以对Linux一些基本的目录结构和语法熟悉,是非常必要的。本次整个文档都是在腾讯云上进行学习的,模拟一个最真实的环境。
# 操作系统
操作系统(operating system,简称OS)是管理计算机硬件 (opens new window)与软件 (opens new window)资源的计算机程序 (opens new window)。操作系统需要处理如管理与配置 (opens new window)内存 (opens new window)、决定系统资源 (opens new window)供需的优先次序、控制输入设备 (opens new window)与输出设备 (opens new window)、操作网络与管理文件系统 (opens new window)等基本事务。操作系统也提供一个让用户与系统交互 (opens new window)的操作界面。
# 什么是Linux
Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU (opens new window)的操作系统。伴随着互联网 (opens new window)的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式 (opens new window)系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。
# Linux的优势
稳定且有效率;
免费(或少许费用);
漏洞少且快速修补;
多任务多用户;
更加安全的用户与文件权限策略;
适合小内核程序的嵌入系统;
相对不耗资源。
# Shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell
- Bourne Again Shell
- C Shell
- K Shell
- Shell for Root
- ……
其中 Bash 是目前最常用的 Shell
。
# 命令
进入命令行环境以后,用户会看到 Shell
的提示符。提示符往往是一串前缀,最后以一个美元符号 $
结尾,用户可以在这个符号后面输入各种命令。
在终端输入pwd
,得到以下:
root
:表示用户名VM-8-5-centos
: 表示主机名~
:表示目前所在目录为家目录 ,其中root
用户的家目录是/root
普通用户的家目录在/home
下#
: 目前所拥有的权限,其中root
用户为#
,普通用户为$
- 执行
whoami
命令可以查看当前用户名 - 执行
hostname
命令可以查看当前主机名
# 命令的快捷方式
在开始学习 Linux
命令之前,有这么一些快捷方式,是必须要提前掌握的,它将贯穿整个 Linux
使用生涯。
- 通过上下方向键 ↑ ↓ 来调取过往执行过的
Linux
命令 - 命令或参数仅需输入前几位就可以用
Tab
键补全 Ctrl + R
:用于查找使用过的命令(history
命令用于列出之前使用过的所有命令,然后输入!
命令加上编号(!2
)就可以直接执行该历史命令)Ctrl + L
:清除屏幕并将当前行移到页面顶部Ctrl + C
:中止当前正在执行的命令Ctrl + U
:从光标位置剪切到行首Ctrl + K
:从光标位置剪切到行尾Ctrl + W
:剪切光标左侧的一个单词Ctrl + Y
:粘贴Ctrl + U | K | Y
剪切的命令Ctrl + A
:光标跳到命令行的开头Ctrl + E
:光标跳到命令行的结尾Ctrl + D
:关闭Shell
会话
# Linux目录结构
# 文件的组织
目录 | 作用 |
---|---|
/bin | 表示二进制文件,bin目录包含了会被所有用户使用的可执行程序 |
/boot | 包含与Linux启动密切相关的文件 |
/dev | device的缩写,表示设备,它里面的子目录,每一个目录对应一个外设 |
/etc | 包含系统的配置文件 |
/home | 用户的私人目录 |
/lib | library的缩写,表示库、包含被程序所调用的库文件 |
/media | 媒体 |
/mnt | mount的缩写,表示挂载 |
/opt | 表示可选的应用软件包,用户安装第三方软件和插件 |
/root | 超级用户的家目录 |
/sbin | system binary的缩写,表示系统二进制文件,包含系统级的重要可执行程序 |
/srv | service的缩写,表示服务,包含一些网络服务启动之后所需要的数据 |
/tmp | temporary的缩写,表示临时的,普通用户和程序存放临时文件的地方 |
/usr | unix software resource的缩写,是最庞大的目录之一,安装了大部分用户要调用的程序 |
/var | variable的缩写,表示动态的,通常包含程序的数据,比如log文件 |
# 查看路径
# pwd
显示当前目录的路径
# pwd
# which
查看命令的可执行文件所在路径, Linux
下,每一条命令其实都对应一个可执行程序,在终端中输入命令,按回车的时候,就是执行了对应的那个程序, which
命令本身对应的程序也存在于 Linux
中。
# which java
# 游览和切换目录
# ls
列出文件和目录,它是 Linux
最常用的命令之一。
# ls -a
常用参数
-a
显示所有文件和目录包括隐藏的-l
显示详细列表-h
适合人类阅读的-t
按文件最近一次修改时间排序-i
显示文件的inode
(inode
是文件内容的标识)
# cd
cd
是英语 change directory
的缩写,表示切换目录。
# cd home
- cd / : 跳转到根目录
- cd ~ : 跳转到家目录
- cd .. : 跳转到上级目录
- cd ./home : 跳转到当前目录的home目录下
- cd /home/lion : 跳转到根目录下的home目录下的lion目录
- cd : 不添加任何参数,也是回到家目录
# du
列举目录大小信息。
# du -a
常用参数
-h
适合人类阅读的;-a
同时列举出目录下文件的大小信息;-s
只显示总计大小,不显示具体信息。
# 游览和创建文件
# cat
一次性显示文件所有内容,更适合查看小的文件。
# cat mysqld.log -n
常用参数
-n
显示行号。
# less
分页显示文件内容,更适合查看大的文件。
# less mysqld.log -n
【快捷操作】
- 空格键:前进一页(一个屏幕);
b
键:后退一页;- 回车键:前进一行;
y
键:后退一行;- 上下键:回退或前进一行;
d
键:前进半页;u
键:后退半页;q
键:停止读取文件,中止less
命令;=
键:显示当前页面的内容是文件中的第几行到第几行以及一些其它关于本页内容的详细信息;h
键:显示帮助文档;/
键:进入搜索模式后,按n
键跳到一个符合项目,按N
键跳到上一个符合项目,同时也可以输入正则表达式匹配。
# head
显示文件的开头几行(默认是10行)
# head mysqld.log
【参数】
-n
指定行数head cloud-init.log -n 2
# tail
显示文件的结尾几行(默认是10行)
# tail mysqld.log
-n
指定行数tail cloud-init.log -n 2
-f
会每过1秒检查下文件是否有更新内容,也可以用-s
参数指定间隔时间tail -f -s 4 xxx.log
# touch
创建一个文件
# touch new_file
# mkdir
创建一个目录
# mkdir wxx
常用参数
-p
递归的创建目录结构mkdir -p one/two/three
# 文件的复制和移动
# cp
拷贝文件和目录
# cp new_file wxx
- cp file file_copy: 将 file 文件移动到 one 目录下
- cp file one: 把 file 文件拷贝到 one 目录下,并且文件名依然为 file
- cp file one/file_copy: 把 file 文件拷贝到 one 目录下,文件名为file_copy
- cp *.txt folder: 把当前目录下所有 txt 文件拷贝到 folder 目录下
# mv
移动(重命名)文件或目录,与cp命令用法相似。
# mv wxx menu
# 文件的删除和链接
# rm
删除文件和目录
删除文件
# rm wxx
删除目录
# rm -rf menu
常用参数
-i
向用户确认是否删除;-f
文件强制删除;-r
递归删除文件夹,著名的删除操作rm -rf
。
# ln
Linux
文件的存储方式分为3个部分,文件名、文件内容以及权限,其中文件名的列表是存储在硬盘的其它地方和文件内容是分开存放的,每个文件名通过 inode
标识绑定到文件内容。
相当于文件名只是一扇门,门里面有什么我们不知道,我们通过inode这个表示打开这扇门,才能看到文件的内容。
Linux 下有两种链接类型:硬链接和软链接。
# 用户与权限
# 用户
Linux
是一个多用户的操作系统。在 Linux
中,理论上来说,我们可以创建无数个用户,但是这些用户是被划分到不同的群组里面的,有一个用户,名叫 root
,是一个很特殊的用户,它是超级用户,拥有最高权限。
自己创建的用户是有限权限的用户,这样大大提高了 Linux
系统的安全性,有效防止误操作或是病毒攻击,但是我们执行的某些命令需要更高权限时可以使用 sudo
命令。
# sudo
以 root
身份运行命令
# useradd + passwd
useradd
添加新用户passwd
修改用户密码
# su
# su wxx
切换用户,需要 root
用户权限
# userdel
# userdel wxx
删除用户,需要 root
用户权限
- userdel wxx : 只会删除用户,不会删除/home中对应的文件夹
- userdel wxx -r : 不管删除用户,还会删除/home中对应的文件夹
# 群组的管理
Linux
中每个用户都属于一个特定的群组,如果你不设置用户的群组,默认会创建一个和它的用户名一样的群组,并且把用户划归到这个群组。
# groupadd
创建群组。
# groupadd wxxmembers
# groupdel
删除一个已存在的群组
# groupdel wxxmembers
# groups
查看用户所在群组
# groups wxx
# usermod
用户修改用户的账号
常用参数
-l
对用户重命名。需要注意的是/home
中的用户家目录的名字不会改变,需要手动修改。-g
修改用户所在的群组,例如usermod -g friends lion
修改lion
用户的群组为friends
。-G
一次性让用户添加多个群组,例如usermod -G friends,foo,bar lion
。-a
-G
会让你离开原先的群组,如果你不想这样做的话,就得再添加-a
参数,意味着append
追加的意思。
# chgrp
用户修改文件的群组
# chgrp wxx wxx.txt
wxx.txt的群组修改为wxx
# chown
改变文件的所有者,需要root
身份才能运行。
# chown root wxx.txt
把其他用户创建的wxx.txt转让给root用户
# 文件权限管理
# chmod
修改访问权限
# chmod 740 wxx.txt
现在我在wxx目录下创建了一个文件www.txt
和一个目录menu
可以看到www.txt
前面的是-rw-r--r--
,而menu前面的是 drwxr-xr-x
其中 drwxr-xr-x
表示文件或目录的权限。让我们一起来解读它具体代表什么?
d
:表示目录,就是说这是一个目录,普通文件是-
,链接是l
。r
:read
表示文件可读。w
:write
表示文件可写,一般有写的权限,就有删除的权限。x
:execute
表示文件可执行。-
:表示没有相应权限。
而在第一个字母之后,每三个字母表示一个群体
rwx
:对应所有者r-x
: 对应群组用户r-x
: 对应其他用户
现在再来理解这句权限 drwxr-xr-x
的意思:
- 它是一个文件夹;
- 它的所有者具有:读、写、执行权限
- 它的群组用户具有:读、执行的权限,没有写的权限
- 它的其它用户具有:读、执行的权限,没有写的权限。
那么我们的740,其中7对应所有者的权限,4对应群组用户的权限,0对应其他用户的权限。
而具体7表示所有者有什么权限呢?
# 权限的理解
权限 | 数字 |
---|---|
r | 4 |
w | 2 |
x | 1 |
现在我们来分析一下我们的740:
7 = 4 + 2 + 1 :那么我们的所有者有rwx的权限,就是读、写、执行权限
4 = 4 + 0 + 0 :那么我们的群组用户有r--的权限,就是读的权限
0 = 0 + 0 + 0 :那么我们的其他用户就没有权限
对应文字权限为:-rw-r-----
# 查找文件
# locate
搜索包含关键字的所有文件和目录。后接需要查找的文件名,也可以用正则表达式。由于这个不是Linux系统自带的,需要进行安装,这里不过多介绍。
yum -y install mlocate
# find
用于查找文件,它会去遍历你的实际硬盘进行查找,而且它允许我们对每个找到的文件进行后续操作,功能非常强大。
# find / -name wxx.txt
- find -name "wxx.txt" : 当前目录和子目录通过名称进行查找
- find . -name "wxx.txt" : 当前目录和子目录通过名称进行查找
- find / name "wxx.txt" : 整个硬盘查找
- find /home/wxx -name "wxx.txt" : 指定目录去查找
- find /home/wxx -name "wxx*" : 指定目录去查找wxx01、wxx02...等文件
- find /home/wxx -name "*wxx*" : 指定目录去查找包含wxx的文件
# 文本操作
# grep
全局搜索一个正则表达式,并且打印到屏幕。简单来说就是,在文件中查找关键字,并显示关键字所在行。
# ls -l|grep wxx.txt
常用参数
-i
忽略大小写,grep -i path /etc/profile
-n
显示行号,grep -n path /etc/profile
-v
只显示搜索文本不在的那些行,grep -v path /etc/profile
-r
递归查找,grep -r hello /etc
,Linux 中还有一个 rgrep 命令,作用相当于grep -r
# sort
对文件的行进行排序。
创建一个简单的文件,随便打上几个字母:
# sort abc.txt
常用参数
-o
将排序后的文件写入新文件,sort -o name_sorted.txt name.txt
;-r
倒序排序,sort -r name.txt
;-R
随机排序,sort -R name.txt
;-n
对数字进行排序,默认是把数字识别成字符串的,因此 138 会排在 25 前面,如果添加了-n
数字排序的话,则 25 会在 138 前面。
# wc
word count
的缩写,用于文件的统计。它可以统计单词数目、行数、字符数,字节数等。
# wc abc.txt
这里有几个数字:
- 第一个数字6 : 表示行数
- 第二个数字6 : 表示单词数
- 第三个数字12 : 表示字节数
常用参数
-l
只统计行数,wc -l name.txt
;-w
只统计单词数,wc -w name.txt
;-c
只统计字节数,wc -c name.txt
;-m
只统计字符数,wc -m name.txt
。
# uniq
删除文件中的重复内容。
# uniq abc.txt
常用参数
-c
统计重复行数,uniq -c name.txt
;-d
只显示重复的行数,uniq -d name.txt
。
# cut
剪切文件的一部分内容
cut -c 2-4 name.txt # 剪切每一行第二到第四个字符
常用参数
-d
用于指定用什么分隔符(比如逗号、分号、双引号等等)cut -d , name.txt
;-f
表示剪切下用分隔符分割的哪一块或哪几块区域,cut -d , -f 1 name.txt
。
# 查看和管理进程
# w
帮助我们快速了解系统中目前有哪些用户登录着,以及他们在干什么。
# w
# ps
用于显示当前系统中的进程, ps
命令显示的进程列表不会随时间而更新,是静态的,是运行 ps
命令那个时刻的状态或者说是一个进程快照。
# ps
常用参数
-ef
列出所有进程;-efH
以乔木状列举出所有进程;-u
列出此用户运行的进程;-aux
通过CPU
和内存使用来过滤进程ps -aux | less
;-aux --sort -pcpu
按CPU
使用降序排列,-aux --sort -pmem
表示按内存使用降序排列;-axjf
以树形结构显示进程,ps -axjf
它和pstree
效果类似。
# top
获取进程的动态列表。
# top
# kill
结束一个进程, kill + PID
。
# systemd
systemd
是一个 Linux
系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1
并负责启动其它程序。
# 文件压缩解压
- 打包 : 是将多个文件变成一个总的文件,它的学名叫存档、归档。
- 压缩 : 是将一个大文件(通常指归档)压缩变成一个小文件。
我们常常使用 tar
将多个文件归档为一个总的文件,称为 archive
。 然后用 gzip
或 bzip2
命令将 archive
压缩为更小的文件。
# tar
创建一个 tar
归档。
# tar -cvf archive.tar abc.txt wxx.txt
常用参数
-cvf
表示create
(创建)+verbose
(细节)+file
(文件),创建归档文件并显示操作细节;-tf
显示归档里的内容,并不解开归档;-rvf
追加文件到归档,tar -rvf archive.tar file.txt
;-xvf
解开归档,tar -xvf archive.tar
。
# gzip/gunzip
“压缩/解压”归档,默认用 gzip
命令,压缩后的文件后缀名为 .tar.gz
。
# gzip archive.tar
# gunzip archive.tar.gz
# tar 归档+压缩
可以用 tar
命令同时完成归档和压缩的操作,就是给 tar
命令多加一个选项参数,使之完成归档操作后,还是调用 gzip
或 bzip2
命令来完成压缩操作。
# tar -zcvf archive02.tar.gz abc.txt wxx.txt
# zcat、zless、zmore
压缩文件的内容通过zcat、zless、zmore
进行查看。
# zcat archive02.tar.gz
# zip/unzip
“压缩/解压” zip
文件( zip
压缩文件一般来自 windows
操作系统)。
# Vim编辑器
# Vim是什么
Vim
是从 vi
发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs
并列成为类 Unix
系统用户最喜欢的编辑器。
# Vim常用模式
- 交互模式
- 插入模式
- 命令模式
- 可实模式
# 交互模式
也成为正常模式,这是 Vim
的默认模式,每次运行 Vim
程序的时候,就会进入这个模式。
例如执行 vim name.txt
则会进入交互模式。
交互模式特征:
- 在这个模式下,你不能输入文本;
- 它可以让我们在文本间移动,删除一行文本,复制黏贴文本,跳转到指定行,撤销操作,等等。
# 插入模式
这个模式是我们熟悉的文本编辑器的模式,就是可以输入任何你想输入的内容。进入这个模式有几种方法,最常用的方法是按字母键 i
,退出这种模式,只需要按下 Esc
键。
# 命令模式
命令模式也称为底线命令模式,这个模式下可以运行一些命令例如“退出”,“保存”,等动作。
为了进入命令模式,首先要进入交互模式,再按下冒号键。
# 基本操作
# 打开Vim
在终端命令行中输入 vim
回车后 Vim
就会被运行起来,也可以用 Vim
来打开一个文件,只需要在 vim
后面再加文件名。如 vim file.name
,如果文件不存在,那么会被创建。
# 插入
进入文件之后,此时处于交互模式,可以通过输入 i
进入插入模式。
# 移动
在 Vim
的交互模式下,我们可以在文本中移动光标。
h
向左移动一个字符j
向下移动一个字符k
向上移动一个字符i
向右移动一个字符
当然也可以使用四个方向键进行移动,效果是一样的。
# 跳至行首和行末
- 行首:在交互模式下,为了将光标定位到一行的开始位置,只需要按下数字键
0
即可,键盘上的Home
键也有相同效果。 - 行末:在交互模式下,为了将光标定位到一行的末尾,只需要按下美元符号键
$
即可,键盘上的End
键也有相同效果。
# 按单词移动
在交互模式下,按字母键 w
可以一个单词一个单词的移动。
# 退出文件
在交互模式下,按下冒号键 :
进入命令模式,再按下 q
键,就可以退出了。
如果在退出之前又修改了文件,就直接想用 :q
退出 Vim
,那么 Vim
会显示一个红字标明错误信息。此时我们有两个选择:
- 保存并退出
:wq
或:x
; - 不保存且退出
:q!
。
# 标准操作
# 删除字符
# 交互模式
在交互模式下,将光标定位到一个你想要删除的字符上,按下字母键 x
你会发现这个字符被删除了。
也可以一次性删除多个字符,只需要在按 x
键之前输入数字即可。
# 编辑模式
在编辑模式下,和操作windows文本文件类似,使用backspace就可以进行删除。
# 删除(剪切)单词、行
删除一行:连按两次 d
来删除光标所在的那一行。
删除多行:例如先输入数字 2
,再按下 dd
,就会删除从光标所在行开始的两行。
删除一个单词:将光标置于一个单词的首字母处,然后按下 dw
。
删除多个单词:例如先按数字键 2
再按 dw
就可以删除两个单词了。
从光标所在位置删除至行首: d0
。
从光标所在位置删除至行末: d$
。
# 复制单词、行
- 复制行:按两次
y
会把光标所在行复制到内存中,和dd
类似,dd
用于“剪切”光标所在行。 - 复制单词:
yw
会复制一个单词。 - 复制到行末:
y$
是复制从光标所在处到行末的所有字符。 - 复制到行首:
y0
是复制光标所在处到行首的所有字符。
# 粘贴
如果之前用 dd
或者 yy
剪切复制过来的,可以使用 p
来粘贴。同样也可以使用 数字+p
来表示复制多次。
# 替换
在交互模式下,将光标置于想要替换的字符上。按下 r
键,接着输入你要替换的字符即可。
# 撤销
如果要撤销最近的修改,只需要按下 u
键,如果想要撤销最近四次修改,可以按下4,再按下 u
。
# 跳转到指定行
Vim
编辑的文件中,每一行都有一个行号,行号从1开始,逐一递增。
行号默认是不显示,如果需要它显示的话,可以进入命令模式,然后输入 set nu
,如果要隐藏行号的话,使用 set nonu
。
- 跳转到指定行:
数字+gg
,例如7gg
,表示跳转到第7行。 - 要跳转到最后一行,按下
G
。 - 要跳转到第一行,按下
gg
。
# 高级操作
# 查找
处于交互模式下,按下 /
键,那么就进入查找模式,输入你要查找的字符串,然后按下回车。光标就会跳转到文件中下一个查找到的匹配处。如果字符串不存在,那么会显示 "pattern not found"
。
n
跳转到下一个匹配项;N
跳转到上一个匹配项。
# 查找并替换
全文替换
:%s/wxx/dyl
# 分屏
Vim
有一个特别便捷的功能那就是分屏,可以同时打开好几个文件,分屏之后,屏幕每一块被称为一个 viewport
,表示“视口”。
- 横向分屏
:sp 文件名
- 垂直分屏
:vsp 文件名
分屏快捷键
Ctrl + w
再加Ctrl + w
,表示从一个viewport
移动光标到另外一个viewport
;Ctrl + w
再加 “方向键”,就可以移动到这个方向所处的下一个视口了;Ctrl + w
再加+
号,表示扩大当前视口;Ctrl + w
再加-
号,表示缩小当前视口;Ctrl + w
再加=
号,表示平均当前视口;Ctrl + w
再加r
键,会反向调换视口位置;Ctrl + w
再加q
键,会关闭当前视口;Ctrl + w
再加o
键,会关闭除当前视口以外的所有�