本篇所有展示代码均是在超级用户的权限下进行的,如果不是超级用户并且一些命令执行的和我的不太一样,那么可以试着在对应命令前暂且加上sudo,我们在下一篇会讲权限问题,到时候再转换为普通用户。
本篇展示的内容是基于CentOs进行的,如果你是Ubuntu或是其他的发行版,也不影响正常学习,各种命令的使用和功能几乎一样,大家可以放心食用。
我所用的软件是Xshell。Xshell 可以通过 SSH 协议安全地连接到 Linux 服务器,使得系统管理员或开发者可以在本地计算机上执行命令、进行文件传输等操作,就像直接在服务器前操作一样。
一、指令(命令)
(1)whoami
查看当前用户是谁。
(2)ls
显示当前目录下的文件。(当前目录是指当前用户所处的目录)
这里的ls是一个命令,后面的-l是一个命令行选项,它们的中间由空格隔开。其中,命令行选项可以有多个,并且若有多个则它们都需要用空格隔开。
那么ls和ls -l的区别是什么呢?
说到区别,我们需要先考虑另外一个问题。
在Windows环境下,我们创建一个空文件(里面没有任何内容),这个文件在磁盘中占据空间吗?
答案是这个文件会在磁盘中占用空间,即使里面内容什么也没有。因为文件会有名称、对应的创建时间、修改时间、访问时间、文件的类型、文件的大小等等,这些统称为文件的属性,文件的属性也是数据(需要被保存起来),就像你的名字,性别、身高一样,它们不是你的"内容",但却是你的属性,这些东西要保存起来,"属性+内容"才构成完整的你。所以,文件要维护自己的属性数据也要在磁盘上占用空间,所以文件是由"内容+属性"所组成的。
ls的作用就是查看文件属性的,仅仅一个ls就是查看文件名(属性)的,而ls -l是查看文件更多的属性。
我们知道在Windows环境下查看文件的类型就是看看它的后缀是什么,那在Linux环境下如何查看文件的类型呢?
Linux环境下的文件通常是没有后缀的,所以我们要想知道它的类型是什么可以用ls -l这个命令,ls -l执行后的第一个字符是d(directory),就是指这个文件是一个目录,所谓目录就是和Windows下的文件夹是一个意思。
ls -a:-a是ls的另外一个命令行选项,它的作用就是列出目录下的所有文件。这就奇怪了?ls不也是列出目录下的所有文件吗?
ls与ls -a的区别就是:ls列出目录下的所有文件(不包括隐藏文件),ls -a列出目录下的所有文件(包含隐藏文件)。隐藏文件就是以**.**开头的文件。在Windows环境下,隐藏文件也是以.开头的。
具体.和..到底是什么意思,我们待会说。
一个命令后面可以有多个命令行选项,所以我们可以搭配使用:
当一个命令后面有多个命令行选项时,我们可以随意地调用它们的相对位置,甚至可以合并着写。
(3)touch
新建一个普通文件。
ls -l执行后的第一个字符是-,就是指这个文件是一个普通文件。
在Linux中以.开头的文件为隐藏文件,所以我们也可以创建一个隐藏文件:
不难发现,现在我们虽然不知道.和..到底是什么,但它们一定都是目录,因为执行ls -la后第一个字符是d。
touch一个存在的文件可以更新它的创建时间:
(4)mkdir
创建一个目录(文件夹)。
我们也可以一次创建一连串目录,可以用"mkdir -p 一连串",比如下面这样:
我们可以使用tree指令来清晰的看到这种结构:
有些同学可能没有安装tree,那么输入"sudo yum install tree"来进行安装(Centos),如果是用的是Ubuntu,那么只需将yum换为apt即可。
(5)pwd
查看当前目录所处的路径。
初学时我们可以将pwd理解为person work directory,即用户工作目录。
在Windows上也可以快速找到工作目录:
但有一点不同的是:
在Windows环境下,\(反斜杠)是路径分隔符
在Linux环境下,/(斜杠)是路径分隔符
两个反斜杠或斜杠之间的一定是一个文件夹(目录)。在Windows环境下我们常说文件夹,在Linux环境下我们常说目录。
在路径的最后面,可能是一个目录也可能是一个文件;前面一定是目录。
(6)cd
更改工作目录,将当前工作目录改变到指定的目录下。cd可以理解为change directory。
cd 目录:通过cd命令,可以进入到指定的目录。
首先pwd查看当前目录的路径,ls看看当前目录下有哪些文件,"cd 113/"到113这个目录下...
从上面的代码中可以看出,不管是非空目录还是空目录,它们中都有.和..这两个隐藏目录,接下来我们就说一下它们的作用:
.表示当前目录。
..表示上级目录。
.是一个隐藏目录,归根结底它是一个目录,所以我们可以使用cd . 来到.这个目录下,上面代码说明.就是当前目录的意思。
..和.一样,它也是一个隐藏目录,它表示当前路径下的上级目录,cd ..就可以回退到上级目录。
一直进行cd ..当到一定程度就不能回退了,这是必然的,因为路径不可能无限长。在Linux中,/是路径分隔符,但有一种特殊的/,如上图所示,回退到一定程度不能回退时出现的/,我们称其为根目录。
接下来,再来看一看ls的其它搭配用法:
"ls -l"是查看当前目录下的文件属性。
"ls -l 指定目录"是查看指定目录下的文件属性。
如果我们就单纯想看113这个目录的属性,可以用"ls -l ./113 -d":
同样地,我们也可以用这种方式查看根目录的信息:
通过上面的学习,我们知道了在Linux中,最上一层是一个根目录,我们知道一个目录中既可以放目录也可以放文件,所以Linux的文件结构其实是从根目录(/)开始的一颗多叉树。
这棵树的叶子结点一定是普通文件或者空目录;非叶子节点一定是非空目录。类似下面的结构:
如果我们想要找到test.c,那么我们就可以通过"/home/bit/test.c"这种方式达到目的。
为什么可以用这种方式来找test.c呢?
在多叉树中,每个结点可能有多个孩子,但一定只有一个父亲,所以通过test.c我们可以找到bit,通过bit我们可以找到home,通过home我们可以找到/,所以/home/bit/test.c这条路径是唯一的,所以就可以通过这种方式找到test.c,这种从根目录开始一直到目标文件的这种形式称为绝对路径。绝对路径用来标识路径的唯一性。
我们要想访问一个文件,前提是我们必须先找到它,要想找到它,就需要通过路径这种方式。
路径分为:绝对路径 和相对路径两种。
绝对路径具有唯一性,所以一定能找到目标文件。
相对路径是以非/为参照位置,定位一个文件。
在Linux中,绝对路径一般在配置文件中进行使用,相对路径往往在日常操作中用的多(简单)。
所以.和..的作用就更明显了,通过.我们可以定位到当前目录下的任意文件,通过..可以方便的找到其它目录下的文件。
任何一个目录,即使是空的,系统也要默认给该目录自动生成.和..
特别说明的是根目录(/)的..就是它自己。
Windows环境下的文件结构同样是多叉树。Windows环境下的根目录是此电脑,C盘、D盘...是文件夹。
在Linux中,~被称为当前用户的家目录。
通过"cd ~"可以直接到当前用户的家目录下。
任何一个linux用户,用特定的用户名登陆系统时,默认在什么路径下呢?
答:默认在家目录下。
家目录就是用户登陆系统时的默认目录。我们当前时root用户,它的家目录就是/root。
Windows环境下,是可以建立多用户的,每个用户都有属于自己的家目录,C盘中有一个名为用户目录,在这个目录中,会有具体的一个个用户名称,每个用户目录下有一个名为桌面的目录,这个目录就是这个用户的家目录,每次打开电脑时,我们的桌面图标其实就是当前用户下桌面这个文件夹中的内容图像化显示了出来的结果。所以多用户登录同一个Windows操作系统时,它们的桌面是不一样的。
User文件夹中可能有多个用户,Administrator只是当前的用户,Desktop就是当前用户的桌面,打开电脑时就是将Desktop中的内容以图形化的形式展示了出来,Desktop就是当前用户的家目录。
通俗来讲,Windows下的桌面其实就是一个文件夹。
所以Linux和Windows都有家目录。
"cd -"返回最近访问目录,其中-表示最近所处的路径。
(7)which
which指令用于查找并显示可执行文件的位置路径。它主要用于确认某个命令或程序的执行文件在哪个路径下,以便确认当前环境下实际使用的是哪个版本的命令。
通过which指令我们可以看到,我们平时所使用的指令其实都是一个个普通文件。
所以,ls和/usr/bin/ls执行后,会出现一样的效果:
所以,指令的本质就是可执行文件,等同于我们写的C/C++程序。
所以上面我们安装的tree指令,就是将tree命令从网络中下载下来,安装拷贝到指定的/usr/bin目录下。
安装指令的本质就是拷贝,将指令拷贝到/usr/bin目录下就可以直接使用了。
(8)alias
alias指令用于创建命令的别名,使用户可以用更简短的命令或自定义的名称来代替原本的长命令。这可以帮助提高效率、减少输入错误,或为一些常用命令添加特定的参数。
在CentOs下,ll是ls -l的别名:
我们可以通过which指令看到:
至于--color是什么意思,我们看下面:
它会给特殊文件显示特殊颜色。
我们平时直接用ls就有颜色是因为,ls其实是ls --color=auto的别名:
所以,在CentOs中,ll指令就等同于ls -l。
我们现在起的别名(zhangsan、lisi)都是临时的,关闭系统后再打开,这些别名就不起作用了。
但ll这个别名是永久性的(是系统默认给的),要想起永久别名,我们就需要更改配置文件,这里我们暂且不细谈。
如果在命令行中出现了不可控的因素(异常),比如输不上字符、按什么也不起作用,那就尝试多按几次Ctrl+C来试图终止。
(9)rmdir
rmdir命令用于删除空目录。 如果该目录 中有文件或者其它目录则不能删除该目录。
(10)rm
rm命令用于删除文件或目录。与rmdir不同,rm可以删除非空目录,通常用于删除文件和文件夹。rm命令没有回收站功能,删除后无法直接恢复,所以要小心使用。
仅仅一个rm只能删除普通文件,它不能删除目录。
因为我们现在是root用户(超级管理员),所以在删除文件前它会问你是否确认删除,输入y代表确认,输入n代表不删。如果我们不想让它问,rm后面加上一个 -f (f可以理解为force)即可。
如果我们想要一次性删除多个文件,可以直接"rm file1 file2..."
我们如何用rm删除目录呢?
使用-r或-R选项来递归删除目录及其中的所有内容。所以rm不仅能删除空目录,它连非空目录都可以删。
这时将a中的全部内容一并删除了(包括a本身),如果我们不想让它询问,可以直接"rm -rf 指定目录"
使用-i选项,在删除每个文件或目录前会询问确认,适合谨慎删除。
需要注意的是:rm -rf命令非常危险,尤其是在根目录或重要目录下使用时,可能会误删大量文件,请小心使用。一旦使用rm删除文件或目录,在没有备份的情况下通常无法恢复。
比如," rm -rf / "当有权限输入这条命令时,你可能马上就会经历"从删库,到跑路"的流程了。
Linux中,*是一个通配符,表示匹配任意数量的字符。例如:ls *.txt会列出当前目录下所有.txt结尾的文件。
同样的,删除也可以这样用:
如果删除后面只有一个*,则表示删除当前目录下的所有文件(不会删除当前目录下的隐藏文件):
要想删除隐藏文件,必须"指名道姓" :
(11)man
man命令用于查看系统中的手册页 (manual pages),即帮助文档。它提供了 Linux 各种命令、配置文件、系统调用等的详细说明,方便用户查阅相关的使用方法和参数说明。
Linux 手册页通常分为多个章节,常见的章节如下:
- 用户命令(一般可执行的命令或工具)
- 系统调用(由内核提供的函数)
- 库函数(程序库中的函数,一般为 C 库)
- 设备说明(设备文件及驱动程序)
- 文件格式(配置文件的格式)
- 游戏和娱乐
- 杂项(如标准、协议及文件系统等的概述)
- 系统管理命令(仅供超级用户使用的命令)
因为man是一个命令,所以我们也可以直接man man来查看man的功能:
其中man手册中每个章节的提供的帮助内容是不一样的。
man后面直接跟命令则会默认从1号手册开始找。这里的printf是Linux中的一个命令,不是c语言中的printf函数,如果要查看c语言中的printf的功能介绍,必须指定手册章节号,如"man 3 printf",它会直接在3号章节开始找,如果找到就显示出来。
首次装系统的同学可能会出现上面的提示信息,我们只需安装一个即可:
然后再运行:
(12)nano
nano是Linux系统中的一种简单易用的文本编辑器,通常用于编辑配置文件或编写简单的脚本。
cat是用于查看文件内容的。 如果执行"nano test.txt"前,test.txt不存在,那么执行后会自动创建出来一个test.txt文件,如果存在,直接就打开了,然后操作相应内容。
如果没有安装则可以用下面代码进行安装:
(13)cp
cp指令用于复制文件或目录。
如果f1是一个普通文件:"cp f1 f2"执行这条指令后,会有以下几种情况:
1、如果f2不存在则会自动生成一个f2文件然后将f1中的内容拷贝到f2中;
2、如果f2存在且为普通文件,则会将f1中的内容拷贝到f2中,f2中原来的内容会被覆盖掉;
3、如果f2存在且为一个目录,则会将f1拷贝一份放到f2这个目录下面,f2不能是当前目录,因为同一个目录下不能存在相同名字的文件。
情况一:
情况二:
情况三:
上面说的都是拷贝普通文件的情况,那如果我们想要拷贝目录,该怎么办?
我们可以用-r选项进行递归拷贝:
如果递归拷贝前,mydir-backup这个目录已经存在,那么就会将mydir这个目录拷贝一份放到mydir-backup这个目录下。
如果拷贝前mydir-backup中已经有一份mydir,再执行"cp -r mydir mydir-backup"这句代码时就会询问你是否要覆盖原先的mydir(前提是两份mydir中都有内容):
如果不想出现询问,则可以加上-f选项强制复制。
(14)clear
clear命令用于清空终端屏幕,让屏幕变得整洁,方便后续的操作或查看输出。
执行后,clear会清除终端上已有的内容,并将光标移到屏幕的顶部。实际上,这并不会删除之前的命令输出,而只是将内容"滚动"到了屏幕上方,仍可以通过向上滚动来查看之前的输出记录。
clear常用于整理终端,特别是在输出信息很多的时候,有助于更清晰地查看接下来的内容。
(15)echo
用于将指定的文本或变量输出到终端屏幕。
它的用法非常简单,注意后面是用单引号引起来的字符串。
Linux中printf指令(不是c语言中的库函数)也可以达到这样的效果:
许多同学容易把cat和echo混为一谈。其实,cat后面跟一个文件名,它是将这个文件的内容打印出来;echo后面跟一个文件名,它会把这个文件名看成是一个字符串,从而将文件名这个字符串打印出来(不会打印文件内容):
知识点:
1、在Linux系统中,一切皆文件!!!
Linux不仅会把各种文件、可执行程序等当作是文件,它还把磁盘、网卡、显卡、键盘、鼠标、显示器这样的设备在系统层面被设计成了以文件的形式呈现出来。在后面的文件系统篇幅,我们再细谈(我尽量快点写出来供大家学习)。
我们现在学习只需知道在Linux系统中一切皆是文件即可。
我们目前最常见的文件有:1.自己创建的文件
在Linux系统中还有三种比较常见的设备文件:2.键盘 3.显示器1 4.显示器2
看到这里,大家可能会不理解,没关系,我来试着解释一下:
我们在学C语言或C++语言时,用printf或cout时可以直接在显示器上进行打印,因为C/C++也要在Linux环境下运行,Linux下一切皆文件,所以打印的本质其实就是文件操作 。所以printf/scanf或cin/cout的本质都是文件操作,任何文件被操作时都必须先被打开。我们在C语言中要想访问一个文件首先要用fopen打开,在C++中要先用fstream的方式打开文件。**所以,这些设备文件在访问之前要必须被打开。**但是我们平时可以直接使用scanf/printf或cin/cout而无需主动打开什么文件,这是因为系统在启动时默认给我们打开了相应的文件。
以C语言为例,我们要想打开一个文件需要调用fopen函数:
它的返回值时FIILE*,程序运行前,系统会默认打开三个文件:
这三个文件的类型都是FILE*,相当于就是用fopen打开的,其中stdin对应的就是键盘,stdout、stderr对应的是显示器,所以程序在启动时默认会打开三个设备文件,这三个设备文件以FILE*的形式呈现出来,方便我们使用。之前我们直接用printf并没有出现stdout,那是因为在printf内部已经封装上了,我们只是看不到。那系统为什么要帮我们打开呢?我们的数据最终是要交给程序的,让程序帮助我们计算,然后将计算结果返回,默认打开是为了让用户默认情况下就能直接输入和直接显示,为了方便操作(不用手动打开了)。为什么不打开其他的?那是因为默认的三个就已经够我们基本使用了,如果需要打开其它的,我们自己手动打开即可。
所以"echo 字符串"这条指令就是将字符串写到显示器文件中,所以我们直接就可以看到。
2、重定向操作
echo指令后面如果只跟了一个字符串,那么它就是将该字符串写到显示器文件中。
那我们也可以将该字符串写到其它文件中:
原本要写到显示器文件中现在却写到hello.txt这个普通文件中,这个过程被称为输出重定向。
这里的hello.txt会有两种情况:1、如果当前目录下hello.txt不存在,那么会在当前目录下新建一个helloc.txt文件,然后将内容写进去 2、如果当前目录下hello.txt存在,那么会先清空helloc.txt的内容然后再写入。
所以我们以后新建普通文件时可以不用touch命令,直接这样写:
我们创建普通文件可以用上述方式,但要确保>后面的文件本身不存在;如果存在,上述操作会将>后面对应的文件内容清空。
如果我们在进行重定向时不想让原有文件的内容清空,而是想在原有文件的基础上追加内容,这也是可以的:
这个过程叫做追加重定向。
上面的重定向都是输出重定向,与输出重定向对应的是输入重定向:
执行cat后,它默认从键盘文件中获取内容然后写入到显示器文件中,所以我们输入了一个aa,然后紧接着就打印了出来,输入bb,紧接着打印出来,输入cc,紧接着打印出来,我们要想结束可以按Ctrl+C。
当我们执行"cat < hello.txt"后,它会从hello.txt中的读取内容,然后将内容写到显示器文件中,打印出来。
cat本身是从键盘中获取内容,然后变到从文件中获取内容,这就是输入重定向。
对文件进行操作时,必须先打开文件,在C语言中打开文件时,会有各种方式(已读的方式打开,以写的方式打开,以追加的方式打开),比如w,r,a...,上面的>相当于就是w(写),而>>相当于就是a(追加)。
终端(通俗理解就是我们写Linux代码的地方)本质上也是一个文件,这个文件被放在/dev/pts/xxx中。每打开一个终端,在/dev/pts/这个目录下就会多一个终端文件,我们可以用"ll /dev/pts"查看,通常文件名是0,1,2,3...,当开多个终端时,我们就可以用输出重定向来将终端1中的内容写到终端2中的终端文件中,这样就可以在终端2中显示终端1重定向的内容,由于这个过程是动态的,我无法在此展示出来,大家可以在自己的设备上演示。
上面我们已经提到过"ls -l"命令会详细的打印文件的属性,其中第一个字符代表文件的类型。
接下来我们就谈谈文件的类型有哪些:
1、-:普通文件
2、d:目录
3、c:字符文件(常见的有:键盘文件、显示器文件、终端文件),它的特点是数据具有顺序性
4、b:块设备文件(磁盘)
5、l:链接文件
6、p:管道文件
7、socket:套接字文件
磁盘是典型的块设备文件:
其中/dev/vda就是一块磁盘,/dev/vda1是该磁盘下的一个分区,块设备支持随机读写。 虽然它是文件,但它是磁盘,我们可不敢直接打开文件并向里面写内容啊。
Linux中大部分都是普通文件,普通文件包含:文本文件、可执行文件、库、图片、视频...
在Linux中,文件的区分是不看后缀的,但不代表禁止使用后缀。我们知道gcc是c语言代码的编译器,Linux系统本身是不关心后缀的,但这并不代表一些工具(gcc)不关心后缀。如果用gcc去编译一个不是以.c为结尾的文件,即使里面的内容是C语言写的代码,照样也不会通过。系统不关心后缀并不代表你不能用后缀,如果加上后缀系统会把它认为是文件名的一部分,所以平时我们创建文件时能加后缀的尽量都加上后缀。
(16)mv
用于移动文件或目录,也可以用来重命名文件或目录。
在Windows环境下,我们可以移动文件的位置。在Linux环境下,我们也可以通过mv指令来移动文件的位置:
"mv srcfile destdir"这条指令中的第一个命令行选项既可以是普通文件也可以是目录,第二个命令行选项就是你要移动到的位置(目录)。
mv的第二个功能就是对文件或目录进行重命名:
"mv src dst"可以对指定文件重命名,那如何区分是移动文件位置还是对文件进行重命名呢?
我们可以看第二个命令行参数,如果第二个命令行参数是目录(且该目录存在)就是移动文件(剪贴),如果不是目录(且不存在)就是重命名。mv后面的第一个参数可以是目录也可以是普通文件,执行后的效果是一样的。
(17)cat
主要用于显示文件内容、合并文件以及创建文件。
上面我们已经接触过cat这个指令了,下面我们再详细的说一下:
cat指令一般是比较适合看短文件的。与cat命令相反的还有一个tac命令,它是反向显示内容:
在Linux系统中,会有日志文件,日志文件起着至关重要的作用,主要体现在以下几个方面:
-
故障排除:当系统出现问题或应用程序遇到错误时,日志文件记录了详细的错误信息、警告和其他相关事件。管理员可以通过查看这些日志来诊断问题的原因,从而快速定位并解决问题。
-
安全审计:日志文件可以帮助追踪潜在的安全威胁。例如,登录尝试、权限更改、文件访问等都被记录下来,这对于发现未经授权的行为非常重要。通过分析这些日志,可以识别出可疑活动,如多次失败的登录尝试可能表明有人试图非法入侵系统。
-
性能监控:系统和服务的日志包含了运行状态的信息,如CPU使用率、内存消耗、磁盘I/O等。这些信息有助于评估系统的健康状况和性能表现,对于优化资源分配和提升效率非常有帮助。
-
合规性与报告:许多组织需要遵守特定的法规要求,比如PCI DSS(支付卡行业数据安全标准)、HIPAA(健康保险流通与责任法案)等,这些规定往往要求保留某些类型的日志记录作为证据。此外,日志还可用作生成业务报告的基础。
-
服务维护:通过定期检查日志,运维人员能够了解哪些服务正在正常工作,哪些服务可能存在潜在的问题。这有助于提前采取措施预防可能出现的服务中断。
-
用户行为分析:除了技术层面的应用外,日志还可以用来分析用户的在线行为,帮助企业更好地理解客户需求,改进产品和服务。
日志可以记录我们的各种操作信息,Linux中日志信息通常放在/var/log/messages这个文件下。日志文件的内容通常是非常多的,我们直接用cat命名的话是不容易看到我们所需要的信息的。
(18)more
more命令的功能和cat差不多也是查看文件的内容的,但与cat命令不同的是,如果文件过大,它不会一次性的展示全部内容,而是先铺满一页,按回车键可以逐行看,按空格键可以一页一页看,按q退出观看。但它有一个缺点,就是它不能往回看,我们正在看当前页就不能再看上一页了。
在用more命令查看文件时,我们可以输入"/字符串",就会将该字符串所在的那一页内容展现出来(只会在当前页向后查找,如果你要找的字符串在当前页的前面,那是找不到的)。
(19)less
less命令同样是查看文件内容的,但它可以支持上翻(上箭头)下翻(下箭头)。
less也有许多命令行选项:
-i 忽略搜索时的大小写;-N 显示每行的行号;/字符串:向下搜索"字符串"的功能;?字符串:向上搜索"字符串"的功能;n:重复前一个搜索(与 / 或 ? 有关);N:反向重复前一个搜索(与 / 或 ? 有关);q:退出
(20)head
用于显示文件的开头部分。默认情况下,head会显示文件的前10行,但可以通过选项来自定义要显示的行数。
(21)tail
用于显示文件的末尾部分。默认情况下,head会显示文件的后10行,但可以通过选项来自定义要显示的行数。
head和tail命令只能查看前面部分或后面部分的内容,如果我们现在就想看看中间某几行的内容该怎么办?
我们现在需求是看到文件的11-15行内容,可以将head和tail搭配起来使用:
这样做可以解决问题,但是需要产生临时文件,我们还可以换种方式,比如这样:
这里出现了一个新的符号|,|是管道的意思,大家可以初步理解为|前的命令执行的结果会交给|后面的命令进行处理。这样我们的操作空间会更大:
这里还有一个命令"wc -l",(w可以理解为word,c理解为count,l理解为line),来统计文件中内容的行数:
(22)与时间相关的指令
1、date
显示系统当中默认的时间。
date 指定格式显示时间: date +%Y:%m:%d
date 用法:date [OPTION]... [+FORMAT]
在显示方面,我们可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下:
- %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
注意+号一定不能省略,但后面-/:/_可以根据自己的意愿来。
小知识:
我的计算机已经关机了,为什么开机之后,还可以准确识别时间呢?
这是因为,在我们电脑的主板上都会有一个纽扣电池,即使电脑关机了,这个纽扣电池还是会有电的,它可以维持2周、3周、一个月、二个月等这么长时间,这个纽扣电池会让系统主板一直给我们记录时间,所以开机之后可以准确识别时间。如果纽扣电池没电了,开机后就不会识别时间了。
上面代码中我们每执行一次"date +%s"显示的是一大串数字,而且每次还显示的不太一样,这串数字是什么意思?
它其实是时间戳。Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
任何一个计算机做时间记录时,它不是记录年月日时分秒这种样子,它都是按照以秒为单位,在内部会维持一个线性递增的计数器,每隔1秒,让这个计数器++,时间是从1970年1月1日开始到现在所累积经过的秒数,这个秒数被称为时间戳。
这个时间戳有什么用?
1、转换为具体时间
2、区间查找。每条日志需要有时间戳,如果现实中某个文件在一个时间段出现问题,就可以通过时间戳锁定一个范围,那么我们只需在这个范围内查找问题所在。
如何将这个时间戳转换为具体的时间呢?
我们可以这样:
@后面跟上时间戳。我们通过这也可以看到它就是从1970年1月1日开始计时的:
我们这里看到是8点而不是午夜,这是因为我们是有时差的,时间戳的定义是以格林威治为标准的,北京与格林威治有8个小时的时差。这样不会出现时间混乱,时间是非常重要的,我们做任何事情都会有时间,时间一旦不统一就会有大麻烦,整个世界就会混乱。
2、cal
cal命令用于显示日历。
这个日历其实也是根据时间戳生成的。
它又有几个常见的命令行选项:
-3 显示系统前一个月,当前月,下一个月的月历
-j 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)
-y 显示当前年份的日历
(23)find
在文件系统中查找文件和目录。
在上面我们其实已经接触了一个查找命令which,但它只会在指定的目录下,去查找指定的命令;这个指定的目录通常是/usr/bin。
find用法如下:
我们知道文件系统其实就是一颗多叉树,find查找的过程可以认为是深度遍历,如果从根目录开始找一个文件,那么可能效率不是那么高。find的命令行选项有很多,这里我们先学会用-name。
(24)grep
在文件中搜索字符串,将找到的内容的行打印出来。
grep也被称为行文本过滤工具,它会把包含某种关键字的行给我们展示出来供我们筛选。
grep也有一些常见的命令行选项:
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出所处文件的行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
(25)zip/unzip
介绍这两个命令前我们先来说明一下打包压缩到底是什么意思?
打包:文件合并。
压缩:文件合并后可能会比较大,所以我们需要用一些压缩算法来减少文件的大小。
那么为什么要将文件打包压缩呢?
打包**:防止文件丢失**。我们通常下载的软件通常是由多个文件组成的,假设我们下载软件时少了一个文件,那么就可能导致我们无法使用该软件;我们如果将一个软件的所有文件进行打包,那么在下载时就不会出现少文件的情况。
压缩:减少打包后文件的体积。这样的好处有:节省存储空间。我们下载各种文件时,都要经过网络传送,压缩可以有效减少网络传送时间。
那么我们就应该学习一下如何在Linux上对文件进行打包压缩和解压的。
在Linux中zip的功能是将目录或文件压缩成zip格式,uzip用来解压 ZIP 格式的压缩文件。
在使用zip/uzip之前我们看看我们的系统上是否装了zip/uzip命令:
如果是Ubuntu用户,将yum换为apt即可。
下面是压缩和解压的过程:
出现上述问题,是由有我们在打包压缩过程中没有递归式进行导致的,所以我们应该这样写:
我们在打包压缩时尽量带上.zip,Linux系统的确不会识别后缀,但是zip/unzip这些工具会识别,如果压缩文件后缀不是zip,那么unzip可能就不起作用了。在CentOs下如果在打包压缩的过程中没有加上.zip,那么在执行zip命令后后,它也会自动给你加上的。
我们在执行unzip后一般是将压缩包减压到当前目录下,在Windows系统中,我们在解压时可以选择解压在指定目录下;在Linux中,我们也可以选择解压到指定目录下:
现在,如果我们要将云服务器上(Linux系统)的压缩包传到Windows系统上,该怎么传?
1、需要用到sz和rz命令(sz:sent zip / rz:receive zip)
首次使用若没有安装,可以先安装一下:
安装完毕后,我们就可以使用sz和rz命令了:
当我们使用执行"sz 压缩包"时:会弹出一个弹框,让我们选择放在Windows系统哪个文件夹下:
我这里是选择将它放在了桌面上。
上面的操作是将Linux中的压缩包传到Windows上,那么我们也可以将Windows上的压缩包传到Linux上:
让我们输入rz命令时,也会弹出一个弹窗让我们选择要传的文件:
我们就将Windows上的blue.zip传到了Linux上了:
我们也可以直接将Windows中的压缩包文件直接拖拽到Xshell上,完成传送文件:
上述操作对文件也是如此的。
(26)tar
tar命令也是用来进行打包压缩和解压的,tar命令一般是系统自带的,我们不需要主动安装。
tar后面的命令行选项比较多:
- -c :建立一个压缩文件的参数指令(create的意思);
- -x :解开一个压缩文件的参数指令!
- -z :将文件压缩。是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
- -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
- -f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
- -C : 解压到指定目录
压缩过程:
解压过程:
所以,tar命令在打包压缩时不需要加-r选项。使用tar在压缩文件时指定的压缩文件名后面必须加上.tar.gz或者.tgz。
tar还有其它的命令行选项,比如-v就是显示文件压缩或解压的具体过程。如果文件包非常大时,我们可以用-v选项来看到压缩和解压的过程。
我们也可以将tar命令解压解包后的将文件放在指定目录下:
上面的tar命令后的xzf或czf前都带上了-,我们也可以去掉-。有些同学带上-可能会出错,所以我们在写时尽量不带-。
用tar命令生成的压缩文件也能与Windows互传。
我们上面所说的互传其实都是Linux与Windows之间的,但是我们也是可以在Linux与Linux之间进行互传:
它需要用到scp命令,scp命令一般系统会自带,不需要我们手动下载。
它的用法是:"scp 压缩包文件 目标机器用户名@目标机器公网ip:目标机器指定路径"
(27)bc
bc命令可以很方便的进行浮点运算。
按Ctrl+C可以退出。
我们可以配和echo命令使用:
(28)uname
uname用来获取电脑和操作系统的相关信息。
uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。
如果想在Linux环境下查看体系结构和系统内核版本,就可以使用uname指令:
"uname -a"这条命令会显示关于系统的全部信息。
现在如果不想看那么多,只想看内核版本和它对应的体系结构,那我们就可以"uname -r"这条命令:
所谓的体系结构其实就是芯片结构:
一般会有两种,它们是:x86_32、x86_64(x64) 。当您看到系统报告中的x86_64,这意味着您的操作系统正在一个 64 位的处理器上运行,并且安装了一个 64 位的操作系统。
(29)history
打印历史命令。(最多记录x条,x取决于你的设备)
(30)关机
在Linux中,shutdown, halt, 和 reboot 是用于控制系统电源状态的命令。下面是这些命令的基本用法和含义:
① shutdown
shutdown命令用于安全地关闭或重启系统。它会通知所有登录用户系统即将关闭,并等待一段时间以便用户可以保存工作并退出。
- `shutdown -h now` 或 `shutdown -h`:立即关机(`-h` 表示 halt)。
- `shutdown -r now` 或 `shutdown -r`:立即重启(`-r` 表示 reboot)。
- `shutdown -h +10`:在 10 分钟后关机。
- `shutdown -t 10`:在10秒后关机。
- `shutdown -c`:取消一个已经计划的关机操作。
② halt
halt命令用于停止系统的运行,并使系统处于待机状态,但不会切断电源。通常需要超级用户权限才能执行此命令。
- `halt`:停止系统运行,但不切断电源。
- `halt -p` 或 `halt --poweroff`:停止系统运行并切断电源,等同于关机。
③reboot
`reboot` 命令用于重启系统。同样,这通常也需要超级用户权限。
- `reboot`:立即重启系统。
注意事项
-
使用这些命令时,请确保所有重要的数据已经被保存,因为这些操作会导致未保存的工作丢失。
-
在执行这些命令之前,请确认是否有其他用户正在使用系统,特别是当使用 `shutdown` 命令时,因为它会发送关机通知给所有用户。
-
如果你在图形界面下,可能也有图形化的选项来执行这些操作,通常位于系统菜单中。
请谨慎使用这些命令,特别是在生产环境或共享系统中。如果您不是系统管理员,可能没有权限执行这些命令。
二、快捷键
(1)Alt + Enter:全屏/退出全屏(基于Xshell)
(2)Ctrl + C:终止异常任务
(3)上下键:查看上下命令
(4)Tab键:自动补全命令(比如一个命令touch,你输入tou后忘记后面是什么就可以按下tab键补全命令,有时候也可以提高敲代码的效率,如果以tou为开头的命令有多个,那么按两下tab键就可以将所有的以tou开头的命令罗列出来)
(5)Ctrl + R:搜索历史命令
(6)Ctrl + D:退出当前用户账号
三、shell命令以及运行原理
介绍shell命令前,我们先来了解一些东西:
命令行这一长串字符串不是凭空而来的,它不是由操作系统本身给我们提供的功能,而是由一个叫外壳程序的"家伙"给我们提供的一个可以读取命令和识别命令的东西。
Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)" ,但我们一般用户,不能直接使用kernel。而是通过kernel的"外壳"程序,也就是所谓的Shell。
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter),它主要包含:将使用者的命令翻译给核心(kernel)处理,同时,将核心的处理结果翻译给使用者。
我们以一个故事来感性的理解一下shell:
在一个村子中,有一个人名叫小王。他的家里非常有钱,他是单身,他非常害羞,和女孩说话时就会脸红。现在,他想找一个女朋友,由于不敢和女孩说话,于是他找到了村中的媒婆,让媒婆来搭这条线,于是媒婆问他喜欢什么类型的女孩,他只说了一句,"我只喜欢隔壁的如花",于是媒婆就跑到如花家中,询问如花是否愿意,如花说,"我并不喜欢他",所以媒婆收到信息后,返回到小王家中,并告诉了他这个消息,小王听到后对媒婆说再帮他争取争取,于是外婆又跑到如花家中,如花又给拒绝了,然后媒婆返回小王家并告知小王,小王听后还是不甘心,于是又让媒婆去争取争取,就这样反反复复好几次,当媒婆再一次去如花家中,还没走到就看到隔壁的小帅在如花家中吃饭,并有说有笑,媒婆就想"算了吧,不进如花家门了",于是返回小王家并将看到的告知小王,小王听后伤心的哭了......。
上述故事中小王就是我们用户,而如花就是操作系统,媒婆就是外壳程序,小王说"我就喜欢如花"就是在外壳程序上输入了命令,媒婆跑到如花家并告诉她这个消息,这个过程就是将命令交给操作系统,如花对他不感兴趣,这就表示我们执行命令出错了,媒婆听过到这个消息后就返回小王家中,并告诉他这个消息,这叫做外壳程序返回错误信息给用户。
在这个过程中,由于小王不适合与女孩打交道,所以媒婆这个角色是必须存在的。
所以我们用户为什么一定要用命令行指令来操作访问操作系统,为什么不直接访问操作系统呢?
因为用户不擅长与操作系统内核直接打交道,实际中也是很难做到的,所以就必须存在这个外壳程序来间接帮助我们和操作系统内核产生联系。
上述故事的最后一部分,媒婆没进如花家的门,就变相的保护了如花家和谐的氛围。所以如果我们用户输入一个非法指令,shell一旦识别到你这个请求特别不合理,shell外壳就直接拦住你,不会将该指令交给操作系统,此时,外壳程序就变相保护了内核(也提高了一定的效率)。
所以,为什么存在外壳程序?
1、方便用户访问操作系统内核
2、保护内核
对于外壳程序,我们暂且理解到这。
我们上面说过在Linux中一切皆文件,命令行解释器是一个文件,它的名为bash,它的绝对路径是:/bin/bash
那么shell和bash有什么区别呢?
我们可以将shell看作是媒婆,将bash看作是王婆。也就是,shell是所有外壳程序的统称,而Linux中具体的shell外壳程序叫bash。还有其它的操作系统的shell外壳程序叫其它的名字(sh,xsh...)
在Windows环境下,我们操作Windows也不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序),这个我们就可以将图形化界面理解为外壳程序,从而间接访问Windows内核,然后结果通过外壳程序以图形化的形式返回给我们用户。
四、结语
本篇内容到这里就结束了,主要讲了Linux中常用到的基本指令,希望对大家有帮助,祝生活愉快!