常用快捷键:(开始学习之前,先了解一下一些常用的快捷键)
Ctrl + c 结束
tab 补全
一、Linux基本概念
有关Linux的历史以及其与Unix的渊源,这里就不赘述了,毕竟只是一个自存复习用的学习笔记。
通配符:
man 帮助手册
页面基本布局:
NAME(名称)
SYNOPSIS(概要)
DESCRIPTION(说明)
EXAMPLES(示例)
SEE ALSO(参见)
相关命令或函数的列表。
也可能存在其它部分内容,但这些部分没有得到跨手册页的标准化。常见的例子包括:OPTIONS(选项),EXIT STATUS(退出状态),ENVIRONMENT(环境),BUGS(程序漏洞),FILES(文件),AUTHOR(作者),
REPORTING BUGS(已知漏洞)
,HISTORY(历史)和 COPYRIGHT(版权)。
如果你知道某个命令的作用,只是想快速查看一些它的某个具体参数的作用,那么你可以使用
--help
参数
你可以在 man 中使用搜索
/<你要搜索的关键字>
,查找完毕后你可以使用
n
键切换到下一个关键字所在处,
shift+n
为上一个关键字所在处。
二、用户及文件权限管理
创建用户
su,su- 与 sudo
现在我们新建一个叫
lilei
的用户:
sudo adduser lilei
这个命令不但可以添加用户到系统,同时也会默认为新用户在 /home 目录下创建一个工作目录:
adduser
和
useradd
的区别是什么?答:
useradd
只创建用户,不会创建用户密码和工作目录,创建完了需要使用
passwd <username>
去设置新用户的密码。
adduser
在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。其实
useradd
、
userdel
这类操作更像是一种命令,执行完了就返回。而
adduser
更像是一种程序,需要你输入、确定等一系列操作。
现在你已经创建好一个用户,并且你可以使用你创建的用户登录了,使用如下命令
切换登录用户
:
su -l lilei
退出当前用户跟退出终端一样,可以使用
exit
命令或者使用快捷键
Ctrl+D
。
用户组
用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源,就跟家的形式差不多。当然一个用户是可以属于多个用户组的,正如你既属于家庭,又属于学校或公司。
在 Linux 里面如何知道自己属于哪些用户组呢?
方法一:使用 groups 命令
groups shiyanlou
默认情况下在 sudo 用户组里的可以使用 sudo 命令获得 root 权限。shiyanlou 用户也可以使用 sudo 命令,为什么这里没有显示在 sudo 用户组里呢?可以查看下
/etc/sudoers.d/shiyanlou
文件,我们在
/etc/sudoers.d
目录下创建了这个文件,从而给 shiyanlou 用户赋予了 sudo 权限:
方法二:查看
/etc/group
文件
/etc/group
cat /etc/group | sort
| sort
表示将读取的文本进行一个字典排序再输出
/etc/group
文件格式说明
/etc/group 的内容包括用户组(Group)、用户组口令、GID(组 ID) 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:
group_name:password:GID:user_list
你看到上面的 password 字段为一个
x
,并不是说密码就是它,只是表示密码不可见而已。
默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入 sudo 用户组从而获取 root 权限
使用
usermod
命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令。
groups lilei
sudo usermod -G sudo lilei
groups lilei
删除用户组
sudo deluser lilei --remove-home
使用
--remove-home
参数在删除用户时候会一并将该用户的工作目录一并删除。如果不使用那么系统会自动在 /home 目录为该用户保留工作目录。
删除用户组可以使用
groupdel
命令,倘若该群组中仍包括某些用户,则必须先删除这些用户后,才能删除群组。
查看文件权限
使用较长格式列出文件: ls -l
-
文件类型:关于文件类型,这里有一点你必需时刻牢记
Linux 里面一切皆文件
,正因为这一点才有了设备文件(
/dev
目录下有各种设备文件,大都跟具体的硬件设备相关)这一说。 - 文件权限:ls -alh 可以查看文件所有者
-
文件大小:
以 inode 结点大小为单位来表示的文件大小,你可以给 ls 加上
-lh
参数来更直观的查看文件的大小。
使用以下命令变更文件所有者为 shiyanlou
# 需要切换到 shiyanlou 用户执行以下操作
cd /home/lilei
ls iphone11
sudo chown shiyanlou iphone11
修改文件权限
———
三、目录结构即文件基本操作
目录结构
Linux其中大部分目录结构是规定好了的(FHS 标准),是死的,当你掌握后,你在里面的一切操作都会变得井然有序。
FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态,如下表所示:
目录路径
在 Linux 里面使用
.
表示当前目录,
..
表示上一级目录;~表示当前用户的home目录
比如你可以使用:
cd ..//返回上一级目录
cd ~ //进入当前登陆用户的home目录
绝对路径
关于绝对路径,简单地说就是
以根” / “目录为起点
的完整路径,以你所要到的目录为终点,表现形式如:
/usr/local/bin
,表示根目录下的
usr
目录中的
local
目录中的
bin
目录。
文件基本操作
新建空白文件:touch
新建目录: mkdir(使用
-p
参数,同时创建父目录)
复制文件:cp
删除文件:rm
三、环境变量与文件查找
创建、读取自定义变量
使用
declare
命令创建一个变量名为 tmp 的变量:
declare tmp
使用
=
号赋值运算符,将变量 tmp 赋值为 shiyanlou。
注意,与其他语言不同的是, Shell 中的赋值操作,
=
两边不可以输入空格,否则会报错。
读取变量的值,使用
echo
命令和
$
符号
(
$ 符号用于表示引用一个变量的值,初学者经常忘记输入
):
echo $tmp
注意:并不是任何形式的变量名都是可用的,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。
什么是环境变量?
环境变量的作用域比自定义变量的要大,如 Shell 的环境变量
作用于自身和它的子进程
。默认情况下,当一个进程被创建时,它将继承其父进程的绝大部分环境设置。
Shell 程序也作为一个进程
运行在操作系统之上,而我们在 Shell 中运行的
大部分命令都将以 Shell 的子进程的方式运行
。
通常我们会涉及到的变量类型有三种:
- 当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。
- Shell 本身内建的变量。
- 从自定义变量导出的环境变量。
也有三个与上述三种环境变量相关的命令:
set
,
env
,
export
。(这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同):
命 令 | 说 明 |
---|---|
|
显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。 |
|
显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。 |
|
显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。 |
(Notation: 这里bash是Linux默认打开的shell,其实还有很多其他的shell种类,比如zsh)
临时的:使用 export 命令行声明即可,当你关机后,或者关闭当前的 shell 之后,这种环境变量就没了。
如果想要添加一个永久生效的环境变量,只需要打开
/etc/profile
,在最后加上你想添加的环境变量
创建一个最简单的可执行 Shell 脚本
下面我们将练习创建一个最简单的可执行 Shell 脚本和一个使用 C 语言创建的“ hello world ”程序
1.创建一个 Shell 脚本文件
,你可以使用 gedit,vim,sublime 等工具编辑。(nano也是一个最简单的编辑器)
touch hello_shell.sh
gedit hello_shell.sh
在编辑器里面输入:
#!/bin/bash
for ((i=0; i<10; i++));do
echo "hello shell"
done
exit 0
注意:在这一段脚本中,#!/bin/Bash这一句是个例外,他并不是注释,是标识,说明以下语句是Shell脚本
退出并保存之后,回到终端中,输入:为文件添加可执行权限,否则执行会报错没有权限:
chmod 755 hello_shell.sh
然后直接执行脚步即可: ./hello_shell.sh
2.创建一个 C 语言
hello world
程序
hello world
gedit hello_world.c
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
gcc -o hello_world hello_world.c
gcc 生成二进制文件默认具有可执行权限,不需要修改。
变量删除
可以使用
unset
命令删除一个环境变量:
source
命令
source
前面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的
.zshrc
),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用
source
命令来让其立即生效,如:
cd /home/shiyanlou
source .zshrc
source
命令还有一个别名就是
.
,上面的命令如果替换成
.
的方式就该是:
. ./.zshrc
在使用
.
的时候,需要注意与表示当前路径的那个点区分开。
注意第一个点后面有一个空格,而且后面的文件必须指定完整的绝对或相对路径名,
source
则不需要。
搜索文件
-
whereis
简单快速
whereis
只能搜索二进制文件(
-b
),man 帮助文件(
-m
)和源代码文件(
-s
)。如果想要获得更全面的搜索结果可以使用
locate
命令。
-
locate
快而全
注意这个命令也不是内置的命令,在部分环境中需要手动安装,然后执行更新。
sudo apt-get update
sudo apt-get install locate
sudo updatedb
-
which
小而精
which
本身是 Shell 内建的一个命令,我们通常使用
which
来确定是否安装了某个指定的程序,我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。
-
find
精而细
注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path][option] [action] 。
find
应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
四、文件打包与压缩
- zip 命令
- tar 命令
- 压缩与解压常用组合
五、文件系统操作与磁盘管理
-
df
,
du
,
mount
命令的使用 - 磁盘相关知识学习
六、Linux下的帮助命令
- 内建命令与外部命令之分
- help,man,info 命令的使用以及区别
七、 Linux 系统的计划工具Crontab
- crontab 语法
八、命令执行顺序的控制 与 管道
-
cut
,
grep
,
wc
,
sort
命令的使用 - 管道的理解
- 顺序执行、选择执行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧
通常情况下,我们每次只能在终端输入一条命令,按下回车执行,执行完成后,我们再输入第二条命令,然后再按回车执行。当有时候我们会一次输入多条命令,这个时候的执行过程又是如何的呢?下面我们将为大家详细讲解下命令的执行顺序的控制问题。
顺序执行
简单的顺序执行你可以使用
;
来完成;但是这种方法效率很低,有可能你等六很长的运行时间最后得到一个错误的结果。
选择执行
那么我们需要能够有选择性的来执行命令,比如上一条命令执行成功才继续下一条,或者不成功又该做出其它什么处理,比如我们使用
which
来查找是否安装某个命令,如果找到就执行该命令,否则什么也不做:
which cowsay>/dev/null && cowsay -f head-in ohch~
上面的
&&
就是用来实现选择性执行的,它表示
如果前面的命令执行结果返回 0
则执行后面的,否则不执行,你可以
从
$?
环境变量获取上一次命令的返回结果
:
echo $?
在 C 语言里面
&&
表示逻辑与,而且还有一个
||
表示逻辑或,同样 Shell 也有一个
||
,它们的区别就在于,shell 中的这两个符号除了也可用于表示逻辑与和或之外,就是可以实现这里的命令执行顺序的简单控制。
||
在这里就是与
&&
相反的控制效果,当上一条命令执行结果为
≠0(\$?≠0)
时则执行它后面的命令:
管道
管道是一种通信机制,通常用于进程间的通信(也可通过 socket 进行网络通信),它表现出来的形式就是
将前面每一个进程的输出
(stdout)直接作为
下一个进程的输入
(stdin)。(中间用|来分隔)
管道又分为匿名管道和具名管道
我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由
|
分隔符表示
试用
先试用一下管道,比如查看
/etc
目录下有哪些文件和目录,使用
ls
命令来查看:
ls -al /etc
发现有太多内容,屏幕不能完全显示,这时候
可以使用滚动条或快捷键滚动窗口来查看。不过这时候可以使用管道:
ls -al /etc | less
通过管道
将前一个命令(
ls
)的输出
作为
下一个命令(
less
)的输入
,然后就可以一行一行地看。
cut 命令,打印每一行的某一字段
grep
命令
grep
wc 命令,简单小巧的计数工具
sort 排序命令
uniq 去重命令
九、简单的文本处理
这一节我们将介绍这几个命令
tr
(注意不是 tar),
col
,
join
,
paste
。实际这一节是上一节关于能实现管道操作的命令的延续,所以我们依然将结合管道来熟悉这些命令的使用。
- 常见文本处理命令
- 如何简单处理文本
tr 命令
可以用来删除一段文本信息中的某些文字。或者将其进行转换。
使用方式
tr [option]...SET1 [SET2]
常用的选项有
选项 | 说明 |
---|---|
|
删除和 set1 匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
|
去除 set1 指定的在输入文本中连续并重复的字符 |
col 命令
可以将
Tab
换成对等数量的空格键,或反转这个操作。
使用方式
col [option]
常用的选项有
选项 | 说明 |
---|---|
|
将
转换为空格 |
|
将空格转换为
(默认选项) |
join命令
这个命令就是用于将两个文件中包含相同内容的那一行合并在一起。
使用方式
join [option]... file1 file2
常用的选项有
选项 | 说明 |
---|---|
|
指定分隔符,默认为空格 |
|
忽略大小写的差异 |
|
指明第一个文件要用哪个字段来对比,默认对比第一个字段 |
|
指明第二个文件要用哪个字段来对比,默认对比第一个字段 |
paste
命令
paste
与
join
命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以
Tab
隔开。
使用方式
paste [option] file...
常用的选项有
选项 | 说明 |
---|---|
|
指定合并的分隔符,默认为 Tab |
|
不合并到一行,每个文件为一行 |
十、数据流重定向
- 重定向怎么用
- 文件描述符(0,1,2)
>
或
>>
操作,他们分别是将标准输出导向一个文件或追加到一个文件中。这其实就是重定向,将原本输出到标准输出的数据重定向到一个文件中,因为标准输出(
/dev/stdout
)本身也是一个文件,我们将命令输出导向另一个文件自然也是没有任何问题的。
简单的重定向
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为
stdin
(标准输入,对应于你在终端的输入),
stdout
(标准输出,对应于终端的输出),
stderr
(标准错误输出,对应于终端的输出)。
文件描述符 | 设备文件 | 说明 |
---|---|---|
|
|
标准输入 |
|
|
标准输出 |
|
|
标准错误 |
初学者这里要注意不要将管道和重定向混淆,
管道默认是连接前一个命令的输出到下一个命令的输入
,而重定向通常是需要一个文件来建立两个命令的连接
标准错误重定向
使用 tee 命令同时重定向到多个文件
使用
exec
命令实现永久重定向
exec
你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到永久有效呢?
我们可以使用
exec
命令实现永久重定向。
exec
命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:
# 先开启一个子 Shell
zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
ls
exit
cat somefile
创建输出文件描述符
在 Shell 中有 9 个文件描述符。上面我们使用了也是它默认提供的 0,1,2 号文件描述符。另外我们还可以使用 3-8 的文件描述符,只是它们默认没有打开而已
你可以使用下面命令查看当前 Shell 进程中打开的文件描述符:
cd /dev/fd/;ls -Al
同样使用
exec
命令可以创建新的文件描述符:
zsh
exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
echo "this is test" >&3
cat somefile
exit
关闭文件描述符
exec 3>&-
cd /dev/fd;ls -Al;cd -
完全屏蔽命令的输出
在 Linux 中有一个被称为黑洞的设备文件,所有导入它的数据都将被吞噬。
在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个 EOF。
我们可以利用
/dev/null
屏蔽命令的输出:
cat Documents/test.c 1>/dev/null 2>&1
上面这样的操作将使你得不到任何输出结果。
使用 xargs 分割参数列表
它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。
这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如
find
,
locate
和
grep
的结果,详细用法请参看 man 文档。
cut -d: -f1 < /etc/passwd | sort | xargs echo
上面这个命令用于将
/etc/passwd
文件按
:
分割取第一个字段排序后,使用
echo
命令生成一个列表。
十一、正则表达式基础
-
掌握基本命令:
sed
,
grep
,
awk
的用法 - 掌握正则表达式符号和语法
十二、Linux进程的概念
【附录一】基础命令总结
cd 更改路径
pwd 查看当前所在路径
touch 创建一个空白文件
ls 查看当前路径下的文件
man 帮助手册
who am i (who -m)或者 who mom likes 查看用户:
输出的第一列表示打开当前伪终端的用户的用户名;
第二列的
pts/0
中
pts
表示伪终端,所谓伪是相对于
/dev/tty
设备而言的;你可以尝试再打开一个终端,然后在里面输入
who am i
,看第二列是不是就变成
pts/1
了;第三列则表示当前伪终端的启动时间
如果去掉空格—> whoami 则只显示用户名
groups (其中冒号之前表示用户,后面表示该用户所属的用户组。)
cat (用于读取指定文件的内容并打印到终端输出
sudo passwd +<name>
mkdir
cp
【附录二】有趣的Linux小命令:
1.可以输出图形字符的命令
banner:
首先安装:
sudo apt-get update
sudo apt-get install sysvbanner
然后尝试:
banner CSDN
2.安装Xeyes
3.实现黑客帝国中的“数字雨”:
先安装:
sudo apt-get update
sudo apt-get install cmatrix
执行:cmatrix
(装好之后先不要急着执行,为了看到更好的效果,我们需要先修改终端的主题配色,在终端上面菜单栏中找到[首选项]修改,修改颜色预设为黑底绿字。)
题外话:在 macOS Unix 发行版中安装 cmatrix
键入下列命令:
$ brew install cmatrix
高清效果如下:
还可以改变代码的颜色:
cmatrix -C red