本文将给大家详细介绍Linux常用的指令、演示以及一些基础知识的讲解
目录
ls指令 file指令 pwd命令 whoami指令 cd指令 相对路径和绝对路径 which指令 touch指令 mkdir指令 添加用户信任关系 rmdir指令 rm指令 man指令 cp指令 mv指令 编辑 cat指令 echo指令 重定向 more指令 less指令 head 指令 tail指令 管道操作 date指令 cal指令 find指令 grep指令 zip指令/unzip指令 tar指令 bc指令 uname 指令 shutdown指令 stat指令 Linux下的三个时间 touch指令补充 Linux中的热键- 指令一览
ls指令
语法:ls [选项] [目录]
功能:ls有多个选项,对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息
ls不带选项默认显示当前目录下的文件
选项:
-l
:以列表的形式列出文件详细信息
在Linux系统中,不以文件后缀区分文件类型,而是以第一个字符标识文件类型,不管是文件后缀是.c
还是.txt
或是其他后缀,只有是以-开头的就是普通文件
d:目录文件,简单来说就是文件夹,我们可以在该目录文件下新建文件 -:普通文件,分为文本文件、动静态库、可执行程序等 l:软链接(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备)- s:套接口文件
我们今天重点在前面的两类文件
单普通文件就可以分很多种,为了兼容windows同时便于我们大多数linux的用户区分文件的不同,我们还是习惯通过后缀来表示不同文件的类型。但有的文件必须加后缀,例如用c语言写的
.c
文件,需要特殊处理,以后缀区分类型
-a:显示目录下的所有文件包括隐藏文件,以点开头的表示隐藏文件,其中一个点表示当前路径,两个点表示上一级路径,我们将在下面的cd指令中讲解和..
-d :将目录像文件一样显示,而不显示目录下的文件,这里的点,就表示当前路径
-R:列出所有子目录下的文件(以递归的方式) ,目录下的所有文件都会列出来
-n :用数字的 UID,GID 代替名称
还有一些其他的选项就不演示了,大家下去可以尝试一下
-1 一行只输出一个文件 -r 对目录反向排序 -k 以 k 字节的形式表示文件的大小。ls –alk 指定文件 -i 输出文件的 i 节点的索引信息。如 ls –ai 指定文件- -t 以时间排序
file指令
功能:文件类型
语法:file [文件]
[kingVM-12-11-centos ~]$ file cat.txt
cat.txt: UTF-8 Unicode text #类型是文本文件
[kingVM-12-11-centos ~]$ file ret #类型是目录文件
ret: directory
pwd命令
语法:pwd
功能:显示当前路径
whoami指令
功能:显示当前用户
两种写法
cd指令
功能:切换路径
用法:cd [想要切换的路径]
Linux是以多叉树的结构管理文件的,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。根目录:/
相对路径和绝对路径
当我们需要找一个文件时,就必须知道文件所在路径和文件名,例如寻找text.c
文件,因为每一个节点只有一个父亲节点,从根目录出发到text.c
文件的路径是唯一的。完整的描述文件位置的路径就是绝对路径,绝对路径能唯一标识一个文件,上面的pwd指令显示的就是绝对路径
而相对路径是:自己相对于目标位置而言的路径,不具有唯一性,我们可以从不同的位置找到文件
绝对路径:从跟目录出发到到指定文件的路径,能唯一标识一个文件
相对路径:从某个文件出发到指定文件的路径,不能唯一标识一个文件
cd命令就可以通过相对路径和绝对路径的方式进行路径切换
可以通过绝对路径切换到指定目录
也可以通过相对路径切换,点点表示上一级路径,cd ..
切换到上一级目录,cd ../../
切换到上上级路径
[kingVM-12-11-centos Linuxclass]$ pwd
/home/king/Linuxclass
[kingVM-12-11-centos Linuxclass]$ cd classcode
[kingVM-12-11-centos classcode]$ ls
a.out ret.txt test test.c
[kingVM-12-11-centos classcode]$ cd test
[kingVM-12-11-centos test]$ cd ../../p1 #切换到上上级目录的p1路径下
[kingVM-12-11-centos p1]$ pwd
/home/king/Linuxclass/p1
有的小伙伴可能就有疑问了,cd ..
可以切换到上一级路径,那么cd .
有什么用呢?我们本来就在当前目录下,不需要切换啊。
这里我们用vim编写一个
hello Linux
的代码,通过gcc编译,生成a.out的可执行程序,而我们要运行可执行程序就需要路径和文件名,用点就可以表示它的路径了,相比于下面用绝对路径方便很多
cd还有两个选项
[kingVM-12-11-centos Linuxclass]$ pwd
/home/king/Linuxclass
[kingVM-12-11-centos Linuxclass]$ cd ~ #cd ~进入工作目录,就是用户的路径下
[kingVM-12-11-centos ~]$ pwd
/home/king
[kingVM-12-11-centos ~]$ cd - #cd -返回最近一次访问的路径
/home/king/Linuxclass
which指令
语法:which [指令]
功能:指令的系统路径和相关信息
[kingVM-12-11-centos Linuxclass]$ which ls
alias ls=\'ls --color=auto\' #alias:给指令取别名
/usr/bin/ls #我们的指令都是系统简化过的
[kingVM-12-11-centos Linuxclass]$ which ll
alias ll=\'ls -l --color=auto\' #ll可以代替ls -l
/usr/bin/ls
[kingVM-12-11-centos Linuxclass]$ which cd #同时我们发现指令都是在bin目录下的
/usr/bin/cd
指令本质上就是程序,Linux中,指令、命令、工具都是可执行程序 ,都存放在普通文件中,linux下一切皆文件,我们的指令都在bin目录下
touch指令
功能:新建文件,更改文档或目录的日期,包括存取时间和更改时间,我们先了解新建文件,关于更改目录日期我们在文章的最后介绍
需要注意的是touch创建的是普通文件,不是目录文件,所以不能cd进入
[kingVM-12-11-centos test]$ touch file1 file2 file3 #touch可以连续创建多个文件
[kingVM-12-11-centos test]$ touch file4 #创建单个文件
[kingVM-12-11-centos test]$ ls
file1 file2 file3 file4
mkdir指令
功能:新建目录文件
mkdir也可以同时创建多个目录文件,cd可以进入,但是不能在一个目录文件下再创建多个子目录,这里就显示无法创建
选项-p:递归建立多个子目录
添加用户信任关系
这里的tree指令是以树状显示文件,需要用yum
yum intsall -y tree
如果我们是普通用户,需要在前面加sudo, sudo可以短暂提升权限,以root的身份执行相应指令
单独su表示切换为root用户,需要输入root用户的密码
[retVM-12-11-centos ~]$ su
Password: #输入root用户密码
[rootVM-12-11-centos ret]# whoami #切换为root用户
root
[rootVM-12-11-centos ret]# su ret #root用户可以直接切换成指定用户,不需要输入用户密码
[retVM-12-11-centos ~]$ whoami #现在我们就切换到用户ret了
ret
如果我们sudo yum install -y tree
显示类似如下的指令,表示当前用户没有添加信任关系
需要以root的身份帮用户添加信任关系,我们将身份切换为root用户,执行如下指令即可添加信任关系,之后我们就可以sudo 了
echo \'xxx ALL=(ALL) ALL\' >> /etc/sudoers (其中xxx代表用户名)
rmdir指令
功能:删除空目录 ,也就是不存放其他文件的目录
这里p1不为空,所以无法删除,如要借助rm指令
rm指令
我们删除文件一般都用rm指令,rmdir有点鸡肋
功能:删除目录或文件
选项:
-f:强制删除 -r:删除目录及目录下的所有文件,以递归的方式。
删除目录要带r选项,此时我们的p1/p2/p3就删除了
如果我们想删除目录中的所以文件而不想删除目录,直接加通配符*
切记别把根目录给删除
rm -rf / #切记不要使用,递归强制删除根目录,可能会把系统干崩
man指令
linux中有很多的指令,如果我们不记得某个指令的使用,可以man一下,问问那个男人
选项:
1 是普通的命令
2 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文 件)
3 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件
5 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
6 是给游戏留的,由各个游戏自己定义
7 是附件还有一些变量,比如向environ这种全局变量在这里就有说明
8 是系统管理用的命令,这些命令只能由root使用,如ifconfig
9 内核例程
我们目前先了解 1 和 3
同样man需要我们 ,普通用户加sudo
yum install -y man-pages
man不加选项,默认解释指令
[kingVM-12-11-centos file11]$ man ls
q退出当前界面
$ man 3 printf #我们可以printf库函数
cp指令
语法:cp [选项] [源文件] [目标文件] [指定目录]
功能:复制文件或目录
常用选项:
-f 强行复制文件或目录, 不论目的文件或目录是否已经存在
-r 递归处理,将指定目录下的文件与子目录一并处理。
我们复制文件file11,同时命名为file
默认复制到当前目录下,也可以最后指定目录
mv指令
功能:移动文件或重命名文件
用法:mv [选项] [源文件] [目标文件]
选项:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
这里我们将文件file11移动到file目录下
如果mv后面跟的不是文件,而是文件名,就会将文件重命名
例如将文件file11重命名为change
cat指令
功能:文件内容
语法:cat [选项] [文件]
选项:
-b :对非空输出行编号
-n :对输出的所有行编号
-s :不输出多行空行
echo指令
功能:将字符串显示到标准输出,也就是屏幕上,echo默认换行
重定向
那我们可以将字符串写入文件中吗?
答案是可以的,通过重定向,字符串后面加 > 符号和文件名,就可以将本该显示到标准输出的字符串,写入文件中,如果文件不存在,就会自动创建文件,这就是输出重定向
将本该显示到屏幕上的字符串写入目标文件中,同时输出重定向会清空文件原始内容再重新写入
在此写入时,之前的hello Linux已近被清空了
想要保留之前的内容并写入就需要追加重定向 > 符号变成 >> 符号
cat指令后面不加文件,默认从键盘中读取内容并回显到显示器上,也就是屏幕上
之前cat显示文件内容就是通过输入重定向显示的
[kingVM-12-11-centos ~]$ cat < file #这个 < 符号可以省略
AAAAAAA
BBBBBBB
CCCCCCC
more指令
功能:和cat类似,一般用于日志,内容比较长的文件
选项:
-n :对行编号
q :退出more
比如这里我写一个内容从0-1000行的文件
count=0; while [ $count -le 1000 ]; do echo \"hello ${count}\"; let count++; done > cat.txt
1more会先显示一部分内容,按回车就可以继续读取内容,按q退出,但more有一个弊端,只能往下翻,不能往上翻,所以我们一般不用more指令
less指令
功能:文件内容,less用法比more更具有弹性,可以使用 [pageup][pagedown]
(前后按键)等按键的功能来往前往后翻看文件,而且less在之前不会加载整个文件。
选项:
-i :忽略大小写
-N :显示行号
/字符串:向上搜索字符串的内容
?字符串:向下搜索字符串的内容
n :重复前一个搜索(与/ 或?有关)
N:返向重复前一个搜索(与/ 或?有关)
q:退出less
[kingVM-12-11-centos ~]$ less cat.txt
我们输入 /3向上搜索字符3,less就会帮我们标记字符3的内容
还有其它选项大家可以直接尝试,这里就不在演示了,我们q退出less界面
head 指令
功能:显示文件内容的开头到标准输出,也就是屏幕上,head不加参数默认显示前10行
选项:
-n<行数>
[kingVM-12-11-centos ~]$ head cat.txt #默认输出前10行
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
[kingVM-12-11-centos ~]$ head -n5 cat.txt #指定输出前5行
hello 0
hello 1
hello 2
hello 3
hello 4
[kingVM-12-11-centos ~]$ head -5 cat.txt # n可以省略
hello 0
hello 1
hello 2
hello 3
hello 4
tail指令
功能:用于显示指定文件末尾内容,我们一般日志时肯定是最新的内容,也就是从尾部开始,tail就能很好的帮助我们最近的内容
选项:
-f :循环读取
-n<行号>
:显示行数
tail - f filename
会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容,非常适合日志
[kingVM-12-11-centos ~]$ tail cat.txt #tail不加行号默认显示尾10行
hello 991
hello 992
hello 993
hello 994
hello 995
hello 996
hello 997
hello 998
hello 999
hello 1000
[kingVM-12-11-centos ~]$ tail -n5 cat.txt #指定显示尾5行
hello 996
hello 997
hello 998
hello 999
hello 1000
[kingVM-12-11-centos ~]$ tail -5 cat.txt #n可以省略
hello 996
hello 997
hello 998
hello 999
hello 1000
那我们可以显示文件的头和尾,如果要显示文件中间的内容怎么办呢?
比如我们要显示第100行到110行,有两种方法:
通过重定向将前110行写入一个tmp临时文件,然后在读取尾10行,不过这种方法需要重新创建文件,不进浪费空间效率也低
答案是有的,第二种方法借助管道操作
管道操作
使用管道时,默认隐式发生了重定向
# 符号 | 表示管道,通过管道将执行的结果传给下一条指令
[kingVM-12-11-centos ~]$ head -110 cat.txt | tail -10
hello 100
hello 101
hello 102
hello 103
hello 104
hello 105
hello 106
hello 107
hello 108
hello 109
date指令
格式
%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
[kingVM-12-11-centos ~]$ date #date默认显示
Fri Jan 28 16:55:54 CST 2022
[kingVM-12-11-centos ~]$ date +%s #date +%s显示时间戳
1643360162
[kingVM-12-11-centos ~]$ date +%F%X #按年月日 时分秒的格式显示当前时间
2022-01-2804:56:08 PM
[kingVM-12-11-centos ~]$ date +%F%X1643360162 # 时间戳,将时间戳转换成标准时间
2022-01-2804:56:27 PM1643360162
我们可以加_以示区分,但不能是空格,这种写法是错误的
cal指令
功能:日历
选项:
-3 显示系统前一个月,当前月,下一个月的月历
-y 显示当前年份的年历
cal默认显示当前月的月历
[kingVM-12-11-centos ~]$ cal -y 2021 #也可以指定年份显示2021的年历