@[TOC](Linux基本使用)
学习Linux的四大目的:搭建服务器、程序开发、日常办公和运维。
大致学习路径:https://doc.shiyanlou.com/linux_base/1-8.png
Linux系统内核对应的壳shell:通过不同的shell来与Linux内容打交道。
UNIX/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的脚本语言。
在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME)。
Linux哲学之一:没有结果就是最好的结果。
重要快捷键:
- Tab:补全功能。
- CTRL+C 强行终止
- CREL+D 关闭终端
- 历史输入命令
- 学会使用通配符:?和*:用来对字符串进行模糊匹配(比如文件名、参数名)。
- 学会在命令行中获得帮助:man–是看详细的帮助和介绍;
- –help参数:是已知道某个命令的作用,只是想快速查看一些他的具体参数的作用。
1.NAME(名称)
该命令或函数的名称,接着是一行简介。
2.SYNOPSIS(概要)
对于命令,正式的描述它如何运行,以及需要什么样的命令行参数。对于函数,介绍函数所需的参数,以及哪个头文件包含该函数的定义。
3.DESCRIPTION(说明)
命令或函数功能的文本描述。
4.EXAMPLES(示例)
常用的一些示例。
5.SEE ALSO(参见)
相关命令或函数的列表。
1 用户及文件权限操作
- Linux中创建、删除用户、及用户组等操作。
- Linux中的文件权限设置。
Linux 是一个可以实现多用户登录的操作系统,共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件。
但实际上他们的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于 Linux 的 用户管理 和 权限机制,不同用户不可以轻易地查看、修改彼此的文件。
1.1 创建用户
新建用户:sudo adduser lilei
切换登录用户:su -l lilei
1.2 用户组
Linux里面每个用户都有一个归属(用户组),用户组简单理解就是一组用户的集合,共享一些资源和权限,同时拥有私有资源。
默认情况下在 sudo 用户组里的可以使用 sudo 命令获得 root 权限。
/etc/group 文件格式说明:包括用户组、用户组口令、GID以及该用户组所包含的用户,妹妹个用户组一条记录。
1.3 删除用户和用户组
直接删除用户:
sudo deluser lilei --remove-home
2 Linux文件权限
- 文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作
- Unix/Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位,对文件和目录有不同的访问权限。
- 在 Unix/Linux 中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。
2.1 查看文件权限
ls -l
权限解释:
- 表示的文件类型
- d–目录
- l–软连接:基本和Windows上的快捷键方式
- b–块设备
- c–字符设备
- s–socket
- p–管道
-
- 普通文件
2.2 修改文件权限
- 方式一:二进制数字表示
chmod 600 file
- 加减赋值操作
chmod go-rw iphone
g、o 还有 u 分别表示 group(用户组)、others(其他用户) 和 user(用户),+ 和 - 分别表示增加和去掉相应的权限。
3 Linux目录结构及文件基本操作
- Linux 的文件组织目录结构。
- 相对路径和绝对路径。
- 对文件的移动、复制、重命名、编辑等操作
3.1 Linux目录结构
- FHS目录标准
Linux 是以树形目录结构的形式来构建整个系统的,可以理解为树形目录是一个用户可操作系统的骨架。
HFS标准:系统的正常运行是以目录结构为基础的,对于初学者来说里面大部分目录都不知道其作用,重要与否。但是系统的正常运行是以目录结构为基础的,对于初学者来说里面大部分目录都不知道其作用,重要与否
FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
FHS定义了两层规范:第一层是 /下面的各个目录应该要放什么文件数据;例如 /etc应该防止设置文件,/bin与/sbin应该放置可执行文件等。第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统日志文件,/usr/share 放置共享数据等等。
!FHS目录标准
FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,如下图所示:
- 路径
- 绝对路径:就是以根" / "目录为起点的完整路径,以你所要到的目录为终点。
- 相对路径:相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点。
3.2 linux文件的基本操作
文件常用的基本操作,包括:新建、复制、删除、移动文件与文件重命名、查看文件、查看文件类型和以及编辑文件。
- 新建
- 新建文件:使用 touch 命令创建空白文件,关于 touch 命令,其主要作用是来更改已有文件的时间戳的
- 新建目录:使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性。
mkdir -p参数 同时创建父目录,在安装软件,配置安装路径非常有用。mkdir -p father/son/grandson
- 复制
- 使用 cp 命令(copy)复制一个文件到指定目录。
cp 文件 目录
- 要成功复制目录,需要加上-r 或者-R参数,表示递归复制。
cp -r 目录 目录
-
删除
rm 文件
rm -r 目录 -
移动文件与文件重命名
- mv 源目录文件 目的目录
mkdir Documents
touch file1
mv file1 Documents
- 重命名文件:mv file myfile
可能在输入时出现命令未闭合的状态,命令行会出现 quote> 开头的提示符
- 查看文件
- 使用cat tac和nl命令查看文件。
前两个命令都是用来打印文件内容到标准输出(终端),其中 cat 为正序显示,tac 为倒序显示。
进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中 - 使用 more 和 less 命令分页查看文件
cat 是用来快速查看一个文件的内容的,那么这个 more 和 less 就是天生用来"阅读"一个文件的内容的。 - 使用 head 和 tail 命令查看文件:适用于快速查看前几行或者后几行来显示
tail -f参数 使用 head 和 tail 命令查看文件。
-
查看文件类型
在 Linux 中文件的类型不是根据文件后缀来判断的。当你在文件里输入内容后才会显示文件类型。 -
编辑文件
直接使用专门的命令行编辑器比如(emacs,vim,nano)。
建议使用Gvim编辑器。
4 Vim学习操作
学习Vim 记住一条:在使用中学习
vimtutor // 开始学习必要的基本命令
4.1 第一讲
- 移动光标
- h j k l: j光标向下;k光标向上;h光标向左,l光标向右;
- Vim的进入与退出
- q!:不保存直接退出;
- 文本删除
- x 键删除光标所在的位置的字符。
- 文本插入
- i键
- 文本添加
- A键
- 保存文件
- wq
ESC回到正常模式和撤销一个不完整的命令
4.2 第二讲
- 删除命令
- dw 删除该单词;dd 删除该行;
- d$ 删除从当前光标到行末;
- dd 删除该行
- 命令和对象
改变文本的命令基本都是由:一个操作符和一个动作构成。
删除操作符 d 的删除命令的格式如下: d motion
d -删除操作符
motion -操作符的操作对象(动作)
例如:
w - 删除该单词;dd 删除该行;
$ - 删除从当前光标到行末;
若不按操作符,仅按动作会看到光标的移动会如此
3.使用计数指定动作
- 2w 使得光标向前移动两个单词
- 3e 使得光标向前移动第三个单词的末尾
- 0 移动光标到行首
- d2w 删除两个单词
- 2dd 删除两行
oprator [number] motion 多次重复该动作
- 撤销类命令
- u 撤销最近的一次命令,可连续多次按;
- U 直接恢复该行的原始状态;
4.3 第三讲
- 置入类命令
- p 输入p将最后一次删除的内容置于光标之后
- 替换类命令
5 环境变量与文件查找
介绍环境变量的作用与用法,及几种搜索文件的方法。
- 环境变脸的设置
- 环境变量的修改
为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等等数据类型。为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等等数据类型。
变量的作用域即变量的有效范围(比如一个函数中、一个源文件中或者全局范围),在该范围内只能有一个同名变量。一旦离开则该变量无效,如同不存在这个变量一般。
1.使用declare命令创建为一个变量名为tmp的变量:
tmp=shiyanlou // =两边不可以输入空格
- 读取变量的值:使用echo命令和
符
号
(
符号(
符号(符号用于表示引用一个变量的值,经常忘记输入)
变量名只能是英文字母、数字或者下划线,但不能以数字作为开头
echo $tmp
5.1 环境变量
Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。
通常涉及到的变量类型有三种:
- 当前 Shell 进程私有用户自定义变量,如创建的tmp变量,只有在当前shell种有效
- shell本身内建的变量
- 从自定义变量导出的环境变量。
与上述三种环境变量县官的命令:set env export.
5.1 上述三种环境变量的命令
- set:显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
- env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
- export:显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。
5.2 环境变量生效
按变量的生存周期来划分,Linux 变量可分为两类:
- 永久的:需要修改配置文件,变量永久生效;
- 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。
两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。还有要注意区别的是每个用户目录下的一个隐藏文件 .profile
5.3 命令的查找路径与追加填写环境
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
5.4 修改和删除已有变量
5.5 环境变量立即生效
cd /home/shiyanlou
source .zshrc
5.6 搜索文件
与搜索相关的命令常用的有 whereis,which,find 和 locate。
- whereis 简单快速
whereis who
whereis find
whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用 locate 命令。
- locate快而全
sudo apt-get update
sudo apt-get install locate
sudo updatedb
每次使用之前都要手动执行一次update命令
-
which小而精
which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的程序。
只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果,即我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。 -
find 精而细
find [path][option] [action]
find 应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
find 的第一个参数是要搜索的地方。命令前面加上 sudo 是因为 shiyanlou 只是普通用户。
sudo find /etc/ -name interfaces
6 文件打包与解压缩
常见常用压缩包文件格式:在 Windows 上最常见的不外乎这两种 .zip,.7z 后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外,还有 .rar,.gz,.xz,.bz2,.tar,.tar.gz,.tar.xz,*.tar.bz2。
重点掌握zip,tar格式:讲解使用 zip、tar 对文件进行打包压缩以及解压缩的具体命令行的使用
6.1 zip压缩打包和UZIP解压缩zip文件
unzip shiyanlou.zip
6.2 tar打包工具–打包且压缩
tar 原本只是一个打包工具,只是同时还是实现了对 7z、gzip、xz、bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩。
tar 的解压和压缩都是同一个命令,只需参数不同,使用比较方便
- 创建一个tar包
cd /home/shiyanlou
tar -P -cf shiyanlou.tar /home/shiyanlou/Desktop
// -P 保留绝对路径符,-c 表示创建一个 tar 包文件,-f 用于指定创建的文件名,注意文件名必须紧跟在 -f 参数之后,比如不能写成
- 解包一个文件(-x参数)到指定路径的已存在目录(-c参数):
mkdir tardir
tar -xf shiyanlou.tar -C tardir
- 只查看不解包文件 -t 参数:
tar -tf shiyanlou.tar
- 保留文件属性和跟随链接(符号链接或软链接)
tar -cphf etc.tar /etc
- 解压 *.tar.gz 文件:
tar -xzf shiyanlou.tar.gz
6.3 总结
记住最常用的就行了:
- zip:
打包 :zip something.zip something (目录请加 -r 参数)
解包:unzip something.zip
指定路径:-d 参数 - tar:
打包:tar -cf something.tar something
解包:tar -xf something.tar
指定路径:-C 参数
7 文件系统操作
知识点:df du mount命令的使用 磁盘相关知识学习
7.1 基本操作
- 查看磁盘和目录的容量
- 使用df命令查看磁盘的容量
df
df -h // 看得懂的方式
- 使用du命令查看目录的容量
# 默认同样以块的大小展示
du
# 加上 `-h` 参数,以更易读的方式展示
du -h
# 同 --all 显示目录中所有文件的大小
du -a
# 同 --summarize 仅显示总计,只列出最后加总的值
du -s
- 简单的磁盘管理
应该讲如何挂载卸载磁盘,如何格式化磁盘,如何分区。
3 创建虚拟磁盘
- 使用 dd 命令创建虚拟镜像文件。
dd if=/dev/zero of=virtual.img bs=1M count=256
du -h virtual.img
- 使用mkfs命令格式化磁盘
sudo mkfs.ext4 virtual.img
- 使用 mount 命令挂载磁盘到目录树
用户在 Linux/UNIX 的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,此时用户要对该文件系统执行 mount 的指令以进行挂载。
- 该指令通常是使用在 USB 或其他可移除存储设备上,而根目录则需要始终保持挂载的状态。
- Linux/UNIX 命令行的 mount 指令是告诉操作系统,对应的文件系统已经准备好,可以使用
- 该文件系统会对应到一个特定的点(称为挂载点)。挂载好的文件、目录、设备以及特殊文件即可提供使用。
mount命令的一般格式如下:
mount [options] [source] [directory]
一些常用操作:
mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
mount -o loop -t ext4 virtual.img /mnt
# 也可以省略挂载类型,很多时候 mount 会自动识别
# 以只读方式挂载
mount -o loop --ro virtual.img /mnt
# 或者 mount -o loop,ro virtual.img /mnt
# 命令格式 sudo umount 已挂载设备名或者挂载点,如:
sudo umount /mnt
- 使用fdisk为磁盘分区
# 查看硬盘分区表信息
sudo fdisk -l
# 进入磁盘分区模式
sudo fdisk virtual.img
8 linux下的帮助命令
带你好好利用 Linux 系统自带的帮助工具与文档。
- 内建命令与外部命令之分
- help,man,info命令的使用以及区别
8.1 内建命令与外部命令
- 内建命令:内建命令实际上是 shell 程序的一部分,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。
- 外部命令:外部命令是 Linux 系统中的实用程序部分,其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin
使用type命令来区分命令是内建还是外部的
8.2 常用帮助命令
- help命令
- help 命令: 是用于显示 shell 内建命令的简要帮助信息。
- 命令 --help: 用于显示外部命令的帮助信息
help 这种显示简单扼要的信息就特别实用。
-
man命令
man命令得到的内容比用 help 更多更详细,man没有内建与外部命令的区
通过 pgup 与 pgdn 或者上下键来上下翻看,可以按 q 退出当前页面。 -
info命令
要是man显示信息还不够,满足不了需求,尝试使用info命令。
8 Linux系统的周期性计划工具
知识点是 crontab命令用于设置周期性被执行的指令。
# 首先先打开日志
sudo apt-get install -y rsyslog
sudo service rsyslog start
# 启动
sudo cron -f &
# 添加一个计划任务
crontab -e
介绍crontab 的一些简单的应用和一些简单的概念。crontab 是 Linux 系统中添加计划任务,定时执行一些必要的脚本所必不可少的工具。
9 命令执行顺序控制与管道
顺序执行、选择执行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧。
知识点:
- cut grep wc sort命令的使用;
- 管道的理解
9.1 简单顺序控制执行多条命令
sudo apt-get update
# 等待执行完毕,然后输入下面的命令
sudo apt-get install some-tool # 这里 some-tool 需要替换成具体的软件包
# 等待安装完毕,然后输入软件包名称执行
some-tool
// 替换成一行
sudo apt-get update;sudo apt-get install some-tool;some-tool # 让它自己运行
- 有选择的执行命令
which cowsay>/dev/null && cowsay -f head-in ohch~ // && 就是用来实现选择性执行的,返回 0 则执行后面的,否则不执行
9.2 管道
管道是一种通信机制,通常用于进程间的通信,也可通过 socket 进行网络通信。
表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
管道又分为匿名管道和具名管道:在命令行中由 | 分隔符表示;
- 匿名管道:在使用一些过滤程序时经常会用到的就是匿名管道。
- 具名管道:有名字的管道,通常只会在源程序中用到具名管道。
//查看 /etc 目录下有哪些文件和目录
ls -al /etc
// 一行行来看
ls -al /etc | less
9.3 cut命令–打印每一行的某一字段
9.4 grep命令–在文本或stdin中查找
结合正则表达式可以实现很复杂却很高效的匹配和查找。
grep命令的一般形式为:
grep [命令选项]... 用于匹配的表达式 [文件]...
// 练习
grep -rnI "shiyanlou" ~ // -r 参数表示递归搜索子目录中的文件,-n 表示打印匹配项行号,-I 表示忽略二进制文件
# 查看环境变量中以 "yanlou" 结尾的字符串;其中$就表示一行的末尾
export | grep ".*yanlou$"
9.5 wc命令,简单小巧的计数工具
wc 命令用于统计并输出一个文件中行、单词和字节的数目。
比如输出 /etc/passwd 文件的统计信息:
wc /etc/passwd
9.5 sort排序命令
就是将输入按照一定方式排序,然后再输出。
支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等。
// 字典排序
cat /etc/passwd | sort
// 反转排序
cat /etc/passwd | sort -r
// 按照特定字段排序
cat /etc/passwd | sort -t':' -k 3
// cat /etc/passwd | sort -t':' -k 3 -n
cat /etc/passwd | sort -t':' -k 3 -n
9.6 uniq去重命令
- 过滤重复行
// 去掉命令后面的参数然后去掉重复的命令:
history | cut -c 8- | cut -d ' ' -f 1 | uniq
// uniq 命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者
history | cut -c 8- | cut -d ' ' -f 1 | sort -u
- 输出重复行
# 输出重复过的行(重复的只输出一个)及重复次数
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 输出所有重复的行
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
熟悉 cut,sort,uniq 命令以及参数