入门Linux命令行(cli),包括基本的概念以及常用操作。
1 Linux简介
Linux是一个操作系统的内核。一提操作系统,可能很多人脑子里第一时间想到的是Windows。实际上大家熟悉的Windows、还有苹果Mac都是操作系统。如果这么说您还不明白,那么联想一下苹果手机和安卓的区别,实际上也是操作系统有区别。 操作系统包括内核和调用,Linux本身只是操作系统的内核,也是其他程序能够运行的基础。 那么我们为什么要花费时间成本去学习使用Linux呢?
- Linux更加安全
- 方便的命令行操作,您可以使用键盘完成一切操作。
- 极佳的可定制性,您甚至可以制作您自己的发行版(发行版是用来进行系统调用的)。
- 可以占用很少的资源,让您的老旧电子设备重焕生机(比如使用puppy发行版)。
- 应用广泛,从服务器到渗透等无所不能。
2 Shell\Terminal\Console
2.1 Shell:
一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,也是一种程序设计语言。
2.2 Terminal:
用来显示主机运算的输出,并且接受主机要求的输入。实际上显示器以及键盘就是终端。Linux里的终端并非真正的终端(鼠标键盘显示器),而是终端模拟器。
2.3 Console:
显示系统消息的终端就叫控制台。
3 Linux快捷键\通配符
3.1 快捷键
快捷键 | 作用 |
---|---|
Crt+d | 键盘输入结束、退出终端 |
Crt+s | 暂停当前程序、按任意键继续 |
Crt+z | 当前程序后台运行,恢复为命令fg |
Crt+a | 光标移至行头(Home) |
Crt+e | 光标移至行末(End) |
Crt+k | 删除从光标位置到行末的文本 |
Alt+Backspace | 向前删除一个单词 |
方向键↑ | 历史输入命令 |
3.2 通配符
通配符 | 含义 |
---|---|
* | 匹配0或多个字符 |
? | 匹配任意一字符 |
[list] | 匹配list中的任意单一字符 |
[^list] | 匹配list之外的任意单一字符 |
{string1,string,……} | 匹配其一字符串 |
{c1..c2} | 排位c1-c2中全部字符 如{1..10} |
您可以使用通配符一次性创建多个文件
touch file_{1..10}.txt
4 Linux账号管理
4.1 who命令:
whoami:查看当前用户名 who am i:查看当前伪终端用户名 who命令其他参数:
参数 | 说明 |
---|---|
-a | 打印全部 |
-d | 打印死进程 |
-m | 同am i、mom likes |
-q | 打印当前登录用户数及用户名 |
-u | 打印当前用户登录信息 |
-r | 打印运行等级 |
4.2 切换用户:su <user>
需要输入密码(您无法看见您输入的密码,鄙人第一次还以为无法输入了)
4.3 sudo <cmd>:
使用前提是当前用户属于sudo组,可以以特权级别运行cmd命令
sudo adduser xiaoming
4.4 查看当前用户组:
4.4.1 groups命令
4.4.2 查看/etc/group文件:
cat /etc/group | sort cat:将文件打印到终端 etc/group 文件路径 | sort 将读取的文本进行一个字典排序后再输出。
4.5 将其它用户加入 sudo 用户组:sudo usermod -G sudo xiaoming
4.6 删除用户:sudo deluser lilei –remove-home
5 Linux文件权限:
5.1 查看文件权限
ls -lah 命令:列出文件详细信息
drwxr-xr-x 4 el-lazo el-lazo 4.0k 12月 9 20:17 .file
这些信息的意思
文件类型
|文件类型|含义| |-|———| |d|目录 | |l|软连接 | |b|块设备 | |c|字符设备 || |s|socket || |p|管道 || |-|普通文件 ||
文件权限
每个文件都有三组权限,分别是拥有者、拥有者所属用户组、其他用户。
文件权限 | 含义 |
---|---|
r | 允许读权限 |
w | 允许写权限 |
x | 允许执行权限 |
权限部分,权限还可用二进制转换为十进制进而更方便的表示(从三个字符变为一个数字)。 即二进制数110可表示为1×2\^2+1×2\^1+0×2\^0=6
权限 | 二进制 | 对应的十进制 |
---|---|---|
rwx | ||
- - - | 000 | 0 |
r - - | 100 | 4 |
- w - | 010 | 2 |
- - x | 001 | 1 |
r w - | 110 | 6 |
r - x | 101 | 5 |
- w x | 011 | 3 |
r w x | 111 | 7 |
其他信息
连接数:连接到该文件所在的indoe节点的文件名数目 所有者\所属用户组:很好理解,就是这个文件是属于谁的。 文件大小:文件的大小(若不加 -h参数 则为以indoe节点为单位来表示的文件的大小)
5.2 变更文件拥有者
sudo chown xiaoming file1
5.3 变更文件权限
命令chmod:
方法一: chmod 600 file 方法二: chmod go-rw file
g:group(用户组) o:other(其他用户) u:user(用户)
6 Linux目录结构
Linux使用FHS(Filesystem Hierarchy Standard文件系统层次结构标准) FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录,还给出了例外处理与矛盾处理。
FHS的两层规范
- / 下各目录所存放文件种类。 如 /etc放置设置文件,/bin 与 /sbin 则放置可执行文件。
- /usr 及 /var 两个目录的子目录定义 如 /var/log 放置系统日志文件,/usr/share 放置共享数据。 您可以通过tree /命令来进一步了解。
7 Linux文件操作
7.1 touch命令
7.1.1 使用touch命令创建一个空文件
您只需在touch命令后加文件名即可
touch newhtmlfile.html
7.1.2 使用touch命令创建多个空文件
您可以通过空格或通配符一次创建多个空文件。
touch newhtmlfile1.html newhtmlfile2.html
touch newhtmlfile1_{1..10}.html
7.1.3 使用touch查看版本信息
touch --version
7.2 新建目录
mkdir命令(make directories) 使用-p参数允许您创建多级目录。
7.3 复制文件/目录
cp命令(copy)
7.3.1 复制文件
cp newhtmlfile.html file/html
7.3.2 目录
cp -r folder1 folder2
# 复制目录需要加-r参数,表示递归复制
7.4 删除文件/目录
rm命令(remove files or directories)
7.4.1 删除文件
rm newhtmlfile.html
7.4.2 删除目录
rm -r folder1
# 同样需要添加加-r参数
7.5 移动文件
mv命令(move or rename files)
mv newhtmlfile.html folder1
7.6 重命名文件
mv htmlfile.html newhtmlfile.html
7.8 查看文件
7.8.1 cat、tac命令
打印文件内容输出至终端, cat 为正序显示,tac 为倒序显示。
7.8.2 nl命令:添加行号并打印
7.8.3 more/less命令:分页查看文件
7.8.3 head/tail命令:查看文件头/尾10行
7.9 查看文件类型
file命令:Linux不同于Windows,并不按后缀名来分类文件,而是根据文件内容来分类,也就是说即使您的文件后缀为.html,在Linux中也会显示为空文件。
8 文件搜索
8.1 whereis命令
迅速,直接从数据库中查询。
参数 | 说明 |
---|---|
-b | 二进制文件 |
-m | 帮助文件 |
-s | 源代码文件 |
8.2 locate命令
需手动下载,快速,可自动递归子目录
sudo apt-get update
sudo apt-get install locate
sudo updatedb
# 执行updatedb以更新其用于查询的/var/lib/mlocate/mlocate.db这个数据库
8.3 which命令
返回PATH环境变量指定的路径第一个搜索到的结果。
8.4find命令
sudo find /etc/ -name interfaces
9 Linux上常用的压缩/解压工具
9.1 常见的压缩格式
文件后缀名 | 说明 |
---|---|
.zip | zip 程序打包压缩的文件 |
.rar | rar 程序压缩的文件 |
.7z | 7zip 程序压缩的文件 |
.tar | tar 程序打包,未压缩的文件 |
.gz | gzip 程序(GNU zip)压缩的文件 |
.xz | xz 程序压缩的文件 |
.bz2 | bzip2 程序压缩的文件 |
.tar.gz | tar 打包,gzip 程序压缩的文件 |
.tar.xz | tar 打包,xz 程序压缩的文件 |
tar.bz2 | tar 打包,bzip2 程序压缩的文件 |
.tar.7z | tar 打包,7z 程序压缩的文件 |
9.2 zip命令:以zip压缩文件
cd /home/uesr
zip -r -1 -q -o packeg.zip /home/user/Desktop -x ~/*.zip
-r 参数表示递归打包包含子目录的全部内容 -q 参数表示为安静模式,即不向屏幕输出信息 -o 输出文件 -9 压缩级别(0-9 数字越高压缩的越小) -x排除上一次创建的zip文件,防止重复打包 -e(encryption)加密 请使用绝对路径
9.3 du命令:查看压缩包
du -h -d 0 *.zip ~ | sort
-h, –human-readable -d, –max-depth(所查看文件的深度)
9.4 unzip命令:解压压缩包
unzip -q file.zip -d ziptest
-d 指定目录,不指定就会解压到当前目录 -l 不解压文件,仅查看。 -O 指定编码类型 如 -O GBK
9.5 tar命令
tar -P -cf file.tar /home/user/Desktop
-P 保留绝对路径符 -c 表示创建一个 tar 包文件 -v 参数以可视的的方式输出打包的文件。 -f 用于指定创建的文件名,文件名必须紧跟在 -f 参数之后
tar -fc file.tar–> tar -f file.tar -c
mkdir tardir
tar -xf file.tar -C tardir
-x 解包一个文件 -C 指定解包的路径
tar -tf file.tar
-t 只查看,不解压缩
10 Linux文件操作与磁盘管理
10.1 df命令:查看磁盘的容量
10.2 du命令:查看目录容量
10.3 dd命令:读入读出、创建虚拟镜像文件(之后再细学)
10.4 mkfs命令:格式化磁盘
du -h -d 1 ~ # 查看 2 级目录的信息
11 Linux获取命令帮助
11.1 help参数:外部命令后加 –help
11.2 man命令:得到非常详细的帮助文档
章节数(LS) | 说明 |
---|---|
1 | Standard commands (标准命令) |
2 | System calls (系统调用) |
3 | Library functions (库函数) |
4 | Special devices (设备说明) |
5 | File formats (文件格式) |
6 | Games and toys (游戏和娱乐) |
7 | Miscellaneous (杂项) |
8 | Administrative Commands (管理员命令) |
9 | 其他(Linux 特定的), 用来存放内核例行程序的文档。 |
按q退出当前页面
11.3 info命令:需要安装
# 安装 info
sudo apt-get update
sudo apt-get install info
# 查看 ls 命令的 info
info ls
12 Linux 任务计划 crontab
详细用法说明:Cron Job: A Comprehensive Guide for Beginners 2021
12.1 crontab简介
crontab是帮助您定时完成重复性工作的程序,存放于crontab文件内,可以使得系统在固定的时间执行系统指令或Shell脚本,比如每天早上六点自动完成健康打卡。 crontab依靠daemon(守护程序)运行,daemon就好比摇篮里的婴儿,摇篮一停(特定时间)婴儿就会醒(计划的操作发生)。
crontab有这些缺陷
最短检查间隔:一分钟,也就是说每一分钟检查一次,您无法使得这段程序没59秒或更短运行一次。 不能部署在多台电脑上 没有自动重试机制
12.2 准备工作
12.2.1 检查rsyslog是否开启(有的发行版是会默认自行启动,如Ubuntu)
如未启动,或未安装,则需要您手动安装开启。
sudo apt-get install -y rsyslog sudo service rsyslog start
12.2.2 检查crontab是否启动
如未启动则需要您手动启动
sudo cron -f &
12.3 corntab使用
12.3.1 添加计划任务
crontab -e
如果您是第一次使用corntab的话,那么系统会询问你使用那种编辑器。
12.3.2 crontab语法
* * * * * commend to execute
第一个:分钟:1-59 第二个:小时:0-23 第三个:日:1-31 第四个:月:1-12 第五个*:周:0-6:周日到周六(老外那边周日是一周的第一天)
37 17 * * 5 root/backup.sh
# 这条命令代表了将在每周五的5:37pm执行备份程序
# 37 17 即17:37
# 5 即周五
*:所有可能的值(每天\每小时\每分钟等) \,:和(比如1,5可以表示周一和周五) -:可以表示一段时间(比如1-5可以表示周一到周五) \/:每隔一段时间(比如 */12可以表示每12小时运行一次) L:last,最后的(比如* * * * 3L代表每月最后一个周三) W:weekday最近的工作日(比如如果12月01日是周六的话* * 1W * * 代表接下来第一个星期一,即12月03日) #:指定某周的周几(我不知道怎么翻译合适,看看这个例子您应该就明白了,比如1#2代表这个月的第二个周一,这个功能应该是适配西方节假日的) ?:无特定值,在“日”和“周”使用
另外还请记得时区转换的问题
12.3.3邮件
12.3.3.1 关闭邮件
crontab会自动给您的本地邮箱发送邮件,如果您不想的话请添加>/dev/null 2>&1 在语句的最后
12.3.3.2 给指定邮箱发送邮件
您需要添加MAITO,例子如下
MAILTO="myname@hostinger.com"
0 3 * * * /root/backup.sh >/dev/null 2>&1
12.3.4 退出:按esc 输入”:wq”
13 命令执行顺序控制和管道
13.1 顺序执行
13.1.1 简单的顺序执行:
在命令中加入”;”以作分隔
13.1.2 选择性执行:
“&&”如果前面的命令执行结果为0则执行后面的,否则不执行。(前面的命令执行失败才执行后面的) “||”如果前面的命令执行结果不为零则执行后面的,否则不执行(签名档命令执行成功才执行后面的)
13.2 管道
管道简介
管道是一种通信机制,用于进程间的通信或通过 socket 进行网络通信。 管道将每一个进程的输出(stdout)作为下一个进程的输入(stdin)。
管道的分类
匿名管道 在过滤程序时常会用到的管道,在命令行中由 | 分隔符表示 具名管道 具名管道是有名字的管道,通常在源程序中用到具名管道。
13.3 cut命令:打印每一行的某一字段
13.4 grep命令:在文本或stdin中查找匹配
grep [命令选项]… 用于匹配的表达式 [文件]…
13.5 wc命令:统计并输出一个文件中行、单词和字节的数目
参数 | 含义 |
---|---|
-l | 行数 |
-w | 单词数 |
-c | 字节数 |
-m | 字符数 |
-L | 最长行字节数 |
13.6 sort命令:排序
13.7 unip命令:去除重复,但只能去除上下两行都一样的情况
14 文本处理
14.1 tr命令:删除文本中的某些信息
tr [option]…SET1 [SET2]
参数 | 含义 |
---|---|
-d | 删除和 set1 匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
-s | 去除 set1 指定的在输入文本中连续并重复的字符 |
# 删除 "hello" 中所有的'o','l','h'
$ echo 'hello' | tr -d 'olh'
# 将"hello" 中的ll,去重为一个l
$ echo 'hello' | tr -s 'l'
# 将输入文本,全部转换为大写或小写输出
$ echo 'input some text here' | tr '[:lower:]' '[:upper:]'
14.2 col命令:将Tab换成等量空格或将空格换成等量Tab
|参数| 含义| |—|—| |-x| 将Tab转换为空格| |-h |将空格转换为Tab(默认选项)|
14.3 join命令:将两个文件中包含相同内容的那一行合并在一起
|参数 |含义| |—–|—–| |-t |指定分隔符,默认为空格| |-i | 忽略大小写的差异| |-1 | 指明第一个文件要用哪个字段来对比,默认对比第一个字段| |-2 |指明第二个文件要用哪个字段来对比,默认对比第一个字段|
14.4 paste命令:将多个文件合为一个
paste [option] file…
参数 | 含义 |
---|---|
-d | 指定合并的分隔符,默认为 Tab |
-s | 不合并到一行,每个文件为一行 |
15 正则表达式(Regular Expression)
15.1 简介
正则表达式使用字符串来描述、匹配符合句法规则的字符串,它能被被用来检索、替换符合这个模式的文本。
15.2 基本句法
符号 | 作用 | 示例 |
---|---|---|
| | 表示选择 | boy|girl 可以匹配 boy 或者 girl。 |
+ | 前面的字符必须出现至少一次(>=1) | goo+gle 可以匹配 gooogle,goooogle 等 |
? | 前面的字符最多出现一次(0或1) | colou?r,可以匹配 color 或者 colour |
* | 都可以(0到多次) | 0*42 可以匹配 42、042、0042、00042 |
() | 定义模式字符串的范围和优先级 | gr(a|e)y 等价于 gray|grey、(grand)?father 匹配 father 和 grandfather |
|将下一个字符标记为一个特殊字符、或一个原义字符 | n 匹配字符 n。\n 匹配一个换行符。序列 \ 匹配 \ 而 ( 则匹配 ( | |
^ | 匹配输入字符串的开始位置 | |
$ | 匹配输入字符串的结束位置 | |
{n} | n 是一个非负整数。只匹配确定的 n 次 | o{2} 不能匹配 Bob 中的 o,但是能匹配 food 中的两个 o |
{n,} | n 是一个非负整数。至少匹配 n 次 | o{2,} 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 o。o{1,} 等价于 o+。o{0,} 则等价于 o* |
{n,m} | m 和 n 均为非负整数,其中 n<=m。逗号和两个数之间不能有空格。最少匹配 n 次且最多匹配 m 次 | o{1,3} 将匹配 fooooood 中的前三个 o,o{0,1} 等价于 o?。 |
* | 匹配前面的子表达式零次或多次 | zo* 能匹配 z、zo 以及 zoo。* 等价于 {0,} |
+ | 匹配前面的子表达式一次或多次 | zo+ 能匹配 zo 以及 zoo,但不能匹配 z。+ 等价于 {1,} |
? | 匹配前面的子表达式零次或一次 | do(es)? 可以匹配 do 或 does 中的 do。? 等价于 {0,1} |
. | 匹配除 \n 之外的任何单个字符 | 要匹配包括 \n 在内的任何字符,请使用类似 (.|\n) 的模式 |
(pattern) | 匹配 pattern 并获取这一匹配的子字符串。 | 该子字符串用于向后引用。要匹配圆括号字符,请使用 ( 和 )。 |
x | y | 匹配 x 或 y。 | “z|food”能匹配 z 或 food。“(z|f)ood”则匹配 zood 或 food。 |
[xyz] | 字符集合(character class)。匹配所包含的任意一个字符。 | [abc] 可以匹配 plain 中的 a。其中特殊字符仅有反斜线 \ 保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果出现在首位则仅作为普通字符。 |
[^xyz] | 排除型(negate)字符集合。匹配未列出的任意字符。 | [^abc] 可以匹配 plain 中的 plin。 |
特殊符号
特殊符号 | 说明 |
---|---|
[:alnum:] | 代表英文大小写字母及数字,亦即 0-9,A-Z,a-z |
[:alpha:] | 代表任何英文大小写字母,亦即 A-Z,a-z |
[:blank:] | 代表空白键与 [Tab] 按键两者 |
[:cntrl:] | 代表键盘上面的控制按键,亦即包括 CR,LF,Tab,Del… |
[:digit:] | 代表数字而已,亦即 0-9 |
[:graph:] | 除了空白字节(空白键与 [Tab] 按键)外的其他所有按键 |
[:lower:] | 代表小写字母,亦即 a-z |
[:print:] | 代表任何可以被列印出来的字符 |
[:punct:] | 代表标点符号(punctuation symbol),即:”,’,?,!,;,:,#,$… |
[:upper:] | 代表大写字母,亦即 A-Z |
[:space:] | 任何会产生空白的字符,包括空格键,[Tab],CR 等等 |
[:xdigit:] | 代表 16 进位的数字类型,因此包括: 0-9,A-F,a-f 的数字与字节 |
优先级
优先级为从上到下从左到右,依次降低
运算符 | 说明 |
---|---|
| 转义符 | |
(),(?:),(?=),[] | 括号和中括号 |
*,+,?,{n},{n,},{n,m} | 限定符 |
^,$,\ 任何元字符 | 定位点和序列 |
| | 选择 |
15.3 grep命令
|参数 | 说明| |—-|—-| |-E|POSIX 扩展正则表达式,ERE| |-G|POSIX 基本正则表达式,BRE| |-P|Perl 正则表达式,PCRE| |-b |将二进制文件作为文本来进行匹配| |-c |统计以模式匹配的数目| |-i |忽略大小写| |-n |显示匹配文本所在行的行号| |-v |反选,输出不匹配行的内容| |-r |递归匹配查找| |-A n |n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行| |-B n |n 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行| |–color=auto |将输出中的匹配项设置为自动颜色显示|
15.4 sed命令
seq基本命令格式:
sed [参数]… [执行命令] [输入文件]…
|参数| 说明| |—-|—-| |-n |安静模式,只打印受影响的行,默认打印输入数据的全部内容| |-e | 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数| |-f filename |指定执行 filename 文件中的命令| |-r |使用扩展正则表达式,默认为标准正则表达式| |-i |将直接修改输入文件内容,而不是打印到标准输出设备|
sed -i 's/sad/happy/' test
# 表示将test文件中的"sad"替换为"happy"
sed 执行命令格式: [n1][,n2]command [n1][~step]command
内容 | 说明 |
---|---|
n1,n2 | 输入内容的行号 |
, (逗号) | 从 n1 到 n2 行 |
~ (波浪号) | 从 n1 开始以 step 为步进的所有行 |
command | 执行动作 |
#其中一些命令可以加入作用范围
sed -i 's/sad/happy/g' test
# g 表示全局范围
sed -i 's/sad/happy/4' test
# 4 表示指定行中的第四个匹配字符串
常用命令:
命令 | 说明 |
---|---|
s | 行内替换 |
c | 整行替换 |
a | 插入到指定行的后面 |
i | 插入到指定行的前面 |
p | 打印指定行,通常与 -n 参数配合使用 |
d | 删除指定行 |
16 Linux软件安装
16.1 apt(Advance Packaging Tool) 包管理工具
16.1.1 apt-get:网络下载软件包
|工具| 说明| |—-|—–| |install| 其后加上软件包名,用于安装一个软件包| |update | 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表| |upgrade| 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次 update| |dist-upgrade| 解决依赖关系并升级(存在一定危险性)| |remove |移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件| |autoremove| 移除之前被其他软件包依赖,但现在不再被使用的软件包| |purge| 与 remove 相同,但会完全移除软件包,包含其配置文件| |clean |移除下载到本地的已经安装的软件包,默认保存在 /var/cache/apt/archives/| |autoclean| 移除已安装的软件的旧版本软件包|
参数 | 说明 |
---|---|
-y | 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用 |
-s | 模拟安装 |
-q | 静默安装方式,指定多个 q 或者 -q=#,# 表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用 |
-f | 修复损坏的依赖关系 |
-d | 只下载不安装 |
–reinstall | 重新安装已经安装但可能存在问题的软件包 |
–install-suggests | 同时安装 APT 给出的建议安装的软件包 |
16.1.2 -chace:针对本地数据进行相关操作
sudo apt-cache search softname1
# 本地搜索某软件包
16.2 dpkg:从本地磁盘安装
参数 | 说明 |
---|---|
-i | 安装指定 deb 包 |
-R | 后面加上目录名,用于安装该目录下的所有 deb 安装包 |
-r | remove,移除某个已安装的软件包 |
-I | 显示 deb 包文件的信息 |
-s | 显示已安装软件的信息 |
-S | 搜索已安装的软件包 |
-L | 显示已安装软件包的目录信息 |