文章目录
- 一、通配符 *
- 二、man指令
- 三、cp指令
- 1.先给一个文件里面写入数据
- 2. cp指令拷贝普通文件
- 3.cp指令拷贝文件目录
- 4.常用的选项总结
- 四、mv指令
- 1.mv命令简介
- 2.使用
- 五、一些插曲
- 1.一些注意事项
- 2.指令的本质
- 3.再谈输出重定向
- 4.追加重定向
- 5.输入重定向
- 六、cat指令
- 七、more指令
- 1.cat缺陷
- 2.more指令
- 八、less指令
- 1.简介
- 2.使用
- 3、为什么要看大文本呢?
- 九、head指令
- 十、tail指令
- 十一、如何提取中间的某一段区间行数的文本
一、通配符 *
我们先在Linux上创建一些普通文件
如果我们
然后我们现在来使用一下这个通配符。如果我们直接使用ls \*
操作,那么其实和直接ls
没有什么区别
如果说我们使用ls *.c,这样的话就会自动将.c为后缀的文件全部给筛选出来
如果使用ls test.\*
,那么他就会把所有前面是test.
的文件给拿出来
这样的话,如果我们要删除一部分文件的话,我们就可以使用通配符了
我们可以注意到我们当前是个普通用户,当我们删除东西的时候,并不会询问我们,只有root账号才会去询问我们,那么如果我们想要让普通用户也被询问,我们就可以在rm
后面加上 -i
二、man指令
Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是
man 语法: man [选项] 命令
比如说我们按住man ls
指令,就可以罗列出该指令的手册
我们想要离开的话,按住q
就可以离开了
也可试一下man pwd
指令,看看它的解释
我们也可以man rm
,甚至于我们可以man man
问它自己是干啥的
在这里我们可以看到它有九个手册
第一个手册是查询当前Linux基本命令
第二个手册是查询系统调用接口
第三个手册一般用于查询C语言的接口
后面几个手册我们暂时不关心
比如我们可以直接man printf
查询这个函数
而我们发现,printf除了在C语言中是一个函数外,它在Linux下还是一个指令
而这个指令和我们之前C语言的指令没半毛钱关系
而如果我们需要查C语言中的printf接口的话,我们就得查3号手册了,这里需要注意了,我们可能需要先下载一个东西:yum install man-pages
注意一定要用root账号,然后会让你选择y/d/n,选择y即可
然后我们就可以正常使用这条指令了:man 3 printf
如果我们想使用2号手册的话,我们可以先随便选一个接口,进行系统调用比如:man 2 fork
man手册除了指定编号以外,也可以不指定编号,这样的话就是按照手册的编号,一个一个往下找了。如man printf
,man fork
,man ls
等等
这也就解释了,为什么直接man printf
会显示一号手册的。因为它默认先按手册的编号去寻找,多个手册同时存在,优先前面的手册。
三、cp指令
1.先给一个文件里面写入数据
cp是一个拷贝指令,我们可以先创建一个普通文件
然后Linux中还有一条指令echo "一些字符串"
,这条指令会将一些字符原封不动的打印到屏幕上去
看上去这个指令很无聊,没有什么用,但其实如果我们将这个字符串后面加一个> 文件名
,在这里就是echo "hello Linux" > test.txt
就会发现不在屏幕上打印了。而且我们的文件的字节数由0上升到了12,也就是说,这个字符串写到了这个文件中了
接下来我们可以使用cat 文件名
指令来进行打印文件中的东西,也就是cat test.txt
指令
我们继续回到刚刚的话题,我们使用>
以后,出现了两件事情,一是屏幕上不在打印原来的字符串了,没有在显示屏是显示,二是 而是这个数据被写入了文件中,我们将这件事称作输出重定向,输出重定向的含义就是本来应该显示到显示器上的内容,打印到文件中
2. cp指令拷贝普通文件
我们上面做了这么一大堆操作,目的就是为了给一个文件里面写入数据
cp指令的基本用法就是cp src dest
,也就将src文件的数据拷贝给dest文件,这里的顺序与C语言的是相反的
如下所示,我们将test.txt
的数据拷贝给test_backup.txt
这里就是同一个路径不同名的文件之间的拷贝
如果我们不小心写错了,自己拷贝自己,这是不允许的。会显示错误
也就是说拷贝的文件,源头和目的不能一样
如果我们想将文件拷贝到上级目录也是可以的,只需要将文件的路径写对即可,绝对或者相对路径都是可以的
常识告诉我们:同一个目录下不可以有两个同名文件,但是不同目录下是可以的
然后我们上级目录下的test.txt已经完成了任务,我们现在就可以删除它了,直接使用rm ../test.txt
即可
3.cp指令拷贝文件目录
我们有时候也需要将一个目录的文件全部拷贝到另外一个地方,那么这该怎么办呢?
如下所示,我们已经创建好了一个目录d1/d2/d3,即一个目录里面也有很多的目录
如下图所示,当我们直接拷贝的时候,我们发现不可以直接拷贝
这其实是因为里面有很多的文件,所以我们拷贝的时候要加上-r,代表递归式拷贝
我们还可以通过去查看test.txt文件的内容来判断是不是我们所期望的那样,我们发现果然如此
为了方便后序讨论,我们先把我们拷贝的这个目录给删掉
我们可以在观察一下,如果我们加上-i选项的话,它会询问我们是否拷贝这个文件,不过在这里并没有询问我们。
下面由于刚刚我们已经拷贝过一次2号文件了,那个文件已经存在,当我们想要进行拷贝也就是覆盖的时候,我们使用-i就会进行询问了
不过我们一般也会使用-f选项来强制拷贝
如果我们使用-if指令的话,那么其实它会选择听询问的那个,因为这样安全系数更高
4.常用的选项总结
对于cp指令事实上,我们最常使用的就是-r选项和-f选项
cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息
-f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
-i 或 --interactive 覆盖文件之前先询问用户
-r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
-R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理
四、mv指令
1.mv命令简介
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录。
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。
常用选项:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖
2.使用
如下所示,我们使用mv命令使得一个文件改名
然后我们可以进行剪切
然后我们在可以剪切回来
而且还可以剪切并重命名
那么到底何时剪切,何时重命名呢?
如果mv的第二个参数是纯目录形式的,那么就是单纯的剪切
如果mv的第二个参数是目录后面带一个名字,那么就是剪贴并重命名
其实我们也可理解所有的mv行为叫做剪切并重命名
只不过如果未来没有指定名字的时候,就使用原来的名字。
五、一些插曲
1.一些注意事项
一些注意事项
ctrl + C 是终止因为程序或者指令异常,导致我们无法进行指令输入,无名可以直接无脑ctrl + C
由于在linux系统中本身没有垃圾桶,导致了rm操作是很危险的,而垃圾桶的本质其实就是一个文件,所以我们可以通过某些方式让rm操作变成mv操作,也就是说将文件移入一个垃圾桶里面去,从而可以模拟一个垃圾桶
2.指令的本质
还有一点是关于我们应该如何看待指令?
其实指令和可执行程序是都是可以被执行的,所以指令就是可执行程序
执行指令之前,我们应该先做什么?
应该先在系统中查找对应的指令,因为我们输入一个非法指令的时候,就会提示没有找到该指令。
所以指令一定在系统中的某个位置存在的
由于指令就是可执行程序,而且指令一定在系统中的某个位置存在的,那么究竟存在在哪里呢?
其实指令是存在在/usr/bin路径下的
当我们输入指令ls /usr/bin以后我们可以直接观察到
我们也可以通过以下方式去查看对应的指令
所以我们得出一个结论:指令是在系统中特定的路径下存在的!一定是某种可执行程序
有了上面的思路,当我们写了一段代码以后,并生成了可执行程序以后,我们可以对其进行重命名为一个关键字,然后将他拷贝到/usr/bin/路径下。这样的话我们就可以直接使用这个关键字去运行对应的功能了,这样过程其实就是软件的安装
如下所示,下面的a.out就是一个可执行程序,不过它其实就是将.c程序编译以后形成的
但是我们一般最好不要这样搞,虽然它是可以的。
我们也可以使用rm指令对其指定目录删除这条指令,这就是卸载
所以我们所用的一切指令都是别人写的可执行程序,放在了指定的目录中,仅此而已
即便是我们所熟悉的windows系统,也是一样的,这些快捷方式就可以看作是指令,实际的这些都是放在了一个固定的位置,都是可执行程序
指令的本质就是文件,可执行文件罢了,就是安装到了系统的某种路径下
不过这里还有一个问题下面的指令比如ll可以直接使用,但为什么我们找不到这个呢?
我们可以使用which指令,这个which指令是查看某条指令的路径
在这里我们可以看到ll其实就是等于ls -l的,也就是说ll是ls -l的别名,后面的color是一个配色方案,就比如在linux中各种指令有一些颜色,这里我们不用管他
这里使用重命名的是使用alias完成的。
如下所示,就是我们对一个指令取别名
当我们重命名以后,我们也可以对他使用which了
对于同一个名字,我们可以再给他来一次重命名,如下所示,我们给_cmd一个空指令,那么执行它就什么也不发生了
那么如果去将这个重命名给不让他重命名了呢?其实我们可以直接关闭Xshell就可以了,也就是说,这里只是临时的重命名,当我们再度打开Xshell的时候,以前的重命名就不见了
3.再谈输出重定向
Linux下一切皆文件,比如显示器,键盘,普通文件…
-
对于显示器,它只有fwrite写方法,但是没有读方法,或者我们可以认为它的读方法为空。(我们平时scanf在屏幕上看到的都是键盘读取的,只不过回显到了屏幕上)
-
对于键盘,它只有fread读方法,但是没有写方法,或者我们认为它的写方法为空。
-
对于普通文件,它既可以读取也可以写入。
总而言之,就是具有读写方法的就是文件
既然如此了,那么下面指令的说法,我们也可以称之为,将这个字符串写入显示器上去
而向下面这种行为,就是将本应该写入显示器上的字符串写入到了一个文件中,这种方法我们称之为输出重定向
像下面这个cat就相当于将test2.txt的内容写到了显示器上,ll就相当于将文件的属性写到了显示器上
还有一点我们需要关心的就是,echo看起来好像是直接覆盖原来的内容
其实它里面做的是两件事情:1. 清空文件 2. 写入新内容,这也是输出重定向的特点
我们也可以这样操作,直接输出重定向,什么也不写,那么就是将test2给清空了
4.追加重定向
由于输出重定向会将原来的文件给清空,但是有时候我们不想去清空,有办法吗?当然有
那就是连续的两个>>,注意不可以分开,他们是一起的
类似于之前C语言的时候如果打开文件的时候,我们可以使用a方法,这个a其实全称是append
如果是echo的话会换行的。如果不想要换行的话,我们可以使用printf
关于cat指令,还有一点注意的是,如果我们直接输入cat,后面什么都不跟,那么它就是默认从键盘中读取,也就是说,我们输入什么他就打印什么
注意:对于输出重定向和追加重定向,如果后面的文件不存在,会自动创建一个文件,所以当我们创建一个新文件的时候,不一定非要touch才可以,我们也可以用重定向来创建新文件
5.输入重定向
如下所示,对于输入也有重定向,它的符号是小于符号。意思是本来应该从键盘文件中读取,现在不用从键盘读取,从指定的文件读取
不过这个输入重定向看起来似乎没什么用。因为cat本身直接加文件名也可以打印文件的内容。
在这里我们暂时理解为它两没有什么区别。但是他们还是存在一些区别,后序在谈
六、cat指令
语法:cat [选项][文件]
功能: 查看目标文件的内容
常用选项:
-b 对非空输出行编号
-n 对输出的所有行编号
-s 不输出多行空行
我们来应用一下
如下所示,是直接cat可以打印文件的内容
我们可以加上-n选项来看一下,即对每一行进行编号
如下所示,是对于-s选项的应用,即对于连续的空行不会进行打印
对于-b选项,它不会对空行进行编号,下面是它与-n选项的对比
如果两个都带,那么它会选择听-b的
七、more指令
1.cat缺陷
对于cat我们前面输出的都是一些比较小的文件,那么如果遇到大的文件它还可以吗?
我们肯定不能自己一个一个敲进去,所以我们使用如下的脚本
cnt=1;while [ $cnt -le 10000 ];do echo "Hello world $cnt";let cnt++;done;
最终我们可以看到在屏幕上打印了1w行文本
有了这样的效果,现在我们不让他打印到屏幕上,而是重定向到一个文件中
如果我们直接cat的话,会直接打印出来1w行
这时候问题来了,如果我们想看第1052行,那么是很难翻到的。
所以说,cat不适合看大文本,cat适合看小文本
2.more指令
语法:more [选项][文件]
功能:more命令,功能类似 cat
常用选项:
-n 对输出的所有行编号
q 退出more
如下所示,我们直接输入指令
more test.txt
那么就会是下面的这样子,只会打印出一个屏幕,然后不在打印
当我们想往下继续看的时候,我们直接按住回车,它就会自顶向下,自动往下翻
当我们想要退出的时候,直接按住q即可
我们还可以对more指令带上一个数字选项,代表着到第多少行停止,如下面的就是到第500行停止
more -500 test.txt
不过对于more存在的一个问题就是,只能向下翻
但是我们可以使用/9999来直接定位到对应的位置
其实实践中more命令使用的并不是很多
八、less指令
1.简介
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极强大。
less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看
但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!
除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜
语法: less [参数] 文件
功能:
less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前
不会加载整个文件。
选项:
-i 忽略搜索时的大小写
-N 显示每行的行号
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
q:quit
2.使用
less指令相比于more指令要更好一些
它与more一致的是,会先打印出一页,但是可以使用上下来进行翻页
其次它也支持使用/n直接定位,但是我们不可以像more一样直接less -n进行定位
不过这个/n,这样的仅仅是后向搜索。当我们再度输入/500的时候,找到的是1500
为了能够前向搜索,我们可以使用?n,来进行操作
当我们要退出的时候,可以用q来退出,ctrl+C是无法退出的
3、为什么要看大文本呢?
那么现在的问题就是,为什么要看一个比较大的文本呢?什么都属于大文本呢?
这是因为,我们在项目中的代码量很大,而我们有时候是不喜欢使用记事本等打开
其次就是日志信息,我们使用less和more等打开。
这些日志和项目等等都属于大文本
九、head指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然的就是看档案的结尾。
语法: head [参数]… [文件]…
功能:
head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
选项:
- -n<行数> 显示的行数
下面是使用
十、tail指令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.
语法: tail[必要参数][选择参数][文件]
功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件
选项:
-f 循环读取
-n<行数> 显示行数
十一、如何提取中间的某一段区间行数的文本
我们有时候是需要提取出中间的某一段信息。那么该如何提取呢?我们可以这样做
假设我们要提取1000行到1020行的信息
因为head可以提取前n行,所以我们可以先提取前1020行写入一个文件中
然后我们可以利用tail指令将最后的21行写入一个文件中
可是上面的方法会存在一个问题,那就是会创建一个临时文件。
如果我们不想要创建这个临时文件,又该如何做呢?
我们可以使用这样的方法来完成
中间的这个|,其实是一种符号,后面会被“系统”解释成为管道文件
这个管道文件是一种内存级别的,因为所有的数据资源要被修改一定要先加载到内存中
那么什么是管道呢?
就好比现实生活的管子,一定有一个入口和一个出口
这个入口就是|前面的数据,经过这个管道以后,就输出了后面的这个21行
还有下面的例子
还可以继续加上管道,其中wc -l指令是显示打印的行数
这就很像流水线,所以管道通常支持流水线工作。一步一步的对数据进行加工。