1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解

开始学习linux前的注意事项

在学习linux之前,我们要知道linux是一个操作系统

那操作系统是什么呢?(这里只做大概了解)

image-20240605124626032

  • 操作系统就是一个管理软硬件的软件。
  1. 它对上提供良好(稳定、高效、安全)的运行环境——这是操作系统产生的目的

应用软件能在这个良好的运行环境中运行。

  1. 对下实施管理好软硬件资源的手段——这是它的工作任务

操作系统是无法直接操作硬件的,需要硬件上携带的一个驱动,这个驱动就是一种软件,操作系统需要对接这个驱动,才能去操作硬件

知道了操作系统是什么之后,我们就要了解指令。

在学习常见指令之前,我们要先大概理解一下写指令是在做什么。

Linux中,我们经常要下指令来操作,那写指令是在做什么呢?

  • 等同于在window学习基本操作

我们在window系统下,学习的双击图标,右键查看,左键点击,其实就是在下指令,只是window系统给我们做了个图形化界面,让我们用户去更好的交互。

而在linux下,我们没有图形化界面,就是我们看到的命令行

这两个在操作系统的底层下,都是一样的,没有区别的

image-20240604134359334

window实际上也是有命令行的界面的

win + r 输入cmd就可以打开,在这里也可以实现下指令的操作

image-20240604134525833

总的来说,命令行是学习操作系统的重要手段

现在我们知道了写指令是在做什么,那我们还要知道文件的一些基础常识。

因为很多指令其实是在对文件进行操作。

  • 文件其实是由 **文件的内容+ 文件属性(元数据)**组成的

文件的内容就是 我们用户往里面输入的数据

文件的属性就是 自带的属性,比如文件的创建时间,文件的大小,文件的类型等等…

image-20240604153632743

因此,操作文件的方法也离不开文件的内容数据和文件的属性数据

  1. 操作文件内容的方法
  2. 操作文件属性的方法

了解了文件的常识我们还要知道文件和目录的区别

image-20240604155100936

普通文件就是 我们再Linux环境下编程c++ 和 c语言打开的 .c /.cpp 的源文件

这些我们做个大概了解就行,后面会详细学习

Linux下基本指令

01.ls指令

语法: ls [选项][目录或文件]

功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。

常用选项:

  • -a 列出目录下的所有文件,包括以 . 开头的隐含文件。

以.号开头的文件都是隐含文件,用 ls -al 或者 ll -a 就可以把该目录下的隐含文件的详细信息列出来

image-20240605103517355

  • -d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录

如果不输入指定目录,那么指定目录默认是第一个隐含文件 .

image-20240605103651496

还可以结合 ls -l 去展示我们指定文件的详细信息

image-20240605103750730

加上指定文件就可以只输出我们的指定文件

image-20240605103839216

ls -dl 也可以是 ll -d

指定文件既可以是目录也可以是普通文件

  • -i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件

image-20240605105336261

如图所示,不输入指定文件,默认指定文件是该目录下的所有文件。

每个文件前面的数字就是 节点的索引信息

image-20240605105438472

输入指定文件,输出的就是指定文件的i节点的索引信息

也可以和ls -l 结合

image-20240605105615811

这些结合的功能,可以自己在linux下多尝试。比如和 -a

image-20240605105644735

比如-d ,这些结合的指令,可以多尝试

image-20240605105854312

  • -k 以 k 字节的形式表示文件的大小。ls –alk 指定文件

  • -l 列出文件的详细信息

ls -l 可以简写成 ll

image-20240605110405809

  • -n 用数字的 UID,GID 代替名称。 (介绍 UID, GID)

image-20240605110551859

就是把 root变成了 0

image-20240605110531876
  • -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。(目录类型识别)

image-20240605110651964

image-20240605110714294

  • -r 对目录反向排序。

image-20240605110739881

  • -t 以时间排序。

是以从大到小的时间排序的,如果不-l就会直接排序,-l会看的更清楚是怎么排序的。想看隐含文件就加-a

image-20240605110843479

  • -s 在文件名前输出该文件的大小。(大小排序,如何找到目录下最大的文件)

从小到大排序。从上到下排序。

image-20240605111550331

  • -R 列出所有子目录下的文件。(递归)

image-20240605120449272

想看所有文件的详细信息就加 -l

image-20240605120518028

  • -1 一行只输出一个文件。

有了 -1 指令后 每一行都只会输出一个文件

image-20240605120644346

和 -s结合

image-20240605120726634

注意了!!!

这些指令不要背!!!,多敲代码,多敲指令,就能熟悉它!!!

02.pwd指令

语法: pwd

功能:显示用户当前所在的目录

这里可以说一下路径分隔符

在linux中 是以 / 作为路径分隔符的,在window中是以 \ 作为路径分隔符的

路径分隔符之间都是目录

image-20240604200106574

image-20240604200048416

03.cd指令

Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。

几乎任何操作系统的文件目录组织系统都是一颗多叉树。

image-20240604213454425

语法:cd 目录名

功能:改变工作目录。将当前工作目录改变到指定的目录下

  • cd … : 返回上级目录

这里有种情况,当我们不停地返回上级目录之后,最终会停在根目录无法继续返回

image-20240604203824489

如图所示,当我们返回到只剩下一个/ 的时候,就代表已经返回到根目录

  • cd /home/litao/linux/ : 绝对路径

绝对路径: 从根目录开始,具有唯一性的一串路径,可以找到我们的目标。

  • cd …/day02/ : 相对路径

相对路径: 相对于自身的位置,去定位目标文件的路径

举例:

image-20240604220233606

这是一个绝对路径

image-20240604220321681

同样访问dir目录,我们可以用绝对路径,但是当我们处于第一个testdir目录下的testdir2目录的时候,我们可以回退到testdir目录,在根据这个目录去找dir目录,这个找出来的路径就是相对路径

  • cd ~:进入用户家目

普通用户的家目录都是在home, 但是root用户的家目录就是root,家路径就是/root

普通用户xxx 的家目录就是 home/xxx

输入whoami就可以查看目前是那个用户在使用这个linux服务器。

image-20240605002143271

我们输入cd ~ 就可以查看当前用户的家目录

image-20240605001725196

window系统下,也是有所谓的家目录和工作目录的。

window下我们也可以新建用户。新建用户的桌面是什么都没有的。

我们的桌面其实就是个文件夹。是属于该用户的文件夹

由此也可以说明,linux和window都是多用户操作系统——都支持多个用户同时操作

  • cd -:返回最近访问目录

其实这个意思就是 假设我从起始路径移动到了终点路径,那么我输入cd - 就会回到我的起始路径。

举例:

image-20240605003541387

  1. 一开始处于/root/testdir/testdir2路径下的我输入了cd ~,移动到了家目录,也就是/root
  2. 然后我们输入cd - ,也就是返回最近访问路径,意思就是我们是从某一路径来的,那我们就会回到这一路径,因此,我们返回到了/root/testdir/testdir2路径
  3. 再一次输入cd - ,返回最近访问路径,上一次访问的路径是/root,那么我们就会返回到/root
  4. 不断地输入cd - ,就会在这两个路径来回访问。

因此,通过cd - 这个指令,我们就可以在两个路径之间来回切换。意味着我们能高效的在两个路径之间来回访问。

补充:

如果不清楚目录的情况,可以查看其树状图。

输入下面这个指令就可以下载相应库

yum install -y tree

image-20240604235814953

如图所示,查看了root目录下的文件情况。

如果想查看隐藏的目录情况:

输入

tree -al

就可以了,如图所示

image-20240605004251731

这里插入一个小知识。

  • window系统在win10之后都支持了linux的相关操作

我们可以通过win + x 调出快捷键

image-20240605000423529

然后打开终端管理员,这里就可以输入linux相关指令。但是window的命令行写的没有linux好,性能也没有linux的强大

image-20240605000636932

04.touch指令

语法:touch [选项]… 文件…

功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。

其实touch指令就是用来创建普通文件的。

常用选项

  • -a 或–time=atime或–time=access或–time=use只更改存取时间

  • -c 或–no-create 不建立任何文档

  • -d 使用指定的日期时间,而非现在的时间

  • -f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题

  • -m 或–time=mtime或–time=modify 只更改变动时间

  • -r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同

  • -t 使用指定的日期时间,而非现在的时间

这些指令敲一敲就可以理解,这里不在举例。

这里有一个拓展知识:
我们知道文件是由文件内容 + 文件属性组成的。往往我们都能看到一串时间,这个时间指的是最近修改日期,这个属于文件的属性,那我们如果想查看更加详细的有关文件属性的话

输入

stat  文件名

就可以了。如图所示

image-20240605122348172

用红圈圈起来的,可以去了解一下:

这是三个时间属性,但是这三个时间属性不太一样.

05.mkdir指令(重要)

语法:mkdir [选项] dirname…

功能:在当前目录下创建一个名为 “dirname”的目录

就是在当前目录下,创建一个空目录

常用选项

-p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;

加上-p其实就是创建了一串路径

举例:

mkdir -p a/b/c/d

image-20240605123954203

06..rmdir指令 && rm 指令(重要)

rmdir指令:

rmdir 是和 mkdir相对应的语法,mkdir是创建一个空目录,而rmdir是删除一个空目录。

注意: 这里的两个关键词rmdir只能删除空目录。是空的 并且是目录

语法:rmdir [-p][dirName]

适用对象:具有当前目录操作权限的所有使用者

功能:删除空目录

常用选项

  • -p 当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。

我们来看看实例:

image-20240607153612771

当前的文件树状图如上

我们如果想删除empty目录是不行的,因为不是空目录。

我们想删除test文件也是不行的,因为不是目录

image-20240607153701887

因此我们只能删除empty2

image-20240607153801667

但是这样一个一个删除,如果要删除的目录非常多,不是非常麻烦吗?

因此-p就有用武之地了

image-20240607153852169

删除一个空目录,如果父目录也是空目录,那么就会跟着一起被删除。

rm指令:

rm命令可以同时删除文件或目录

语法:rm [-f-i-r-v] [dirName/dir]

如果要删除文件,必须要去到当前文件下的 目录/路径 , 才可以删除

适用对象:所有使用者

功能:删除文件或目录

常用选项

  • -f 即使文件属性为只读(即写保护),亦直接删除
  • -i 删除前逐一询问确认
  • -r 递归删除该目录下的所有目录和普通文件

来看实例:

当前root目录下的树状图

image-20240607155410853

我们如果想要删除test

image-20240607155737240

要去到 /root/a/b/c/d路径下,才能删除 并且这里在删除之前询问了是否要删除

image-20240607160028793

这里说明了,在我的云服务器的版本(centOS7.6)下,是自带-i的效果的

我们再来看看,假如我们想删除目录也是可以的

但是我们不能直接删除目录

image-20240607160552124

这里会有提示: 这是个目录,无法删除

只要使用-r 就可以删除了

image-20240607161302712

如图所示,但是这里就有一个小小的问题,我们这里只删除了2个目录和1个文件,他一共询问了五次,那假设我有一w次删除的动作,那岂不是要问我很多次吗?

那我想要直接删除不要它问我我要怎么做呢?——加 -f

image-20240607161529536

可以看到我们删除了2个空目录都没有询问我们

-r -f不一定要拆开 将其合在一起也是可以的。

image-20240607161650606

-rf 可以理解成——递归强制删除指定文件及其内部文件

07.man指令(重要)

Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是: man

语法: man [选项] 命令

常用选项

  • -k 根据关键字搜索联机帮助
  • num 只在第num章节找
  • -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a选项,当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕

如果我们输入指令:

man man  

就是查看man指令如何使用,我们会发现,man手册带着9个编号,每个编号对应的内容不一样。其实我们只要关心1 2 3就行

image-20240607215854981

解释一下,面手册分为8章

  1. 是普通的命令

  2. 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)

  3. 是C语言的库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件

  4. 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义

  5. 是给游戏留的,由各个游戏自己定义

  6. 是附件还有一些变量,比如向environ这种全局变量在这里就有说明

  7. 是系统管理用的命令,这些命令只能由root使用,如ifconfig

如果在使用man手册的时候发生了报错,那就是没有安装man手册

image-20240607220748536

安装一个man手册就行**(要注意只能root用户,才能安装)**

yum install -y man-pages

弹出类似下面这个的界面就是安装成功了

image-20240607221041005

08.cp指令(重要)

语法:cp [选项] 源文件或目录 目标文件或目录

功能: 复制文件或目录

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。

常用选项

  • -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
  • -i 或 --interactive 覆盖文件之前先询问用户
  • -r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
  • -R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理

我们先创建一个有内容的文件file

这里是将hello cp这个内容重定向输入到file文件中,file文件不存在会自动创建

image-20240607225417491

将其复制到cp_file目录下

image-20240607225122757

还可以将文件复制到上级目录下:

image-20240607231626379

那我们如果想复制一整个目录,包括其文件怎么办呢?使用选项-r就好了,和rm很像

image-20240607231804156

image-20240607231839992

关于-i就是在覆盖文件之前要先行询问客户确认该操作

image-20240607232253445

如图所示,我们进行了一个操作——(cp -r cp_file …)注意 …后面可以带/也可以不带(cp -r cp_file …/)

意思是:将cp_file目录复制到上级目录中

但是上级目录下已经存在了cp_file目录了,这个操作如果执行就会导致文件被覆盖,那就有可能造成数据的丢失,因此在做这种操作之前 +一个_i 可以做一个保险。

并且我们也可以发现,在该linux系统下,它自带了这个_i功能。上述图中我们没有+ _i 但是它还是询问了我是否要覆盖目录。

加了也行,不影响.(这个_i的用处主要就是防止复制的目录下有同名文件/目录,导致数据被覆盖)

image-20240607232652457

09.mv指令(重要)

mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录。

语法: mv [选项] 源文件或目录 目标文件或目录

功能:

  1. 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
  2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
  3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。

其实简单来说就是

  • mv可以将文件或者目录移动到目录底下

  • mv可以给目录或者文件重命名

实例:

image-20240610232651789

我们通过mv指令可以将dir目录下的test文件移动到家目录下

mv test ~ (这里的目录和文件也可以加/)

image-20240610232246383

也可以将文件移动到某个目录下:

mv file dir

image-20240610232622438

还可以将整个目录移动到其他目录下 【注意,这里不需要带 -r】

mv /root/dir/cp_file … 这里的意思就是把/root/dir/cp_file 这个文件或者目录 移动到上一级目录(…)下

image-20240610233026007

如图所示,这里直接对上级目录的cp_file文件进行了覆盖,如果觉得这个操作危险可以加-i来保障一下

再来看一条指令

mv ~/dir cp_file

这里的 ~/dir 的意思就是 家目录下的 dir文件或者目录 【~就是家目录】

image-20240610233718735

mv指令除了能够移动文件和目录到目录下。

还可以给文件或者目录重命名

我们先给普通文件重命名 【注意重命名之后的名字 不能与该目录下的目录名重合,不然会变成移动文件】

image-20240610235151617

并且也不能够命名同样的名字

image-20240610235328015

我们再来给目录重命名

image-20240610235450075

同样的,也不能够命名同样的目录名字

image-20240610235528040

拓展:

这里是一个类似于windows回收站的功能

将rm改造成mv
vim ~/.bashrc #修改这个文件
mkdir -p ~/.trash
alias rm=trash
alias ur=undelfile
undelfile() {
 mv -i ~/.trash/\$@ ./
}
trash() {
 mv $@ ~/.trash/
}

10.cat指令

语法:cat [选项][文件]

功能: 查看目标文件的内容

常用选项

  • -b 对非空输出行编号

  • -n 对输出的所有行编号

  • -s 不输出多行空行

为了直观的感受到cat的作用,这里我们先做一个工作:

输入

cnt=0; while [ $cnt -le 10000 ] ; do echo "hello [$cnt]"; let cnt++; done

这个指令输出了10000行信息

image-20240611093122978

再输入这条指令:

cnt=0; while [ $cnt -le 10000 ] ; do echo "hello [$cnt]"; let cnt++; done > test.txt

将这一万条输出的信息存在 test.txt文件中

image-20240611093332878

我们通过vim或者nano查看文件内容。vim不建议初学者使用,这里采用nano查看文件内容

nano test.txt

如果nano没有下载需要下载

sudo yum install -y nano

能进入到下面这个界面,就是打开文件成功

image-20240611093943624

现在我们就可以来直观的看看cat的作用了

cat可以帮助我们输出一个文件的内容

cat test.txt

如图所示

image-20240611094323878

如果我们想要带行号就带-n

cat -n test.txt

image-20240611094454127

但是cat指令只能输出全部内容,因此cat并不适合大文本的查阅,只适合小文本和代码片段

拓展:

cat 指令如果反过来 就是tac指令 意味着逆序输出文件内容

tac test.txt

image-20240611100733409

11.more指令

语法:more [选项][文件]

功能:more命令,功能类似 cat

常用选项

  • -n 对输出的所有行编号

  • q 退出more

前面我们学习的cat指令,我们说有些缺陷,不适合查阅大文本

但是more指令就适合查阅大文本

实例:

more test.txt

image-20240611102306673

按回车可以一个一个查阅,按D可以翻页。

more指令输出文本内容不会一次性全部打印出来

如果我们想查阅第几行的内容也是可以实现的

我们这里查阅第567行

more -567 test.txt

那么more文本就会输出到第567行的内容,就是hello [566]

image-20240611102540450

如果超过文本行数,那么无法查询

image-20240611103055149

more还可以查找文本内容

进入test.txt文本后 输入/ 符号

就可以输入你要查询的内容 这里我查询 9999

image-20240611103504137

按下回车就会帮我们找到内容

image-20240611103546390

内容如果不存在就会提示找不到

image-20240611103631505

more指令还有很多选项可以实现更多功能,这里就介绍这么多了,有兴趣的可以多多了解

拓展:

做了解就行

[atong@LiWenTong ~]$ ls -l / | more
total 162
drwxr-xr-x 2 root root 4096 Apr 25 05:39 bin
drwxr-xr-x 4 root root 1024 Apr 25 04:11boot
drwxr-xr-x 9 root root 3820 May 4 23:20 dev
drwxr-xr-x 84 root root 4096 May 5 00:37 etc

12.less指令(重要)

  • less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。

  • less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!

  • 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜

语法: less [参数] 文件

功能

less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。

选项

  • -i 忽略搜索时的大小写

  • -N 显示每行的行号

  • /字符串:向下搜索“字符串”的功能

  • ?字符串:向上搜索“字符串”的功能

  • n:重复前一个搜索(与 / 或 ? 有关)

  • N:反向重复前一个搜索(与 / 或 ? 有关)

  • q:quit

实例:

输入

less test.txt

image-20240611145619981

光标闪烁的地方,我们可以选择输入数字 代表要向下翻阅多少行,

输入100

image-20240611145720361

如果加上/就是代表查询/后的内容**【注意/是向下查询】**

image-20240611145731180

image-20240611145810209

也可以输入? 代表向上查询

image-20240611145837893

当然,如果有重复内容,先显式离得近的

image-20240611145847928

再输入55 查到的就是55

这些功能都是多敲敲代码就能够知晓和熟悉的。

如果想要退出就按q

如果要进入文本的时候是带行号的就带 -N

image-20240611150454570

拓展:

我们前面有提到,more和less更适合查看大文本,那大文本到底是什么呢?

其实在以后得工作中,我们接触到的代码都是几十万行或者几万行的,大型代码文件,程序员在排查错误的时候,是不可能像现在新手的我们写代码一样不用去写日志的,因为我们现在写的代码本质上都很短很简单。

因此日志对于代码来说就是非常重要的一个东西,它存着每个代码书写的时间,这样我们就可以根据时间去找到我们什么时候写的代码,排查错误就会更加方便。

而less就可以很好的查阅日志。

image-20240611151139778

13.head指令

head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。

语法: head [参数]… [文件]…

功能

head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。

选项

  • -n<行数> 显示的行数

实例:

前面学习的less和more指令都是进入文本中查看内容。

那如果我不想进入文本,我就是想在外部简单的看一看文本的部分内容呢?

这个时候就用到了head和tail

假如我要看前10行(默认的head就是打印前10行)

image-20240611151659941

也可以自己选择要看的行数

image-20240611151751184

14.tail指令

tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -

f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.

语法: tail[必要参数]/[选择参数]/[文件]

功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

选项:

  • -f 循环读取

  • -n<行数> 显示行数

实例:

image-20240611152451424

查看指定行数

image-20240611152501771

拓展题目:

是否可以不进入文件内部,拿到test.txt第1000行~1010行的内容?

可以的。

  • 第一个方法:通过临时文件

首先输出前1010行的内容

head -1010 test.txt

image-20240611153942362

我们要的是红色圈起来的内容

那简单,我们直接将前1010行的内容放到另外一个文件中,然后输出这个文件的后10行。不就是1000~1010行的内容了吗

如下面图片所示

image-20240611154113437

image-20240611154148760

如图所示,我们解决了问题,但是这里有个问题,那就是这里会创建临时文件。

那有没有不创建临时文件的方法呢?

  • 第二个方法(不创建临时文件)【通过管道实现】

这里我们通过管道实现

输入

head -1010 test.txt | tail -10

这里的竖线就是管道

输出结果如下:

image-20240611154701671

可以看到,这里就是我们想要的结果**【红色圈起来的就是管道】**

注意:

这里我们只学习管道的用法

管道的原理将会在后面的进程间通信内容学习,并且实现编码

image-20240611155959902

这里简单的解释一下管道在这句代码中的作用

本来正常情况下,head和tail这种单独的指令,都会直接将要输出的内容直接输出到显示器上,但是有了管道之后,前面head指令要输出的内容就会先输出到管道中,【这里的管道其实就是一个内存空间】,然后tail指令执行的时候,不再从test.txt文件中读取数据,而是从管道中读取数据,然后执行命令。

因此管道可以将各种各样的命令组合起来,实现各种功能

学习了管道后的操作之后,这里再来一个题:

针对上述完成的操作,将其逆置之后,取前三行输出到显示器上

image-20240611160756907

如图所示,使用多个管道即可

拓展一下:

管道还可以组合自己编写的c语言程序。下图的change是用户自己写的将输入的字符转化成大写的c代码的文件名。 ./change中的.代码当前目录下,/代表路径分隔符

image-20240611162800715

15.时间相关的指令

date显示

date 指定格式显示时间: date +%Y:%m:%d

date 用法:date [OPTION]… [+FORMAT]

1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下

  • %H : 小时(00…23)

  • %M : 分钟(00…59)

  • %S : 秒(00…61)

  • %X : 相当于 %H:%M:%S

  • %d : 日 (01…31)

  • %m : 月份 (01…12)

  • %Y : 完整年份 (0000…9999)

  • %F : 相当于 %Y-%m-%d

实例:

image-20240611210438109

直接输入date会显示一个时间,这个时间平常不太用的到、

我们接下来使用一下如何将此时的时间按照想要的格式展示出来

image-20240611210733110

2.在设定时间方面

  • date -s //设置当前时间,只有root权限才能设置,其他只能查看。

  • date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00

  • date -s 01:01:01 //设置具体时间,不会对日期做更改

  • date -s “01:01:01 2008-05-23″ //这样可以设置全部时间

  • date -s “01:01:01 20080523″ //这样可以设置全部时间

  • date -s “2008-05-23 01:01:01″ //这样可以设置全部时间

  • date -s “20080523 01:01:01″ //这样可以设置全部时间

3.时间戳

Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒

时间->时间戳:date +%s

image-20240611210813762

时间戳->时间:date -d@1508749502

实例:

我们选择输入时间戳去转化成时间。

image-20240611210921317

我们发现如果不给格式的话,输出的不是我们想要的时间。

因此我们可以选择添加格式,将时间戳代表的时间转化成我们想要格式输出

image-20240611211023001

在上述的图片中我们会发现,这里的时间戳0转化出的时间并不是午夜。

这其实是因为我们的地区是北京时间,和格林当地的午夜时分有着8小时的时差

16.cal指令

cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”。

命令格式: cal [参数]/[月份]/[年份]

功能: 用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份

常用选项

-3 显示系统前一个月,当前月,下一个月的月历

-j 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)

-y 显示当前年份的日历

实例:

直接输入cal就是显示当前月份

image-20240611212218786

输入cal -3 显示当前的前一个月,当前月,下一个月的月历

image-20240611212246987

输入cal -y 显示当前年份的所有月份

image-20240611212311474

输入 cal -j 显示调用cal时的日期 是当前年份的第几天

image-20240611212420792

直接在cal后面输入年份可以显示输入年份的所有月份

image-20240611212453693

举例就举例到这里,可以多打指令,熟悉使用。

17.find指令(很重要!)

前提声明:

find指令是linux一个非常强大且重要的指令,他的选项非常之多,因此它具备了强大的功能。如果要将其讲述完是需要非常多时间的,这里我们只学习其中的-name选项。这个选项可以让我们能够查找文件

  • Linux下find命令在目录结构中搜索文件,并执行指定的操作。

  • Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。

  • 即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。

  • 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

语法: find pathname -options

功能: 用于在文件树种查找文件,并作出相应的处理(可能访问磁盘)

常用选项:

  • -name 按照文件名查找文件

实例:

如图所示,文件系统树状图

image-20240612110341435

我们想要查找一共有多少个test文件

输入

find -name test

image-20240612110415393

可以看到是从第一个树开始遍历

我们也可以去某个路径/目录下 查找是否有某个文件

输入

find ./cp_file -name test

image-20240612110549568

这样就会去你指定的目录/路径下 查找。

如果找不到

image-20240612110735311

就什么反应都没有

注意:

当我们使用find指令搜索某个文件的时候,find有可能会去磁盘当中搜索,进而导致效率变低

18.which指令

简单来说,就是可以查询指令在那个文件当中

image-20240612115156401

which只用来搜索命名

拓展:

我们知道我们使用 ls 和ll 指令的时候,如果是目录就是蓝色的如果是普通文件就是白色的。

image-20240612120913396

其实我们用which查询一下就知道了

image-20240612121005264

可以看到ll 就是 ls -l 底层还是ls文件。两个指令都带有一样的颜色选项

19.ailas指令

前面在用which指令对某个指令进行查询的时候,我们可以发现其中出现了一个ailas指令,这个指令其实就是对指令重命名。

实例:

假设我们给ls -l 指令 重命名一个rename

那么我们直接调用rename就可以直接实现ls -l的功能,其实rename就是 ls-l这个指令的别名

image-20240612122423280

20.whereis指令

前面我们知道了find 和 which指令,可以用来查找。find用于查找文件,which用来查找指令。

whereis用于在特定路径下的查找。【注意 whereis并不在用户的家目录下进行搜索!!】

image-20240612123429855

他会把系统路径下所有 跟ls相关的路径给你展示出来、

也就是在特定路径下,查找指定的文件名对应的指令或者文档

从查找范围来说,find > whereis > which

21.grep指令(重要)

前提声明:

grep指令也find指令一样,有着非常多的选项可以选择,因此如果要完全学习grep指令的成本是非常高的,因此这里我们只拿最常用的选项出来了解和学习。

grep指令参考文档

语法: grep [选项] 搜寻字符串 文件

功能: 在文件中搜索字符串,将找到的行打印出来

其实就是在文本当中查找你想要的内容,找到了就打印出来

常用选项:

  • -i :忽略大小写的不同,所以大小写视为相同

  • -n :顺便输出行号

  • -v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行

实例:

我要在test.txt这个文本中查找 100 这个字符

image-20240612124420606

如果带了 -n那么就会输出 打印的内容 在文本当中的对应行号

image-20240612151203523

如果带-i就可以忽视你查找内容的大小写

grep -i 'grep' test.txt

image-20240612151949106

如果带 -v 那么就会把你选择的内容排除掉

grep -v 'hello' test.txt

image-20240612152149730

并且这些选项也可以组合来使用,这里给一个实例,还有其他组合得自己多试试

这里我带了 -v -n

image-20240612152238744

拓展:

grep指令和管道结合其他指令,可以进行某些匹配工作

举例:

与wc指令结合

下图的意思是,HELLO这个内容在该文本中出现了三行

image-20240612152817121

22.sort指令

sort指令可以对文本内容进行排序

【注意: 它是对文本内容的ASCII值进行排序的,一个一个元素的去比较】

一个文本的内容我们先cat出来

image-20240612153228295

然后对其排序

image-20240612153255845

再来看一种不是纯数字的文本的sort指令的使用情况

image-20240612153517664

当然 sort还有很多的选项使用,这里不在多讲,要了解可以多敲。

23.uniq指令

uniq指令可以对文本内容 中 相邻并且相同的内容进行去重。

因此可以搭配sort指令来使用

image-20240612154057377

uniq指令还有很多的选项可以使用,这里不在多讲。

24.zip/unzip指令

声明:

要使用这两个命令得先看看是否有下载这两个命令

如果没有就输入下面这个指令去下载

yun install zip unzip

下载完毕就可以使用了

如果输入zip 显示这个东西就是已经下载了

image-20240612202412552

语法: zip 压缩文件.zip 目录或文件

其实就是zip (压缩之后的压缩包名字.zip) (你要打包的文件或者目录)

功能: 将目录或文件压缩成zip格式

常用选项:

-r 递 归处理,将指定目录下的所有文件和子目录一并处理

举例

将test2目录压缩:zip test2.zip test2/*
解压到tmp目录:unzip test2.zip -d /tmp

实例:

image-20240612204702966

在上图中,我们将dir这个目录及其全部内容都压缩到dir.zip这个压缩包当中。

【要注意这里必须带-r,如果不带-r的话,就只会对这个目录本身进行压缩。带了-r才能将该目录的全部内容都给打包,因为zip指令在打包压缩的时候,默认只会对当前这一个目录打包。】

下面我们对这个dir.zip压缩包进行解压

image-20240612205327139

上图中,我们首先将该压缩包移动至上级目录,并且在上级目录下解压缩。

可以看到压缩包解压之后并不会消失

注意:

假如解压缩完的目录或者文件名与当前目录下的某一文件或者目录名重合,那么将会检查到名字相同的情况

image-20240612205511415

这个时候会询问是要覆盖还是取消解压等等 一共五个选项给你。

在上述解压中,我们都是解压到当前目录下,那有没有办法能解压到我想解压到的目录/路径下呢?

其实**-d**就可以实现

如图所示

image-20240612211047702

我们将dir.zip解压到 上级目录中。

拓展:

为什么要打包和压缩呢?

其实就是在互联网上,有许许多多的大小文件,那么这么多的文件,如果一个一个传输就很麻烦,不如打包到一个文件当中,这样只用传输一个文件。

但是这样的话,这个文件可能会非常大,在下载上就不方便了,因此,我们就将其压缩,压缩的更小,便于传输。

总结来说就是: 打包和压缩便于文件的传输和保存,不会在传输的过程中,造成数据丢失

25.tar指令(重要)

tar [-cxtzjvf] 文件与目录 参数

  • -c :建立一个压缩文件的参数指令(create 的意思);

  • -x :解开一个压缩文件的参数指令!

  • -t :查看 tarfile 里面的文件!

  • -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?

  • -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?

  • -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!

  • -f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!

  • -C : 解压到指定目录

实例:

tar的选项非常之多,这里我们就来看一些最基本的选项【-c -z -x -f -v -t】

这里我们将dir这个目录及其全部内容一起 打包并压缩到 dir.tgz文件当中。

image-20240612232840204

接下来我们将dir.tgz这个文件拷贝到上级目录中,然后对其进行解包和解压

image-20240612234307439

和unzip一样,解压的时候,不会导致原来的文件消失

-v就是可以让我们看到解压缩的过程,也就是解压了什么文件。

image-20240612235610953

-t就是不解压,但是给我看一下这个压缩包里面有什么

image-20240613001053535

-C 就是解压到指定目录 -C后面直接跟你要解压到的目录

image-20240613001805041

更多的案例:

个人觉得这个案例光看比较难理解,还是自己上手敲指令比较好理解,毕竟光说不练假把式

范例一:将整个 /etc 目录下的文件全部打包成为 `/tmp/etc.tar`
[root@linux ~]# tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
上述指令在执行的时候,会显示一个警告讯息:
『`tar: Removing leading `/" from member names`』那是关於绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc
则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,
就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!

范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N "2005/06/01" -zcvf home.tar.gz /home

范例七:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
这分别代表 standard output, standard input 与管线命令啦!

26.bc指令

bc指令可以进行浮点运算。

其实认为他就是一个计算器就好了。

实例:

image-20240613002634878

输入quit就可以退出计算机模式

注意:

bc 可以和 管道组合

image-20240613002843345

27.uname –r指令

语法:uname [选项]

功能: uname用来获取电脑和操作系统的相关信息。

补充说明:uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。

常用选项:

  • -a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称

实例:

image-20240613111807347

-r就是查看内核版本

28.重要的几个热键

  • [Tab]按键—具有『命令补全』和『档案补齐』的功能

如图所示。输入wh 之后按tab就会显示出,wh开头的命令

image-20240613113333816

如果你输入whic 再按tab 他会直接将其补齐,因为whic只有唯一对应的which指令

image-20240613113411889

  • [Ctrl]-c按键—让当前的程序『停掉』

假设有一个死循环的代码正在循环,那么我们就可以用ctrl c 将其终止

image-20240613114435113

这里写了一个死循环的c语言的程序。

image-20240613114520877

image-20240613114525524

如图所示,按下ctrl c就会终止

  • [Ctrl]-d按键—通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit

这里我按了一次ctrl + d 之后,就直接退出了,因为我是root用户,退出就直接退出了。

image-20240613122302884

  • [Ctrl]-r按键 代表着搜索历史命令

这里我搜索while ,他就显示了包含while的历史命令

image-20240613121854688

29.续行符

有些时候我们可能嫌指令太长,一行放不下,这个时候可以用\符号,来分割指令。

如图所示

image-20240613122655942

这里的两个指令是等价的。

输入ctrl + c 可以退出这个模式。

这个有点类似于C/c++中的续行

image-20240613123301696

30.关机

语法:shutdown [选项] ** 常见选项:**

  • -h : 将系统的服务停掉后,立即关机。

  • -r : 在将系统的服务停掉之后就重新启动

  • -t sec : -t 后面加秒数,亦即『过几秒后关机』的意思

由于用的云服务器,不需要关机,这里不弄实例。

31.一些有趣的指令

  • lscpu:查看cpu信息

image-20240613125741871

  • lsmem 查看内存信息

image-20240613125758774

  • df -h 查看硬盘信息

image-20240613125810633

  • who 查看谁在使用这个linux机器

image-20240613130022721

  • whoami 查看自己的用户

image-20240613130119828

32.以下命令作为扩展:

linux中的指令的学习可谓是学海无涯,太多太多需要学习了(大概有1200~2000条)。本章只讲述了一些比较常见并且简单的指令。还有很多很多指令没有讲。

◆ 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;

**◆ 文件处理命令:**file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;

◆ 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;

◆ 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup;

**◆ 系统安全相关命令:**passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who;

**◆ 其它命令:**tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。

相关推荐

  1. Linux常见指令

    2024-06-15 08:40:06       13 阅读
  2. Linux重要指令

    2024-06-15 08:40:06       26 阅读
  3. Linux】文本替换Ubuntu sed 指令使用指南

    2024-06-15 08:40:06       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 08:40:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 08:40:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 08:40:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 08:40:06       18 阅读

热门阅读

  1. Pod中使用自定义服务账号调用自定义资源

    2024-06-15 08:40:06       10 阅读
  2. 使用dockerfile能力构建制品并打包容器

    2024-06-15 08:40:06       7 阅读
  3. C# 泛型分析

    2024-06-15 08:40:06       9 阅读
  4. 找工作小项目:day15-macOS支持、完善逻辑

    2024-06-15 08:40:06       6 阅读
  5. 自动化机械臂喷涂生产线方案五

    2024-06-15 08:40:06       8 阅读
  6. AWD攻防比赛流程手册

    2024-06-15 08:40:06       7 阅读
  7. 公链常用的共识算法

    2024-06-15 08:40:06       8 阅读
  8. 探索 Spring Boot 集成缓存功能的最佳实践

    2024-06-15 08:40:06       8 阅读
  9. 第十三章:huggingface的resume训练源码内容

    2024-06-15 08:40:06       7 阅读
  10. 用python写一个企业知识库算法

    2024-06-15 08:40:06       8 阅读
  11. ADBMS1818驱动程序解析

    2024-06-15 08:40:06       7 阅读
  12. 浏览器无痕模式和非无痕模式的区别

    2024-06-15 08:40:06       6 阅读
  13. MySQL + Keepalived自动切换

    2024-06-15 08:40:06       6 阅读