Linux Cammand Line 阅读笔记

本文最后更新于:2021年10月25日 下午

1.引言

  • 人们说,“图形用户界面让简单的任务更容易完成,而命令行界面使 完成复杂的任务成为可能”,到现在这句话仍然很正确。

2.什么是shell

2.1终端仿真器

shell 就是一个程序,它接受从键盘输入的命令,然后 把命令传递给操作系统去执行

当使用图形用户界面时,我们需要另一个和 shell 交互的叫做终端仿真器的程序。

2.2第一次按键

用户名 @ 主机 名,紧接着当前工作目录和一个美元符号

如果提示符的最后一个字符是“#”, 而不是“$”, 那么这个终端会话就有超级用户权限。 这意味着,我们或者是以 root 用户的身份登录,或者是我们选择的终端仿真器提供超级用户 (管理员)权限。

2.3命令历史

默认保存500

  • 上箭头得到上一次命令

  • 按下鼠标左键拖动快速复制,鼠标中键粘贴==不要用ctrl c==

  • 设置聚焦跟随鼠标代替单机聚焦,可以使复制粘贴更方便

2.4简单命令

1
2
3
4
5
date
cal //显示月历
df //显示磁盘剩余空间
free //空闲内存
exit //终止会话

2.5幕后控制台

  • 按下 Ctrl-Alt-F1 到 Ctrl-Alt-F6 访问

  • 当一个会话被访问的时候,它会显示登录提示框,我们需要输入用户名和密码。

  • 要从一 个虚拟控制台转换到另一个,按下 Alt 和 F1-F6(中的一个)。返回图形桌面,按下 Alt-F7

3.文件系统中跳转

3.1文件系统树

  • 分层目录结构组织文件,所有文件组成一颗树型目录,倒置的树
  • 总是只有一个单一的文件系统树,不管存储设备的连接(不像 Windows ,每个存储设备都有一个独自的文件系统)

3.2当前工作目录

1
2
3
pwd		//print working directory显示当前目录
ls //列出一个目录包含的文件以及子目录
ls -a
  • 当我们首次登录系统(或者启动终端仿真器会话)后,当前工作目录是我们的家目录。每个d用户都有他自己的家目录,当用户以普通用户的身份操控系统时,家目录是唯一允许用户写入文件的地方。
  • 以 “.” 字符开头的文件名是隐藏文件,用ls -a命令
  • image-20210509210658151

3.4更改当前工作目录

1
2
3
cd /usr/bin			//绝对路径
cd .. //相对路径回到usr
cd ./bin //相对路径进入bin也可以直接cd bin
  • 绝对路径从根目录开始,直到它的目的地,而相对路径开始于工作目录
  • 符号 “.” 指的是工作目录,”..” 指的是工作目录的父目录
  • ==./是隐含的可以省略==

image-20210503151718776

  • 文件名和命令名是大小写敏感的
  • 文件没有拓展名,文件名可能包含空格,标点符号,但标点符号仅限 使用“.”,“-”,下划线,但是不要使用空格

4.探究操作系统

4.1ls

1
2
3
ls /usr			//指定别的目录
ls ~ /usr //指定多个目录(家目录和usr目录
ls -l //以长模式输出
  • 家目录用**~**代表

4.2选项和参数

  • 大多数命令使用的选项,是由一个中划线加上一个字符组成,例如,“-l”,但是许多命令, 包括来自于 GNU 项目的命令,也支持长选项,长选项由两个中划线加上一个字组成。

image-20210503153258807

4.3长格式输出

image-20210503153900813

4.4确定文件类型

1
file filename		//file命令打印文件内容的简单描述

4.5用less浏览文件内容

  • 系统配置文件以文本格式储存
1
2
less filename
less /etc/passwd

按下q键退出less程序

image-20210503154749096

image-20210503154821201

4.6浏览文件

目录文件概览

image-20210503163447945

image-20210503163522307

image-20210503163533077

5.操作文件和目录

5.1通配符

1
ls /usr/bin/t*

image-20210503164153279

image-20210503164224977

image-20210503164238485

image-20210503164255229

5.2mkdir创建目录

1
2
mkdir directory... 		//三个点表示参数可重复
mkdir dir1 dir2 dir3

5.3cp复制文件或目录

1
2
cp item1 item2		//复制单个文件或目录item1到item2
cp item... directory //复制多个项目到一个目录下

image-20210503165042706

image-20210503165106591

5.4mv移动和重命名文件

1
2
mv item1 item2
mv item... directory

image-20210503165417114

5.5rm删除文件和目录

1
rm item...

image-20210503165621012

5.6ln创建链接

1
2
ln file link			//创建硬链接
ln -s item link //创建符号链接

5.7硬链接

  • 一个硬链接不能关联它所在文件系统之外的文件。

  • 一个硬链接不能关联一个目录。

5.8符号链接(软链接/symlink)

  • 类似于windows的快捷方式,其本身与其他符号链接几乎没有区别
  • 向符号链接写入,写入相关联的文件,删除符号链接不会删除文件自身
  • 坏链接为红色

5.9 playground练习(很重要)

  • cp命令至少两个地址(本地用.)
  • cp -v 看详细做了什么, -i 获得提示
  • mv要么两个地址(移动),要么改名字
  • ln创建链接 -s符号链接 跟文件和目录
  • ls -li 可以看到文件索引结点
  • 创建符号链接可以绝对路径也可以相对路径

6.使用命令

6.1命令四种形式

  • 可执行程序,编程语言或脚本语言写成
  • 内建于shell自身的命令,内建命令
  • shell函数,即小规模shell脚本,混合到环境变量中
  • 命令别名,自定义命令建立在其他命令之上

6.2 type显示命令的类型

1
2
type type
type ls

6.3 显示一个可执行程序的位置

1
which ls

这个命令只对可执行程序有效,不包括内建命令和命令别名,别名是真正的可执行程序的替代物

6.4 help得到shell内建命令的帮助文档

1
2
help cd
mkdir --help

–help显示用法信息

6.5 man显示程序手册页

1
man ls

man使用less显示参考手册,可以使用less命令进行浏览

man参考手册分成的章节:

image-20210509164918894

image-20210509164939272

1
man 5 passwd

如果不成功显示No manual entry for passwd in section 5

则需要yum install man-pages

6.6 apropos显示适当的命令

1
2
apropos floppy
man -k floppy //功能同上

输出结果每行的第一个字段是手册页的名字,第二个字段展示章节

6.7 whatis显示简洁的命令说明

1
whatis 命令/系统调用/库函数/特殊文件名

相当于man -f

6.8 info显示程序info条目

1
info ls

info 文件是树型结构,包含超链接,可以从*号处跳转到另一个结点

image-20210509171548454

6.9 README以及其他程序文档

  • 许多安装在你系统中的软件,都有自己的文档文件,这些文件位于/usr/share/doc 目录下。大多数是以文本文件的形式存储的,可用 less 阅读器来浏览。

  • 以 “.gz” 结尾的文件表示 gzip压缩程序已经压缩了这些文件。gzip软件包包括一个特殊的 less 版本,叫做 zless,zless 可以显示由 gzip 压缩 的文本文件的内容。

6.10用别名(alias)创建命令

1
2
3
4
alias foo='cd /usr; ls; cd -'
alias name='string' //格式
type foo
unalias foo //删除别名
  • 在命令 “alias” 之后,输入“name”,紧接着(**没有空格 **)是一个等号,等号之后是一串用引 号引起的字符串,字符串的内容要赋值给 name。

  • 通常经常使用的命令带有普遍用到的选项,例如 ls is aliased to `ls –color=auto’,使用不带参数的alias查看默认定义的别名

  • ==在命令行中定义别名有点儿小问题。当你的 shell 会话结束时,它们会消失。==

7.I/O重定向

7.1标准输入输出和错误

  • 默认情况下,标准输出stdout和标准错误都连接屏幕而不是磁盘文件。
  • 标准输入stdin默认情况下连接键盘
  • I/O重定向允许我们更改输出地点和输入来源

7.2标准输出重定向

  • > 重定向符接文件名
1
2
ls -l /usr/bin > ls-output.txt		//直接创建文件
less le-output.txt
  • 当我们使用 “>” 重定向符来重定向输出结果时,目标文件总是 从开头被重写(如果错误了就清空文件)
1
2
> ls-output.txt			//故意用重定向符来清空文件内容
ls -l /usr/bin >> ls-output.txt
  • 用 >> 操作符可以把输出结果加到文件内容之后,如果文件不存在则会被创建

7.3标准错误重定向

  • 一一个程序可以在几个编号的文件流中的任一个上产生输出。前三个称作标准输入、输出和错误,shell 内部分别将其称为文件描述符 0、1 和 2
1
ls -l /bin/usr 2> ls-error.txt		//测试错误输出

7.4 重定向标准输出和错误到同一个文件

  • 方法一
1
ls -l /bin/usr > ls-output.txt 2>&1			

完成两个重定向,首先重定向标准输出到文件,然后重定向标准错误到标准输出,用2>&1。

注意重定向的顺序安排非常重要。标准错误的重定向必须总是出现在标准输出重定向之后, 要不然它不起作用。

1
2
> ls-output.txt 2>&1	//重定向标准错误到文件 ls-output.txt
2>&1 > ls-output.txt //标准错误定向到屏幕
  • 方法二
1
ls -l /bin/usr &> ls-output.txt

用 &> 来重定向标准输出和错误到文件 ls-output.txt

7.5处理不需要的输出

  • 不想要一个命令的输出结果,系统重定向输出结果到 /dev/null 的特殊文件
1
ls -l /bin/usr 2> /dev/null

7.6 cat连接文件

  • cat 命令读取一个或多个文件,然后复制它们到标准输出
1
2
3
cat [file]			//复制到标准输出
cate ls-output.txt //显示简短的文本文件
cat -n textfile1 > textfile2 //把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里,换成>>为附加到文档中
1
2
3
4
cat	> lazy_dog.txt	//等待输入
wowowo. //ctrl d结束
cat lazy_dog.txt //复制文件内容到标准输出
cat < lazy_dog.txt //重定向标准输入,输入源为lazy_dog.txt

7.7管道线

  • 管道线使得标准输入读取数据并输送到标准输出,一个命令的标准输出可以通过管道传到另一个命令的标准输入
1
2
command1 | command2
ls -l /usr/bin | less //不加less则直接输出到最后一行等待下一步命令,有less变成浏览文本文件
  • 可以很方便的检测会产生标准输出的命令的运行结果

7.8过滤器

  • 用来对数据完成复杂操作,把几个命令放在一起组成一个管道线,过滤器接受输入,以某种方式改变它,然后输出它。
1
ls /bin /usr/bin | sort | less			//产生两个目录的有序列表

7.9 uniq 报道或忽略重复行

  • uniq 经常和 sort 命令结合起来一起使用,默认情况下在数据列表中删除任何重复行
1
2
ls /bin /usr/bin | sort | uniq | less
ls /bin /usr/bin | sort | uniq -d | less //只看重复数据列表

7.10 wc 打印行数字数和字节数

  • wc(字计数)命令是用来显示文件所包含的行数、字数和字节数。
  • 如果 wc 不带命令行参数,它接受标准输入。“-l” 选项限制命令输出只能报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数
1
2
wc ls-output.txt
ls /bin /usr/bin | sort | uniq | wc -l

7.11 grep打印匹配行

  • grep用来找到文件中的匹配文本
1
2
grep pattern [file...]		//使用方法
ls /bin /usr/bin | sort |uniq | grep zip //找到文件名中包含单词zip的所有文件
  • grep -i 忽略大小写 -v 只打印不匹配的行

7.12 head/tail打印文件开头部分/结尾部分

1
2
3
4
head -n 5 ls-output.txt
tail -n 10 ls-output.txt
ls -l /usr/bin | tail -n 5 //用于管道线中
tail -f /var/log/messages //循环读取,跟踪增长情况

7.13 tee从stdin读取数据,并同时输出到stdout和文件

  • tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动和一个或多个文件。当在某个中间处理阶段来捕捉一个管道线的内容时,这很有帮助。
1
ls /usr/bin | tee ls.txt | grep zip
  • 在 grep 过滤 管道线的内容之前,来捕捉整个目录列表到文件 ls.txt

8.从shell眼中看世界

8.1 (字符)展开

  • echo 命令显示一行文本
1
2
echo this is a test			//测试echo
echo * //观察*的展开,打印了所有文件
  • shell 中 * 会被展开,当回车键被按下时,shell 在命令被执行前在命令行上自动展开任何符合条件的字符,所以 echo 命令的实际参数并不是 “*”,而 是它展开后的结果。

8.2 路径名展开

  • 通配符所依赖的工作机制叫做路径名展开
1
echo /usr/*/share
  • 隐藏文件的路径名展开
1
2
echo .*		//隐藏文件均以原点开头,但是输出包含 '.''..'
ls -d .* | less //-d表示只显示当前目录文件,展开正确

image-20210509211225734

8.3波浪线展开

  • 用在一个单词开头时,它会展开成指定用户的家目录名,如果没有指定用户名,则展开成当前用户的家目录
1
2
echo ~
echo ~root

8.4 算术表达式展开

1
2
echo $((expression))
echo 5+$((9-8))

8.5 花括号展开

1
echo Front-{A,B,C}-Back
  • 花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式 本身可能包含一个由逗号分开的字符串列表,或者一个整数区间,或者单个的字符的区间。这 种模式不能嵌入空白字符
1
2
echo Number {1..5}
echo {Z..A}
  • 花括号展开可以嵌套,最常见的应用是,创建一系列的文件或目录列表
1
2
3
4
mkdir Pics
cd Pics
mkdir {2007..2019}-0{1..9} {2007..2019}-{10..12}
ls

8.6 命令替换

  • 命令替换允许我们把一个命令的输出作为一个展开模式来使用
  • 不只限制于简单命令,也可以使用整个管道 线
1
2
ls -l $(which cd)	//which得到cd命令的地址,ls显示文件信息
file $(ls /usr/bin/* | grep zip) //用于管道线,管道线输出结果为file命令的参数列表

8.7 引用

  • 双引号 把文本放在双引号中,shell 使用的特殊字 符,都失去它们的特殊含义,被当作普通字符来看待
  • 在双引号中,参数展开算术表达式展开和命令替换仍然有效
1
2
3
ls -l "two words.txt"		//防止单词分割
echo $(cal)
echo "$(cal)" //在第一个实例中,没有引用的命令替换导致命令行包含38 个参数。在第二个例子中,命令行只有一个参数,参数中包括嵌入的空格和换行符。
  • 单引号 禁止所有展开,包括转义字符
1
2
3
echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'

image-20210516212438539

8.8 转义字符

  • \ 作为转义字符,阻止展开消除特殊含义字符(比如$)
  • 在文件名包含特殊字符时起作用
1
2
echo "The balance for user $USER is: \$5.00"
echo "The balance for user $USER is: $5.00"

9 键盘高级操作

9.1 移动光标

image-20210516214256754

image-20210516214317134

9.2 修改文本

image-20210516214447911

9.3 剪切和粘贴文本

image-20210516214558968

9.4 自动补全

  • 按下tab,自动补全路径名对变量补全用户名命令主机名

image-20210516215654911

9.5 利用历史命令

  • 搜索历史命令
1
2
3
history | less 		//浏览历史列表的内容
history | grep /usr/bin
!88 //展开历史列表中88行的内容
  • ctrl-r进入搜索

image-20210516220947075

image-20210516220959790

9.8 历史命令展开

image-20210516221107108

10 权限

10.1 拥有者、组成员和其他人

1
id		//显示用户id并且映射到一个用户名
  • 用户帐户定义在/etc/passwd 文件里面,用户组定义在/etc/group

10.2 读取写入和执行

image-20210517082421786

image-20210517082452333

  • 剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执 行权限。
owner group world
rwx rwx rwx
属性 文件 目录
r 允许打开并 读取文件内 容 允许列出目录中的内容,前提是目录必须设置了可执 行属性(x)
w 允许写入文 件内容或截 断文件。但 是 不允 许 对文件进行重命名或删 除,重命名 或删除是由 目录的属性 决定的 允许在目录下新建、删除或重命名文件,前提是目录 必须设置了可执行属性(x)
x 允许将文件 作为程序来 执行,使用 脚本语言编 写的程序必 须设置为可 读才能被执 行。 允许进入目录,例如:cd directory

image-20210517084100337

10.3 chomod更改文件模式

分为八进制表示法和符号表示法两种

  • 八进制对应3个二进制数字,正好用于映射存储文件模式所使用的方案

image-20210517084424709

image-20210517084701149

chomod 600 foo.txt

  • 常见映射7 (rwx),6 (rw-),5 (r-x),4 (r–),和 0 (—)

image-20210517084931091

符号表示法 操作内容
u+x 为文件所有者添加可执行权限
u-x 为文件所有者添加可执行权限
+x 为文件所有者,用户组,和其他所有人添加可执行权限。等 价于 a+x
o-rw 除了文件所有者和用户组,删除其他人的读权限和写权限
go=rw 给文件所属的组和文件所属者/组以外的人读写权限。如果 文件所属组或其他人已经拥有执行的权限,执行权限将被移 除
u+x,go=rw 给文件拥有者执行权限并给组和其他人读和执行的权限。 多种设定可以用逗号分开

10.4 借助GUI来设置文件模式

  • 右击文件或者目录图标

image-20210517085505660

10.5 umask设置默认权限

umask值 权限
0000 -rw-rw-rw-
0002 -rw-rw-r–

有二进制数字1的位置属性被删除

image-20210517090349654

1
2
umask			//得到掩码值
umask 0000 //设置掩码值
  • setuid、setgid、sticky位特殊权限

image-20210517093707217

1
2
3
chmod u+s program	//授予一个程序 setuid 权限
chmod g+s dir //授予一个目录 setgid 权限
chmod +t dir //授予一个目录 sticky 权限
属性 结果
具有 setuid 属性的程序 -rw**s**r-xr-x
具有 setgid 属性的目录 drwxrw**s**r-x
设置了 sticky 位的目录 drwxrwxrwt

10.6 更改身份

  1. 注销系统并以其他用户身份重新登录系统。
  2. 使用 su 命令
  3. 使用 sudo 命令

10.7 su命令

1
su [-[l]] [user]
  • 如果包含 “-l” 选项,那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户 的 shell 环境,并且工作目录会更改到这个用户的家目录。这通常是我们所需要的。**-l可以缩写为-**

  • 如果不指 定用户,那么就假定是超级用户

  • 输入exit回到原来的shell

1
2
su -c 'command'		//格式
su -c 'ls -l /root/*'
  • 传递命令command到新的shell中执行,而不启动这个shell,引号防止命令展开

10.8 sudo命令

  • sudo 命令不要求超级用户的密码,使用 sudo 命令时,用户 使用他/她自己的密码来认证
  • 管理员能够配置 sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令
  • su 和 sudo 之间的一个重要区别是 sudo 不会重新启动一个 shell,也不会加载 另一个用户的 shell 运行环境

10.9 chown更改文件所有者和用户组

1
chown [owner][:[group]] file

image-20210517092431871

1
2
3
4
5
6
7
[janet@linuxbox ~]$ sudo cp myfile.txt ~tony		//用户 janet 把文件从她的目录复制到 tony 的家目录
Password:
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 root root 8031 2008-03-20 14:30 /home/tony/myfile.txt
[janet@linuxbox ~]$ sudo chown tony: ~tony/myfile.txt //janet 把文件所有者从 root(使用 sudo 命令的原因)改到 tony,同时把文件用户组改为 tony 登录系统时,所属的用户组,碰巧是用户组 tony
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 tony tony 8031 2008-03-20 14:30 /home/tony/myfile.txt

可能存在的问题:

  • 系统中默认的掩码值是 0022,这会禁止用户组成员编辑 属于同组成员的文件,修改掩码值解决

  • 用户组成员创建的文件和目录的用户组,将会设置为用户的主要组,而不是想要的用户组,设置此目录的setgid位来解决

10.10 更改用户密码

1
passwd [user]
  • 如果你具有超级用户权限,你可以指定一个用户名作为 passwd 命令的参数,这样可以设置 另一个用户的密码。还有其它的 passwd 命令选项对超级用户有效,允许帐号锁定,密码失效,详细内容参考 passwd 命令的手册页

还有一系列的命令行程序,可以用来创建和维护用户和用户组:

  • adduser
  • useradd
  • groupadd

11 进程

11.1 ps查看进程

1
2
3
ps
ps x //显示所有进程
ps aux //显示所有进程并获得详细信息
  • stat状态含义

image-20210520000339163

11.1 top查看进程

1
top			//动态显示进程
  • h查看帮助,q退出

image-20210520150337666

11.2信号

kill命令可以像进程发送信号,默认是term

注意,信号既可以用号码,也可以用名字来 指定,包括在前面加上字母“SIG”的名字

image-20210520151425593

1
2
kill -signal PID
kill -1 13546

image-20210520151123810

image-20210520151509766

image-20210520151519019

11.3 killall向多个进程发送信号

1
killall [-u user] [-signal] name...

10.4 关闭系统

4种方式

halt poweroff reboot shutdown

1
2
3
sudo reboot
sudo shutdown -h now //挂起
sudo shutdown -r now //重启

image-20210520153312540

12 环境

12.1检查环境

1
2
3
4
printenv | less
printenv USER //列出指定环境变量的值
set | less
echo $HOME //用echo命令查看变量内容
  • 环境中的别名无法使用set命令和printenv命令显示,想要查看别名,可以使用不包含参数的alias
  • 查找用/ ,区分大小写

12.2 值得注意的环境变量

image-20210520190132204

image-20210520190143788

12.3 如何建立环境

  • 是登录 shell 会话

image-20210520190605756

image-20210520190645227

  • 非登录shell会话

image-20210520190712283

非登录 shell 会话也会继承它们父进程的环境设置,通常是一 个登录 shell

12.4 启动文件

  • 当我们 输入 ls 后,shell 不会查找整个计算机系统来找到 /bin/ls(ls 命令的全路径名),相反,它查找 一个目录列表,这些目录包含在 PATH 变量中
1
PATH=$PATH:$HOME/bin		//修改 PATH 变量,添加目录 $HOME/bin 到目录列表的末尾

12.5 修改环境、使用文本编辑器

  • 添加目录到你的 PATH 变量或者是定义额外的环境变量,要把这些更改放置 到.bash_profile 文件中
1
gedit some_file			//如果所输入的文件名不存在,编辑器则会假定你想要创建一个新文件
  • 当我们编辑一个重要的配置文件时首先创建一个这个文件的备份总是一个不错的主意这样能避免我们在编辑文件时弄乱文件
1
cp .bashrc .bashrc.bak
  • ctrl O 保存文件,ctrl X 退出

image-20210520192935152

  • 我们对于文件.bashrc 的修改不会生效,直到我们关闭终端会话,再重新启动一个新的会话,因 为.bashrc 文件只是在刚开始启动终端会话时读取。然而,我们可以强迫 bash 重新读取修改过 的.bashrc 文件,用命令
1
source .bashrc

13 vi入门

13.1 启动和退出

1
2
3
4
vi			//启动vi
:q //退出vi
:q! //强制退出(一般是修改没保存)
//连按两下esc可以回到命令模式

13.2 编辑模式

  • 刚进入vi进入到命令模式,每一个按键都是命令,按i键进入输入模式

  • 按两下esc回到命令模式,输入:w保存

  • 小贴示:如果你阅读 vim 的文档,你会发现命令模式被(令人困惑地)叫做普通模式(normal mode),ex 命令叫做命令模式

13.3 光标移动

image-20210520194709123

  • G是大写,要配合shift
  • vi命令都可以加上数字前缀,5j可以使光标下移5行

13.4 基本编辑

追加

  • insert命令做不到

  • a 命令,在当前光标后追加(进入插入模式)

  • A命令,在当前行末尾追加(进入插入模式)

新建

image-20210520195958743

删除

image-20210520200056415

  • 手速要快
  • 按u撤销删除

剪切复制和粘贴

  • d 命令不仅删除文本,它还“剪切”文本。每次我们使用 d 命令,删除的部分被复制到一 个粘贴缓冲区中(看作剪切板)
  • y命令复制文本

image-20210520201812389

命令 功能
p 粘贴至下一行(无论光标在这一行的哪里)
P 粘贴至上一行(无论光标在这一行的哪里)

合并

  • J 命令合并光标所在行与下一行

13.5 搜索和替换

搜索

  • 行内搜索fa 命令;按 ; 继续行内搜索
  • 搜索整个文件 /,重复搜索n即可

全局搜索和替换

1
2
3
:%s/Line/line/g			//把文件中所有的单词Line都更改为line
:1,$s/Line/line/g //与前面那个一样
:%s/line/Line/gv //把line改回去,c要求每一次替换前确认替换

image-20210520203830502

image-20210520210031330

13.6 编辑多个文件

1
2
3
4
5
vim file1 file2 file3...	//用vi会出现问题(可能vi不支持)
:bn //切换到下一个文件(强制切换加上!)
:bp //切换到上一个文件
:buffers //显示缓冲区
:buffer 1
  • 载入更多文件
1
:e ls-output.txt
  • 将一个文件的内容复制到另一个文件: 用yy复制buffer切换p粘贴即可
  • 将整个文件插入另一个文件(注意是在光标位置之后
1
:r foo.txt		//在光标位置之后将文件读入并

13.7 保存工作

  • 在命令模式下输入 ZZ 即可
  • 输入:w
  • 另存为 :w foo1.txt (注意这样是另存为foo1,现在仍在编辑foo)

14. 定制提示符

14.1 分解提示符

1
2
echo $PS1
[\u@\h \W]\$
  • 转移字符表

image-20210520212857378

14.2 换一种提示符

1
2
3
ps1_old="$PS1"				//首先备份现有的提示符
PS1="$ps1_old" //恢复原有的提示符
PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\]" //前一个使输出系统信息为红色,后一个使输入文字信息为黑色
  • image-20210520214444090

  • 背景颜色

image-20210520214456315

  • 光标设置

image-20210520214523060

  • PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$"使用上面的编码,我们将构建一个提示符,每次当这个提示符出现的时候,会在屏幕的上方 画出一个包含时钟(由黄色文本渲染)的红色长条

image-20210520214744772

image-20210520214754413

14.3 保存提示符

  • 把下面两行添加到.bashr文件中去
1
2
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$"
export PS1

15 软件包管理

15.1 打包系统

image-20210521001903091

15.2 软件包的工作方式

  • Linux系统中几乎所有的软件都可以在互联网上找到。其中大多数软件由发行商以包文件的形式提供,剩下的则以源码形式存在,可以手动安装。
  • 在包管理系统中软件的基本单元是包文件。包文件是一个构成软件包的文件压缩集合。一个软件包可能由大量程序以及支持这些程序的数据文件组成。
  • 系统发行版的用户可以在一个中心资源库中得到这些软件包,这个资 源库可能包含了成千上万个软件包,每一个软件包都是专门为这个系统发行版建立和维护的。
  • 程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软 件包时,其所有的依赖也被安装。

image-20210521002838341.png

15.3 常见的软件包管理任务

查找

image-20210521004022448

安装

  • 下载安装

image-20210521004553392

  • 下载好文件直接安装

image-20210521004702263

卸载

image-20210521004901986

更新

image-20210521004921977

  • 通过下载的软件包升级

image-20210521004952589

列出

image-20210521005010163

确认是否安装

image-20210521005036005

显示安装包信息

image-20210521005059496

查找安装了某个文件的包

image-20210521005132673

16 存储介质

16.1存储设备的挂载与卸载

  • Linux 在单一文件系统树中维 护连接在各个节点的各种设备。在MS-DOS 和 Windows 系 统中,每个设备(例如 C:\,D:\,等)保持着单独的文件系统树

  • 文件 /etc/fstab 列出了系统启动时要挂载的设备 cat /etc/fstab

image-20210521083937799

image-20210521083901885

  • 查看已挂载的文件系统列表 mount命令

若有光盘:image-20210521084629825

1
2
3
umount /dev/hdc									//卸载CDROM(需要root权限)
mkdir /mnt/cdrom //建立新目录
mount -t iso9660 /dev/hdc /mnt/cdrom //将CDROM挂载到新的挂载点,-t指定文件系统类型

image-20210521084925810

16.2 确定设备名称

  • 列出/dev 目录下的内容 ls /dev

image-20210521085528629

  • tail -f /var/log/messages 对操作系统实时监测,插入设备观察设备名称,知道设备名称之后挂载设备
  • 挂载之后设备只要不拔下来,并且系统不重启,设备名称就不会发生变化
  • df命令显示目前在 Linux 系统上的文件系统磁盘使用情况统计

16.3 创建新文件系统

用fdisk修改文件系统

1
2
3
4
5
6
7
8
sudo umount /dev/sdb1
sudo fdisk /dev/sdb
Command (m for help):m //显示菜单
Command (m for help):p //显示设备分区表
Command (m for help):l //显示可能的文件系统列表及对应的id
Command (m for help):t //修改
Hex code (type L to list codes): 83
Command (m for help):w //保存

使用mkfs创建新的文件系统

make file system

1
2
sudo mkfs -t ext3 /dev/sdb1				//指定ext4为文件系统类型
sudo mkfs -t vfat /dev/sdb1 //指定vfat为文件系统类型

16.4 文件系统的检查与修复

  • sudo fsck /dev/sdb1修复损坏的文件系统
  • 已修复的文件会存放在各个文件系统根目录下的lost+found 目录里面

16.5 设备之间直接移动数据

  • dd命令实现将数据块从一处复制到另一处
1
2
3
4
5
dd if=input_file of=output_file [bs=block_size [count=blocks]]
dd if=/dev/sdb of=/dev/sdc //如果连接两个设备到计算机上,它们各自被分配到设备/dev/sdb和/dev/sdc
上把第一个驱动器中的所有数据复制到第二个驱动器中
dd if=/dev/sdb of=flash_drive.img //如果只有第一个驱动器被连接到计算机上,我们可以把它的内容复制到一个普通文件
中供以后恢复或复制数据

==注意==:

dd命令的功能非常强大,起名取自“data definition”(数据定义),然而有时候也会被成为“destory disk”(摧毁磁盘),因为用户经常不小心输错if 或者of 说明。在Enter之前,一定要检查一遍if of说明

向可刻录CD写入数据

写入一个可记录的 CD-ROM(一个 CD-R 或者是 CD-RW)由两步组成

  • 首先,构建一个 iso 映像文件,这就是一个 CD-ROM 的文件系统映像
  • 第二步,把这个映像文件写入到 CD-ROM 媒介中。

创建iso映像文件

1
2
3
dd if=/dev/cdrom of=ubuntu.iso				//使用 dd 命令来读取 CD-ROW 中的所有数据块,并把它们复制到本地文件中
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files //用genisoimage命令来从文件集合中创建一个映像
//“-R” 选项添加元数据为 Rock Ridge 扩展,这允许使用长文件名和 POSIX 风格的文件权限。 “-J” 选项使 Joliet 扩展生效,这样Windows中就支持长文件名了

写入CD-ROM中

  • 直接挂载iso映像文件
1
2
3
4
mkdir /mnt/iso_image										//创建挂载点
mount -t iso9660 -o loop image.iso /mnt/iso_image //使用mount命令的-o loop选项、指定文件系统类型的-t iso9660选项,将iso映像文件当作设备挂载到文件系统树(可以把它当作真实的CD使用)
md5sum image.iso //使用md5sum命令产生十六进制书校验文件(检查完整性)
md5sum /dev/cdrom
  • 擦除可刻录CD、刻录映像文件
  • image-20210521101401935

17 联网

17.1 网络检查与监控

ping

  • ping命令: ping 命令发送一个特殊的网络数据包,叫做 ICMP ECHO_REQUEST,到一台指定的主机。大多数接收这个包的网络设备将会回复它,来 允许网络连接验证

  • 注意:大多数网络设备(包括 Linux 主机)都可以被配置为忽略这些数据包。通常,这样 做是出于网络安全原因,部分地遮蔽一台主机免受一个潜在攻击者地侵袭。配置防火墙来阻塞 IMCP 流量也很普遍。

traceroute

  • traceroute程序完整过程:首先它发送一份TTL字段为1的IP数据包给目的主机,处理这个数据包的第一个路由器将TTL值减1,然后丢弃该数据报,并给源主机发送一个ICMP报文(“超时”信息,这个报文包含了路由器的IP地址,这样就得到了第一个路由器的地址),然后traceroute发送一个TTL为2的数据报来得到第二个路由器的IP地址,继续这个过程,直至这个数据报到达目的主机
  • 输出结果中会列出网络流量从本地系统到指定主机的所有跳(hop)数,其中没有提供标识信息的路由器用*号表示

ip

  • ip a检查系统的网络接口和路由表
  • 当执行日常网络诊断时,要查看的重要信息是每个网络接口第四行开头出现的单词“UP”, 说明这个网络接口已经生效,还要查看第二行中 inet字段出现的有效 IP 地址。

netstat

  • netstatt 程序被用来检查各种各样的网络设置和统计数据。通过此命令的许多选项,我们可以看 看网络设置中的各种特性
  • 使用“-ie”选项,我们能够查看系统中的网络接口
  • “-r”选项能够显示内核的网络路由表,从中能够看出分组时如何在网络之间传送的

17.2 通过网络来传输文件

ftp

  • FTP指的是协议,ftp指的是与之同名的程序
命令 功能
ftp fileserver 连接名叫fileserver的ftp服务器
cd pub/ 在大多数匿名的 FTP 服务器中,支持公共 下载的文件都能在目录 pub 下找到
lcd Desktop 将本地目录改为 ~/Desktop,ftp程序工作目录默认在 ~/Desktop下
get …iso 将远程系统文件传至本地,即~/Desktop
bye 登出远程服务器
  • lftp-更好的ftp:包括多协议支持(包括 HTTP),若下载失败会自动地重新下载, 后台处理,用 tab 按键来补全路径名

wget

  • 支持递归下载、后台下载、断点续传

wget http://linuxcommand.org/index.php

17.3 与远程主机的通信

  • 都在OpenSSH包中

ssh(Secure Shell)

  • 认证身份
  • 加密本地与远程主机通信(从22端口)

SSH 由两部分组成。(必须都要安装)

1.SSH服务端运行在远端主机上,在端口 22 上监听收到的外部连接

2.SSH客户端用在本地系统中,用来和远端服务器通信

命令 功能
ssh bob@remote-sys 以用户bob的身份连接远程主机
ssh remote-sys free 在远程主机上运行free命令并在本地显示结果
ssh remote-sys 'ls *' > dirlist.txt 输出到本地主机文件(ls命令用单引号括起来防止在本地展开)
ssh remote-sys 'ls * > dirlist.txt' 输出到远程主机(注意单引号位置)
ssh -X remote-sys;xload 在远程主机上运行xload窗口出现在本地主机(-X传界面)

scp与sftp

scp

  • scp(安全复制)被用来复制文件,与熟悉的 cp 程序非常相似。最显著的区别就是源或者目标 路径名要以远端主机的名字,后跟一个冒号字符开头
1
scp bob@remote-sys:document.txt			//以bob账号登入远程主机并复制文件

sftp

  • ftp 程序的安全替代品,是 sftp 不需要远端系统中运行 FTP 服务端。 它仅仅需要 SSH 服务端。这意味着任何一台能用 SSH 客户端连接的远端机器,也可当作类似 于 FTP 的服务器来使用。

  • 用法参照ftp

18 查找文件

18.1 locate查找文件

  • locate bin/zip列出所有以zip开头的程序,目录以bin/结尾的程序

  • 结合grep命令使用更高效

  • image-20210521150632972

18.2 find-复杂的文件的查找方法

1
2
find ~			//指定一个目录为查找范围
find ~ | wc -l

测试条件

1
2
3
find ~ -type d | wc -l				//type d限制只查找目录
find ~ -type f | wc -l //限制只查找普通文件
find ~ -type f -name "*.JPG" -size +1M | wc -l //查找所有匹配*.JPG而且大于1MB的普通文件(加入双引号防止路径名扩展)

image-20210521151825372

image-20210521151931893

image-20210521151953549

操作符

  • 查找权限不为0600的文件和权限不为0700的目录
1
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

image-20210521154546432

  • 注意默认使用and 以及括号组合字符
  • 对于被分隔的表达式,不一定默认求值 expr1 -operator expr2

image-20210521154738960

预定义操作

  • -print 为默认操作

image-20210521154921293

1
2
find ~ -type f -name '*.bak' -print						//先筛选再print
find ~ -print -type f -name '*.bak' //先print再筛选
  • 在使用delete命令之前,先用print检查输出,确保万无一失

自定义操作

  • find的-exec选项
  • command是命令名, {} 是代表当前路径名的符号, ; 作为分隔符,表示命令结束(需要转义,用\ 和 ‘’ 都可以)
1
2
3
-exec command {} ;					//-exec操作用法
find ~ -type f -name '.*' -exec ls -l '{}' ';' //在当前目录下,找到所有的隐藏文件并ls -l输出
find ~ -type f -name '.*' -ok ls -l '{}' ';' //加入 -ok 在执行操作前提示用户
  • 提高效率 (使用xargs 或者find命令自身新特性)

将结尾的分号改成加号,就能让find命令将查找结果组合成参数列表,共指定的命令一次性使用

1
find ~ -type f -name '.*' -exec ls -l '{}' +

虽然得到一样的结果,但是只执行了一次ls命令

xargs

  • 从标注输入接受输入,将其转换为指定命令的参数列表
  • 命令参数数量不是无限制的,超出shell支持的最大参数xargs会重复使用最大参数直至完成
1
2
find ~ -type f -name '.*' -print | xargs ls -l		//find命令的输出结果通过管道传给了xargs命令,后者构造ls命令的参数列表,然后执行该命令
find ~ -type f -name '.*' -print | xargs --show-limits ls -l //执行xargs 时加入--show-limits显示最大支持参数(注意是在xargs命令后面加入)

image-20210521164911871

18.3 实战演练

  • mkdir -p 命令创建指定路径的父目录以及子目录
  • touch 命令通常被用来设置或更新文件的访问,更改,和修改时间。如果一个文件名参数是一个不存在的文件,则会创建一个空文件
1
2
3
4
5
6
7
8
9
10
11
[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}			//创建100个子目录
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z} //每个目录26个空文件
[me@linuxbox ~]$ find playground -type f -name 'file-A' | wc -l
[me@linuxbox ~]$ touch playground/timestamp //创建timestamp将其时间设置当前时间
[me@linuxbox ~]$ stat playground/timestamp //查看属性(ls增强版)
[me@linuxbox ~]$ touch playground/timestamp
[me@linuxbox ~]$ stat playground/timestamp
[me@linuxbox ~]$ find playground -type f -name 'file-B' -exec touch '{}' ';' //更新所有file-B文件
[me@linuxbox ~]$ find playground -type f -newer playground/timestamp //识别所有更新
[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -or \( -type d -not -perm 0711 -exec chmod 0700 '{}' ';' \) //为所有文件设置新的权限

18.4 find命令选项

image-20210521171219346

19 归档与备份

19.1 文件压缩

gzip

1
2
3
4
5
6
gzip foo.txt
gzip -tv foo.txt.gz //没有v只验证完整性不输出结果
gunzip foo.txt //解压,不用带.gz的后缀名
ls -l /etc | gzip > foo.txt.gz //输出直接压缩成文件(加上后缀表名是压缩过的)
gunzip -c foo.txt.gz | less //只查看压缩文件的文本内容(注意-c后缀的作用)
zcat foo.txt.gz | less //等同于-c的gzip

image-20210521172237328

  • zless 程序共功能等同于管道操作符

bzip2

  • 用法与gzip差不多
  • 扩展名为.bz2
  • 牺牲压缩速度实现了更高的压缩率

二次压缩

  • 二次压缩并不会节省空间,所有压缩技术都涉及额外信息,用来描述压缩过程
  • 尝试压缩不包含任何冗余信息的文件,省下来的空间不足以抵消额外信息使用的空间

19.2 文件归档

  • 文件归档:收集多个文件将其组合成一个大文件(可以同时压缩)

tar

  • f选项指定名称,是必须的,“-”不是必须的
  • v选项获得详细清单
  • tar命令从归档中提取出来的文件所有权属于执行提取操作的用户,而非原先的用户(超级用户操作除外)
  • tar命令归档、提取都是相对路径
  • 归档tar,归档压缩tgz、tbz

image-20210523192843787

1
2
3
tar mode[options] pathname
tar cf playground.tar playground //为playgorund归档,f选项为指定名称
tar tvf playground.tar //列出归档文件的详细内容
  • 通过硬盘把一台电脑系统主目录复制到另一台电脑
1
2
3
4
sudo tar cf /media/BigDisk/home.tar /home		//硬盘自动挂载在/media目录下
//卸载硬盘接入另一台计算机
cd / //提取归档是相对路径,不进入根目录就会出现/home/usr/home...
sudo tar xf /media/BigDisk/home.tar
  • 限制提取
1
2
tar xf archive.tar pathname			//只提取指定文件,可多指定
tar xf ../playground2.tar --wildcards 'home/playground/dir-*/file-A' //提取所有的fileA,--wildcards加入对通配符的支持
  • 与find配合
1
find playground -name 'file-A' -exec tar rvf playground.tar '{}' '+'			//以追加模式(r)调用tar,将查找到的所有文件添加进来

可以通过find查找更新的文件,创建上一次归档之后出现的那些文件的归档

  • 利用标准输入输出
1
2
find playground -name 'file-A' | tar cvf - --files-from=- | gzip > playground.tgz		//先用find匹配文件列表,通过管道线传给tar,“-”为标准输入输出的惯例,--files-from (也可以写为-T)使其从文件中而不是命令行中读取文件列表,最后传给gzip压缩
find playground -name 'file-A' | tar czf playground.tgz -T - //简化命令,通过z选项指定gzip压缩,j选项可有指定bzip2压缩(文件后缀改为tbz)
  • 通过ssh打包远程主机文件
1
ssh remote-sys 'tar cf - Documents' | tar xf -			//在远程主机上执行tar命令,标准输出传到本地主机,本地主机把标准输出提取(x命令)

zip

  • zip既能压缩也能归档(gzip、bzip2在linux上才是主流)
  • zip与tar不同之处在于,如果内容已存在(同名),zip是添加新文件并且替换,而tar是直接替换
1
2
3
4
zip options zipfile file
zip -r playground.zip playground //不加入递归(-r)则只保留目录不包含内容
unzip playground.zip //提取并解压缩
unzip -l playground.zip playground/dir-087/file-Z //指定文件-l选项只列出不提取解压缩
  • zip 的标准输入输出(unzip不接受标准输入)
1
2
3
find playground -name "file-A" | zip -@ file-A.zip		//-@选项将文件名列表传给zip
ls -l /etc/ | zip ls-etc.zip - //结尾的“-”是标准输入
unzip -p ls-etc.zip | less //将unzip结果发送到标准输出

19.3 同步文件与目录

  • rsync 远程更新协议
  • 这里 source 和 destination 是下列选项之一:
    • 一个本地文件或目录
    • 一个远端文件或目录,以 [user@]host:path的形式存在
    • 一个远端 rsync 服务器,由rsync://[user@]host[:port]/path指定
1
2
3
rsync options source destination
rsync -av playground foo //playground的所有内容包括自身都同步到foo中(-a表示递归且保留文件属性,-v显示详细)
rsync source/ destination //source下的所有文件不包括自身被同步,只复制目录不复制目录本身
  • 硬盘备份
1
2
3
mkdir /media/BigDisk/backup
sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/bcakup //添加--delete选项,用于删除存在于备份设备而原设备不存在的文件
// alias backup='sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/bcakup' 定义别名备份更方便
  • 在网络上使用rsync
  • 方法一
1
2
sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup
//加入--rsh=ssh选项,用于指示rsync用远程shell备份
  • 方法二

image-20210523210628205

20.正则表达式

https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md

image-20210602211824794

21. 文本处理


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!