接下来我们就聊聊linux的后面十条指令。
一:echo
作用是往显示器输出内容,和printf类型,但是该指令最核心的是与之相关的一些概念
概念1.输出重定向:
echo不仅可以向显示打印内容,还可以向文件输出内容,本应该输出到显示器的输出到其它文件去了叫输出重定向(输出的方向重新改变),想必到这里肯定有小伙伴想问显示器是显示器,文件是文件,这两个能相提并论吗,或者说输出到显示器和输出到文件echo会不会做不同的处理。这时候用一句话即可为原因开个头,linux下一切皆文件,我们讲完输入,输出以及追加重定向再简略说。
输出重定向如下图
[hqy@VM-24-5-centos ~]$ echo "hello linux"
hello linux
[hqy@VM-24-5-centos ~]$ tree
.
|-- a.out
|-- d1
|-- test.c
`-- test.txt
1 directory, 3 files
[hqy@VM-24-5-centos ~]$ echo "hello linux">test.c
[hqy@VM-24-5-centos ~]$ cat test.c 用cat查看,发现echo确实把语句
hello linux 输出到test.c文件中去了
以及追加重定向,其实输出重定向在写入文件时是会先刷新文件才写入数据的。
[hqy@VM-24-5-centos ~]$ echo "hello linux">test.c
[hqy@VM-24-5-centos ~]$ cat test.c
hello linux
[hqy@VM-24-5-centos ~]$ echo "hello ">test.c
[hqy@VM-24-5-centos ~]$ cat test.c
hello
要想原先数据保存下来,就得用追加重定向。如下:
[hqy@VM-24-5-centos ~]$ echo "hello linux">>test.c
[hqy@VM-24-5-centos ~]$ cat test.c
hello
hello linux
二 cat
格式:cat+文件名
功能:查看文件内容
若不加文件,此时默认到键盘文件(标准输入端口)中读取,输出显示到显示器上展示
输入重定向也就是不从标准输入端口读取,而从其它文件中读取并显示到显示器上。
[hqy@VM-24-5-centos ~]$ echo "hello linux">test.c
[hqy@VM-24-5-centos ~]$ cat test.c 目前来看cat+文件名与输入重定向相似
今后会有一点区别
hello linux
[hqy@VM-24-5-centos ~]$ cat <test.c 输入重定向
hello linux
当我们了解了输入重定向和输出重定向,就再聊聊linux中echo输出字符到显示器和文件是否有区别,实际上没有区别,linux将一切看成文件来处理。(了解的不多,也只能合并一些资料勉强解释我的疑问)
文件就是一种可以读和写的东西,读写是站在程序的角度,输入输出是站在内存来看的,注意:输入和写入是站在不同的角度来看的,程序的读取从内存来看是输入,写入则是输出。显示器和键盘其实都被看成文件,首先显示器文件是只能写入,不可读取的文件,我们将内存从显示器读取数据的fread函数写为空函数,所以无输入功能,为啥不提供输入功能从目前我学的一点语言知识还解释不了,键盘文件只能读取,不能写入,指的是内存对键盘的fwrite方法写为空,无法输出数据给键盘,但不意味着我们无法写入数据给键盘,不然怎么从键盘读数据呢?
还有就是初学c时我好像听说我们scanf读取数据是从键盘中读取,只是由于显示器会回显我们输入的数据,时间久了我就忘了是从键盘读取,每次就是输入一个字符,然后显示器显示了,scanf也读到了,导致我以为我是从显示器读取的,其实是从键盘文件中读取的。
我们在linux用的最多的就是指令,这些指令实际上就是存在系统特定位置的一个个可执行程序,指令就是文件,如下:现在想想我们我们在linux经常接触指令,它们实质上就是一个个可执行文件,当我们输入命令ls时,编译器就会去/usr/bin目录下执行该文件。在linux指令上我曾提到执行当前目录自己的可执行文件用./+可执行文件名(例如a.out),之所以ls这些可执行文件无需指定路径,我想显然编译器是知道去哪找的,这些指令的存放就是系统安排的位置,系统自己怎么可能不知道。
[root@VM-24-5-centos ~]# cd /usr/bin
[root@VM-24-5-centos bin]# ls -l /usr/bin/ls
-rwxr-xr-x 1 root root 117608 Nov 17 2020 /usr/bin/ls
[root@VM-24-5-centos bin]# ls -l /usr/bin
三 more
cat显示大文本时有缺陷,它会一股脑全打印出来。more则会先显示一屏幕,按回车下翻逐渐显示下面的内容,但是不能按上下方向键上下翻,我在测试这里的时候发现我的more没有显示行号的选项,所以这里感觉没有特别直观。
四 less
格式:less +[选项]+文件名
而less则可以按上下键上翻下翻,非常便于我们查看大文本信息。
选项:
-N显示行号
q:(quit),less的展示和more ,cat不同,结束展示要按q才能回到linux输入命令的窗口。
五 tail
语法:tail +[行数n]+文件名
功能:表示从该文件中读取末尾的n行显示到屏幕中去。
六 head
语法:head +[行数n]+文件名
功能:表示从该文件中读取开头的n行显示到屏幕中去
在说完tail和head指令我们再说一个特殊的文管道文件:|,管道文件可以临时保存我们的数据,也可以将保存的数据给下一个head和tail使用,像个管道一样连接两个指令。head和tail命令都是把截取的数据输出到屏幕上,那么我们如果用输出重定向,不就可以将读取的n行数据输出到管道文件中去吗。实际应用如下演示:
我们可以对数据一步步加工,先对数据做截取尾尾15行,存到管道文件,管道文件会自动把数据传给下一个指令做处理,可以看到的是,下一个指令tail使用时未曾指定文件,实际上管道文件就充当了数据的提供者,这使得数据可以像在流水线上一步步被加工。
七 cal
命令格式:cal [参数] [月份][年份]
下面任意选项如果后面只有一个参数,该参数都会被认为是年份,两个参数第一个被认为月份,第二个是年份。
功能:查看日历
如下:
[hqy@VM-24-5-centos ~]$ cal 3 2023
March 2023
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
选项:
-1:显示当前月份的日历,不加也默认显示当前月份,也可以指定年月份显示
[hqy@VM-24-5-centos ~]$ cal -1 6 2023
June 2023
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
-3:显示前一个月,当前月,下一个月的日历,共三个月,同样可以指定年月份
[hqy@VM-24-5-centos ~]$ cal -3 7 2023
June 2023 July 2023 August 2023
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 1 2 3 4 5
4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12
11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19
18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26
25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 31
30 31
[hqy@VM-24-5-centos ~]$ cal -3 6 2023
May 2023 June 2023 July 2023
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 1
7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
30 31
[hqy@VM-24-5-centos ~]$
我知道这里肯定有同学和我一样会去尝试cal -3然后带个年份会咋样,个人觉得这有点像是未定义的,cal -3显示的多个月份,后面又跟着个年份,难道是想让编译器显示多个年份吗?linux对此的处理像是忽略了-3选项,而是显示了整年的日历。
-y: 显示当前年的日历,可指定年份
-j: 显示当前日期是一年中的第几天,并且当前月份是一年中的第几天都会显示出来,如果和-3选项复用,则会将三个月的日期转为一年中的天数显示,若是后面直接加年份,则会将一年的日期转为一年中的第几天来显示。
八 find
格式:find -name +文件名
find是在特定的家目录下查找文件,这个文件名可以是test.c,或者test.cpp,甚至我们可以不指定详细的文件名,而是找出所有相同后缀的文件
[hqy@VM-24-5-centos ~]$ find *.c
main.c
processbar.c
test.c
[hqy@VM-24-5-centos ~]$
九 grep
作用:在文件搜索字符串,用单引号和双引号引起都行,会找到匹配的行打印出来,c语言是以单双引号区分字符和字符串,但是在linux下貌似没这种分别。
选项: -i 忽略字符的大小写
-n 顺便输出行号
十 uname -r
这个指令是查看我们使用的计算机体系结构的。会显示操作系统版本等基本信息。
-a选项会输出所有详细信息依次是内核名称,主机号,内核版本号等,了解了解即可
[hqy@VM-24-5-centos ~]$ uname -r -a
Linux VM-24-5-centos 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[hqy@VM-24-5-centos ~]$ uname -r
3.10.0-1160.71.1.el7.x86_64