续第六篇:Linux进程的相关知识总结(2)-CSDN博客
目录
第五章:管道和重定向
5.1重定向
5.1.1产生重定向的原因
5.1.2重定向的应用
5.1.3查看现有的进程号、文件描述符
5.1.3.1文件描述符(FD、文件句柄)
5.1.4输出重定向的分类
5.1.4.1正确窗口输出
5.1.4.2错误输出
5.1.4.3正确错误信息都输出到指定文件
5.1.5输入重定向
5.1.5.1产生原因、概念原理:
5.1.5.2输入重定向的案例:
5.2管道
5.2.1Piping管道
5.2.1.1Piping管道的示例
5.2.2Tee管道
5.2.2.1Tee管道的示例:
5.3Xargs参数传递
第五章:管道和重定向
5.1重定向
5.1.1产生重定向的原因
命令的执行结果打完之后我们重启计算机命令就不见了只剩下结果,重定向可以保存这些结果,类似鸿蒙中的持久化保存
5.1.2重定向的应用
将本来输出到屏幕上的内容输入到某个文件中,用户查看文件信息就可以判断命令写了什么,是否写入成功。
举例:
data表示的是显示当前日期和时间,本来输出在前台屏幕上的,如果我们使用重定向 >
data > /aaa/file1.txt
就表示将data的输出信息输出到/aaa/file1.txt文本文档中
这样写入到文本文档中的数据就可以永久保存到文件中了。
我们可以查看/aaa/file1.txt的文件就可以判断当前日期是否成功写入到了文件夹中(如下图所示)。
5.1.3查看现有的进程号、文件描述符
在Linux系统中我们一般使用 ls /proc/ 来查看现有的进程号。
5.1.3.1文件描述符(FD、文件句柄)
文件描述符的本质:文件描述符本质就是一堆数字、快捷方式、软连接。是用来表示文件的代号。
程序使用文件描述符来打开一个文件,只有当文件被进程打开的时候文件才会有FD,文件本身没有FD,不同的程序对于相同的文件打开的方式不同文件的FD符也不会相同。
文件描述符的好处:好处就是进程调用文件的时候不用再去找路径了,使用文件的时候直接使用FD的号(代号)进行调用,类似建立了一种软连接,喊几号就是调用几号文件,程序打开文件的时候省事了。
文件描述符是用来描述文件的,即进程打开文件所使用的是什么代号,具体有三种代号(如下图所示)。
0代号:标准输入:用于从标准输入设备(通常是键盘)读取数据。
1代号:标准输出:用于向标准输出设备(通常是终端或显示器)写入数据。
2代号:标准错误输出:用于输出错误信息或诊断信息,通常也指向终端或显示器。
3代号+:普通文件:代号从3开始,随着进程打开新的文件或资源,文件描述符会递增分配。例如,当一个进程打开一个文件时,可能会获得代号为3的文件描述符,下一个打开的文件可能是4,依此类推。
FD的范围通常为-0-255
FD的作用:引导数据进入程序,引导数据离开程序去往不同的文件的一个链接方式
FD举例
举例1:查看FD链接文件
第一步:vim /aaa/file1
随便写点内容
第二步:ps aux | grep vim
找到进程号
第三步:ls -l /proc/进程号/fd
打开程序的文件描述符文件查看链接文件(以l开头的文件为链接文件)
对于输出的内容的文件类型和权限的解释:
lrwx------.:这串字符包含了文件类型和权限的信息。l表示链接文件;rwx------表示只有文件的属主可以有读写执行的权限,其余人没有
FD举例2:创建软连接(创建快捷方式)
ln -s 文件或目录的实体位置 + 快捷键数字代号
该方式我们可以用数字来表示文件,只要你不嫌麻烦,永远记住:“别把运维复杂化”。难道说这样做你可能还需要一个“密码本”吗?
ln -s命令在Linux系统中用于创建一个符号链接(symbolic link),这是一种特殊的文件,它指向另一个文件或目录的路径。符号链接类似于Windows系统中的快捷方式。这里的"代号"可能指的是创建符号链接时使用的命令选项或参数。
- -s:这个选项告诉ln命令创建一个符号链接,而不是硬链接(硬链接是另一种类型的链接,它直接指向文件的数据,而不是路径)。
- 文件或目录的实体位置 :这是要链接的源文件或目录的路径。
- 快捷键数字代号:这是符号链接的名称,即新创建的指向源文件或目录的链接的路径。
FD举例3:两个进程之间写入文件
1.先打开了一个空vim文件
2.查看进程号
ps/aux | grep/vim
3.查看pts窗口
ls -l /proc/进程号/fd
4.使用echo与重定向结合pts具体对应的是哪一个窗口进行写入文件
echo 123(内容) > /dev/pts/(第三步查出来的窗口号)
5.1.4输出重定向的分类
5.1.4.1正确窗口输出
方式一:覆盖输出
如果一个程序我们想引导让它输出正确命令结果我们可以在命令后打1,1不代表参数代表FD,我们通过>号来引导它把它放到另外一个地方(正常应该放到原来的前端中/dev/pts/某个窗口中)
ls -l -d中的-d是用来显示目录本身位置的信息,上述命令的解释为我们将当前所在文件的位置的信息的正确结果输出到文件/aaa/file1.txt中。
注意:1与>合在一起写不能分开!!!!!
命令 1> 写入到的文件
方式二:追加输出
>>表示追加输出的意思,他不会像>一样对文件的内容进行覆盖,而是追加显示。我们先使用>来显示错误信息。
5.1.4.2错误输出
在Lunux操作系统中2号描述符表示的是错误输出,我们使用2号信号将错误信息输出到某个文件。
示例
我们创建了wrong文件用来存储错误的信息,我们使用ls一个不存在的文件然后将错误信息输出到wrong文件,然后再次ls一个不存在的文件夹错误输出到wrong文件中,我们cat /aaa/wrong发现只有一次的报错信息被写入了文件,说明使用>的输出文件则被覆盖,反之我们使用>>则可以看到两条报错信息,说明>>的意思是追加。
5.1.4.3正确错误信息都输出到指定文件
我们在Linux中不光关心正确信息,而且还要关注错误信息,我们有一条命令可以同时完成。
问题再现:
ls /home /aaaaaaaaa
这条命令产生了正确的结果也产生了错误的结果,如下图所示
正确的输出是/home/下的文件全部都显示出来了,错误的输出是ls:无法访问/aaaaaaaaa:没有那个文件或目录。这样我们一条命令既有正确的输出也有错误的输出,在我们了解了正确和错误输出都存在的前提下,我们改进命令,让正确和错误信息都输出到各自的文件夹中。
ls /home /aaaaaaaaa &> list.txt
解释
‘&’与先前进程的学习中的放到后台的‘&’是一个意思,但是如果我们‘&>’连写就不是一个意思了,如果我们不小心写成‘& >’那么系统检测到‘&’之后是空格而不是‘>’则会将ls命令放到后台执行,就不能正确打印信息了
&>的解释:在Linux命令行中,&> 是一个重定向操作符,它用于同时将标准输出(stdout)和标准错误(stderr)重定向到同一个文件中。
这个操作符通常用在命令行中,当你想要记录一个命令的输出以及可能发生的错误信息到一个文件时。
如果文件存在则进行覆盖,文件不存在则根据路径自动新建文件
如果我们非要分开放我们可以再次使用1、2文件描述符进行区分,只不过写到一句中
语法如下:
命令 1> 正确信息的输出文件 2>错误信息的输出文件
例如:ls /home/ 1> right.txt 2> wrong.txt
就是把home下的文件夹正确输出到right.txt中,如果命令有错误,则将错误输出到wrong.txt文件中
同理:使用'&>>'也可以对命令的标准输出和错误输出进行追加显示到文件中
在工作中我们有些文件可能敲完回车之后会弹出一堆信息,影响我们观感,我们可以利用这个原理直接给他丢进垃圾桶
命令 &> /dev/null
/dev/null是一个“黑洞”,直接把所有的输出吃掉,这样命令的输出就不会在任何地方显示或保存了
5.1.5输入重定向
5.1.5.1产生原因、概念原理:
产生输入重定向的原因:有时候一些程序需要我们的指令,比如说聊天窗口需要我们的输入才能够进行聊天操作、终端窗口中需要我们输入指令进行操作等,与上述输出相反,我们是往程序内“进”而不是程序往外“出”,输入重定向的FD表达为‘0’。与输出相反,相同的一点是我们的主体内容一般都在大于号、小于号左侧,
核心内容:程序 < 文件
5.1.5.2输入重定向的案例:
案例一
Linux有一个现成的例子是关于输入重定向的,那就是mail邮件命令,我们可以自己给自己发邮件,编辑邮件的命令其实就是在进行输入重定向(将内容输入到指定文件中通过重定向到邮件程序发送)
语法:
mail -s “123456” + 虚拟机中存在的账户
-s表示发送邮件的主题
回车之后界面出现空白,这个时候我们就可以编写正文了
最后使用‘.’+回车的命令来发送邮件
注意:只能给现在Linux虚拟机中存在的账户发送邮件,不能发送QQ邮件或其他类型的邮件
查看方法:我们首先跳转到收件人账户,直接在终端中输入mail就可以查看
查看正文的方法:
我们输入完上一步进行邮箱查看后,直接根据主题输入对应的序号就可以查看邮箱的正文了
退出正文查看的方法是直接输入‘q’回车或者输入‘exit’回车即可
案例二
假设现在我们在公司发邮件,每一封邮件都要有一个免责声明,我们又不想每个邮件都重新输入一大堆内容,我们可以使用输入重定向快速创建文件。
使用重定向快速创建文件
1.我们可以先创建一个文件,并使用vim写入相关的内容,准备好文件的内容
2.快速写入
mail -s “邮件主题” 账户名 < 刚才准备好的文件的内容
5.2管道
管道概念:管道可以将多条命令组合起来,一次性完成处理复杂的任务
5.2.1Piping管道
Linux中较多使用的管道,我们使用‘|’表示管道,使用‘|’将多条命令分隔开,‘|’左面的输出为‘|’右面的输入。可以结合相同的命令也可以结合不同的命令,如果没有管道了,那么最后一个指令的输出就会显示在屏幕上。这也就是我们传统管道的方式。
格式:
command1 | command2 | command3......
5.2.1.1Piping管道的示例
案例一、查看进程前20的cpu占比较高的进程中含‘root’关键字的进程
案例二、一步一步添加管道,精确查找内容
cat /etc/passwd | head -5 --->cat /etc/passwd | head -5 | grep root -->cat /etc/passwd | head -5 | grep sbin | tail -2
注意:-->表示实验的顺序,大家不要把它当成命令输入到linux上。。。
5.2.2Tee管道
tee管道本身也是管道,只不过tee可以将两个文件的命令之间的输出写到文件或者目录中。
t ee管道现实中的应用前提:如果我们想要多次管道做一条命令,但是我们不确定最终的结果是否正确,我们可以在长命令的中间的一部分添加tee管道输出信息到某个文件来判断在该tee管道之前的输出是否正确,如果错误想排错的话,我们再次tee输出一半的结果(思想就像是折半查找找出问题)。
tee管道和Piping管道的区别:
tee管道在命令转交的时候将管道连接的两端的命令拷贝到文件中或者可以拷贝到屏幕中,在命令中我们也可以看出来tee管道是Piping管道的扩充,tee类似Pipingg的升级版。
5.2.2.1Tee管道的示例:
假设我们想要将passwd中的前四行信息使用tee管道写入到/aaa/file2中
错误写法:
cat /etc/passwd | tee /aaa/file2 | head -4
错误原因:如果tee的位置在管道的中间,那么tee的输入就是左侧管道的输出,左侧cat /etc/passwd 中的输出命名可不只四行哦!!!!!
正确写法:
cat /etc/passwd | head -4 | tee /aaa/file2
使用tee管道的时候一定要谨记tee的输出位置,谨记管道前的输出为管道后的输入这句话!!!!
5.3Xargs参数传递
我们输入命令的时候发现一个问题,当命令存在于文本文档中,我们Linux中会把命令看成文本而不是命令,有没有一种方法能让我们的操作系统识别文本文档中的命令呢?我们可以使用参数传递Xargs来解决这个问题,
命令如其名,Xargs的原理就是通过解析输入流,按照空白字符或指定的分隔符来分割数据,构建参数列表。默认情况下,xargs 会在收集到足够数量的参数或达到行数限制后,将这些参数传递给命令执行。用户可以通过各种选项来控制参数的分隔方式、参数和行数的限制、替换字符串的使用、并行执行的进程数等。xargs 还具备错误处理机制,能够在执行过程中根据配置继续执行或在遇到错误时停止。此外,xargs 的输出通常是执行命令的结果,但可以通过选项进行调整。这种机制使得 xargs 成为处理大量数据并执行相应操作的高效工具。
通过实例来说明:创建/home/file1-5这五个文件,删除1-3三个文件。
1.首先我们创建5个文件
2.其次我们创建一个file文件,写入的文本内容,对于该写入什么文本内容我们一定要切记,|前的输出为|后的输入,所以我们并不是直接写删除命令!而是让它输出出来信息,编入这些文件的内容。
3.结合上述的要求,时刻想着两条原则(我要干什么?管道左面的输出是管道右面的输入),所以我们需要把删除命令放到管道右面,那么左面应该是输出,我们使用cat查询file文件,正好我们文件中的内容就是file1-3文件的地址,这样管道就会分别查出来这三个文件挨个执行rm -rf
cat file.txt | xargs rm -rvf
总的来说,xgars算是难的内容了!学会这一块和tee说明你就把管道的内容完全掌握了!加油!