计算机原理系列

欢迎大家关注「海拉鲁知识大陆」 多交流不迷路

Linux入门(二)

在上一章Linux入门(一)中rm -rf /是比较简单的哈,那么升级一下:xargs指令的作用是啥呢?

1.进程

应用的可执行文件是放在文件系统里,把可执行文件启动就会在操作系统里(具体来说就是在内存中)形成一个应用的副本,这个副本就是一个进程。

那进程就是应用的执行副本,进程也是操作系统分配资源的最小单位(前者是定义,后者是作用。)。

ps
如果你要看进程的情况,可以用ps指令。p代表processes,也就是进程;s代表snapshot,也就是快照。
图片
当然操作系统也不可能只有这么几个进程,这是因为不带任何参数的ps指令显示的是同一个电传打字机(TTY上)的进程。TTY这个概念是一个历史的概念哈,用来传递信息,现在已经被传真、邮件、微信等取代。

操作系统上的TTY是一个输入输出终端的概念,比如用户打开bash,操作系统就为用户分配了一个输入输出终端。没有加任何参数的ps只显示在同一个TTY的进程。

如果想看到所有的进程,可以用ps -e,-e没有特殊含义,只是为了和-A区分开。我们通常不直接用ps -e而是用ps -ef,这是因为-f可以带上更多的描述字段,如下图所示:
图片

  • UID指进程的所有者;
  • PID是进程的唯一标识;
  • PPID是进程的父进程ID;
  • C是CPU的使用率;
  • STIME是开始时间;
  • TTY是进程所在的TTY,如果没有TTY就是?号;
  • TIME;
  • CMD是进程启动时的命令,如果不是一个Shell命令,而是用方括号括起来就是系统进程或者内核过程。

另外一个用得比较多的是ps aux,它和ps -ef差不多,感兴趣可以自己了解下具体含义。
图片

top
还有一个和ps能力差不多,是显示的是实时更新数据的top指令。因为top显示的内容有点少, 我用的比较多的是htop的指令。
图片

2.管道(Pipeline)

下面我们来聊聊管道,管道(Pipeline)的作用是在命令和命令之间,传递数据。比如说一个命令的结果,就可以作为另一个命令的输入。

输入输出流
每个进程拥有自己的标准输入流、标准输出流、标准错误流。
这几个标准流说起来有点复杂,但你可以理解都是文件。

  • 标准输入流(用 0 表示)可以作为进程执行的上下文(进程执行可以从输入流中获取数据)。
  • 标准输出流(用 1 表示)中写入的结果会被打印到屏幕上。
  • 如果进程在执行过程中发生异常,那么异常信息会被记录到标准错误流(用 2 表示)中。

重定向
我们执行一个指令,比如ls -l,结果会写入标准输出流,进而被打印。这时可以用重定向符将结果重定向到一个文件,比如说ls -l > out,这样out文件就会有ls -l的结果;而屏幕上也不会再打印ls -l的结果。
图片
具体来说>符号叫作覆盖重定向;>>叫作追加重定向。>每次都会把目标文件覆盖,>>会在目标文件中追加。比如你每次启动一个程序日志都写入/var/log/somelogfile中,可以这样操作,如下:

start.sh >> /var/log/somelogfile

经过这样的操作后,每次执行程序日志就不会被覆盖了。

另外还有一种情况,比如我们输入:

ls1 > out

结果并不会存入out文件,因为ls1指令是不存在的。结果会输出到标准错误流中,仍然在屏幕上。这里我们可以把标准错误流也重定向到标准输出流,然后再重定向到文件。

ls1 &> out

这个写法等价于:

ls1 > out 2>&1

相当于把ls1的标准输出流重定向到out,因为ls1 > out出错了,所以标准错误流被定向到了标准输出流。&代表一种引用关系,具体代表的是ls1 >out的标准输出流。
图片

管道的作用和分类
有了进程和重定向的知识,我们再梳理下管道的作用。管道(Pipeline)将一个进程的输出流定向到另一个进程的输入流,就像水管一样,作用就是把这两个文件接起来。如果一个进程输出了一个字符X,那么另一个进程就会获得X这个输入。

管道和重定向很像,但是管道是一个连接一个进行计算,重定向是将一个文件的内容定向到另一个文件,所以这二者经常会结合使用。

Linux 中的管道也是文件,有两种类型的管道:

  • 匿名管道(Unnamed Pipeline),这种管道也在文件系统中,但是它只是一个存储节点,不属于任何一个目录。说白了就是没有路径。
  • 命名管道(Named Pipeline),这种管道就是一个文件,有自己的路径。

FIFO
管道具有FIFO(First In First Out),FIFO和排队场景一样,先排到的先获得。所以先流入管道文件的数据,也会先流出去传递给管道下游的进程。

3.使用场景分析

接下来我们聊聊几个管道场景

排序
比如我们用ls,希望按照文件名排序倒序,可以使用匿名管道,将ls的结果传递给sort指令去排序。你看,这样ls的开发者就不用关心排序问题了。
图片

去重
另一个比较常见的场景是去重,比如有一个字典文件,里面都是词语。
如果我们想要去重可以使用uniq指令,uniq指令能够找到文件中相邻的重复行,然后去重如下。
图片

筛选
有时候我们想根据正则模式筛选对应的内容。比如说我们想找到项目文件下所有文件名中含有jmeter的文件。就可以利用grep指令,操作如下:

find ./ | grep jmeter

find ./递归列出当前目录下所有目录中的文件。grep从find的输出流中找出含有jmeter关键字的行。

如果我们希望包含jmeter但不包含jar就可以这样操作:

find ./ | grep jmeter| grep -v jar

grep -v就是匹配不包含 jar的结果。

数行数
还有一个比较常见的场景是数行数。比如一个log文件想知道里面有多少行,就可以使用wc -l指令,如下:
图片
但是如果你想知道当前目录下有多少个文件,可以用ls| wc -l,如下:
图片

中间结果
管道一个接着一个,是一个计算逻辑。有时候我们想要把中间的结果保存下来,这就需要用到tee指令。tee指令从标准输入流中读取数据到标准输出流。

tee还有一个能力,就是自己利用这个过程把输入流中读取到的数据存到文件中。比如下面这条指令:

find ./ -i "*.log" | tee testA | grep jmeter

这句指令的意思是从当前目录中找到所有含有 jmeter关键字的log文件。tee本身不影响指令的执行,但是tee会把find指令的结果保存到testA文件中。

tee这个执行就类似英文字母“T”一样,连通管道两端,下面又开了口。这个开口,在函数式编程里面就叫副作用。

xargs
最后我们来看看初中难度的xargs指令。

xargs指令从标准数据流中构造并执行一行行的指令。xargs从输入流获取字符串,然后利用空白、换行符等切割字符串,在这些字符串的基础上构造指令,最后一行行执行这些指令。

假如我们重命名当前目录下的所有的文件,想在这些文件前面加一个前缀prefix_。比如说x.a文件需要重命名成prefix_x.a,我们就可以用xargs指令构造模块化的指令。

现在有如下图所示:
图片
然后使用下图中的指令构造我们需要的指令:
图片

  • 我们用ls找到所有的文件;
  • -I参数是查找替换符,这里我们用GG替代ls找到的结果;-I GG后面的字符串GG会被替换为x.a、x.b或x.z;
  • echo是一个在命令行打印字符串的指令。使用echo主要是为了安全,帮助我们检查指令是否有错误。

我们用xargs构造了7条指令。

管道文件
上面我们花了较长的一段时间聊了匿名管道,用|就可以创造和使用。匿名管道也是利用了文件系统的能力,是一种文件结构。其实匿名管道是有一个inode,但不属于任何一个文件夹。

还有一种管道叫作命名管道(Named Pipeline)。命名管道是要挂到文件夹中的,所以需要创建。用mkfifo指令可以创建一个命名管道,下面我们来创建一个叫作pipe1的命名管道,如下图所示:
图片
命名管道和匿名管道能力类似,但可以连接一个输出流到另一个输入流。
如果这时cat pipe1的时候,可以发现当前的终端处于等待状态。因为cat pipe1的时候pipe1中没有内容。
比如这个时候我们再找一个终端去写一点东西到pipe中,比如说:

echo "XXX" > pipe1

这个时候,cat pipe1就会返回,并打印出xxx,如下所示:
图片
可以看到在cat pipe1后面增加了一个&符号。这个&符号代表指令在后台执行,不会阻塞我们继续输入。然后echo指令往pipe1中写入东西就会看到xxx被打印出来。

4.写在最后

现在最开始的题目:xargs指令的作用是啥?

【解析】 xargs 将标准输入流中的字符串分割成一条条子字符串,然后再按照我们自己想要的方式构建成一条条指令,拓展了Linux指令的能力。

比如我们可以用来按照某种特定的方式逐个处理一个目录下所有的文件;例如弱网测试中需要根据一个IP地址列表逐个ping这些IP,收集到每个IP地址的延迟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923509.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923509.shtml
英文地址,请注明出处:http://en.pswp.cn/news/923509.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发与维护nodejs工具库或自定义npm包

h5打开以查看 一、初始设置:为成功发布做好准备 1. 项目初始化与结构 bash # 创建项目目录并初始化 mkdir my-awesome-lib cd my-awesome-lib npm init -y 推荐的项目结构: text my-awesome-lib/ ├── src/ # 源代码目录 │ └──…

IntelliJ IDEA 的 Git 功能

1. 克隆(Clone)项目 这是你开始的第一步。你需要将远程仓库的代码克隆到本地。 打开 IDEA,选择 Get from VCS。在弹出的窗口中,选择 Git。粘贴远程仓库的 URL(通常来自 GitHub、GitLab 等)。选择一个本地目…

fastapi全局注入mysql,单数据库

1、封装sql连接 test_db.py from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker from fastapi import Request, Depends# 1. 数据库连接配置 async_engine create_async_engine("mysqlaiomysql://root:root…

深度学习常见应用算力要求?

深度学习常见应用的算力要求,首先需要明确算力的核心衡量维度:计算能力:以每秒浮点运算次数(FLOPS,如 TF32/FP16/FP8 精度下的吞吐量)衡量,决定任务运行速度;显存容量:决…

邪修实战系列(5)

1、第一阶段邪修实战总览(9.1-9.30) 把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务…

Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用

全文链接:https://tecdat.cn/?p43881 原文出处:拓端抖音号拓端tecdat 随着物联网(IoT)技术在电动汽车充电站(EVCS)中的普及,充电站不仅成为智能交通的关键节点,更因连接电网、用户设…

3dma渲染噪点成因排查及优化方案

有时候在用 3D Max 渲染完效果图,画面上总有密密麻麻的小颗粒,也就是常说的噪点,原本精致的模型和材质,一有噪点质感就掉了大半。其实多数时候,噪点问题都和渲染参数设置有关。那么出现噪点原因和解决方案有哪些&#…

【LeetCode】算法详解#15 ---环形链表II

1.题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评…

Kafka面试精讲 Day 18:磁盘IO与网络优化

【Kafka面试精讲 Day 18】磁盘IO与网络优化 在“Kafka面试精讲”系列的第18天,我们聚焦于磁盘IO与网络优化。作为支撑百万级吞吐量的分布式消息系统,Kafka的高性能不仅依赖于优秀的架构设计,更离不开对底层资源——尤其是磁盘和网络——的极…

ActiveMQ RocketMQ RabbitMQ Kafka选型及应用场景

许多时候我们都将Kafka拿来跟常用的几个消息队列作比较,将 Kafka 加入对比使得选型更加全面和实际。但请注意Kafka并非完全适用消息中间件的所有场景。这四款消息中间件定位不同,选择取决于你的具体场景。消息队列选型核心定位一句话总结RabbitMQ&#x…

STM32初始化串口重定向后printf调试信息不输出的问题

STM32初始化串口重定向后调试信息不输出的问题 Author:明月清了个风Date: 2025/9/9PS:开发stm32F745的过程中发现printf有时候不打印信息,单独调试确定了串口初始化和重定向正确,但是在系统整体调试的时候虽然正确运行…

PCA9535ECDWR2G 微控制器MCU接口芯片 ON 电子元器件解析

一、PCA9535ECDWR2G ON 元器件解析1. 是什么电子元器件? PCA9535ECDWR2G 是安森美半导体(ON Semiconductor)生产的一款16位I/O扩展器。它属于接口芯片类别,具体功能是通过IC总线为微控制器(MCU)提供额外的通…

大模型中token与tokenizer的区别

TokenToken 的基本概念在大模型(如GPT系列)中,token是文本处理的最小单位。模型将输入的文本分割成token序列,每个token对应一个唯一的整数ID,用于模型的内部处理。例如,英文单词"apple"可能被编…

还在觉得剪辑太难?用对视频剪辑软件,让剪辑变得像拼图一样有趣

想制作出精彩的Vlog,拥有一款简单易用的视频编辑软件是关键的第一步。如果你曾因为觉得剪辑太复杂、技术门槛太高而望而却步,那么这篇文章就是为你准备的,因为借助今天简单易用的视频编辑软件,人人都能成为自己生活的导演。本文就…

【ZEGO即构开发者日报】微信公众号上线“智能回复”功能;2025年8月中国应用/游戏厂商出海收入Top30榜;土耳其宣布将封禁29款社交/社媒应用……

💡开发者朋友们大家好,这里是 开发者日报!欢迎查阅您的实时互动日报。本栏目实时聚焦、每日更新【AI】、【泛娱乐】、【语音交互】、【实时音视频】等领域热点,欢迎大家在评论区一起探讨! 🔨「产品技术」 …

前端WebSocket实时通信实现

在项目中使用WebSocket实现实时通信 WebSocket提供了一种在客户端和服务器之间建立持久连接的方式,可以实现实时数据交换。下面我将展示如何在前端项目中集成WebSocket功能。 设计思路 我将创建一个简单的聊天室界面来演示WebSocket的使用,包含以下功能&…

电磁流量计可靠品牌之选,基恩士提供多样化解决方案

引言在工业自动化领域,流量的精确计量是保障产品质量、优化成本和提升设备效率的关键一环。当面临“电磁流量计的可靠品牌”这一问题时,企业通常需要考量产品的耐用性、测量精度、维护成本以及系统集成能力。流量计在安装、维护和测量精度方面面临诸多挑…

NumPy数组与Python列表的赋值行为解析

在Python科学计算中,NumPy数组和Python原生列表是两种常用的数据结构。理解它们之间的赋值行为差异对于编写高效、正确的代码至关重要。本文将深入探讨NumPy数组赋值给Python变量的各种情况,揭示背后的内存机制和类型转换特性。 直接赋值行为分析 当我们…

中国制造难点在哪里?

最近生产一批板子,其中一个进口的连接器为什么能卖我们差不多一千多钱还没现货,有时候还禁售;规格书也就寥寥一页而已,外观看起来也淡淡无奇,身为制造业强国的我们为什么没人做呢?你们怎么看?#中…

python 读取大文件优化示例

核心方法逐行读取 - 最常用,内存占用O(1)分块读取 - 适合超大文件,可控制内存使用内存映射 - 高性能,虚拟内存映射缓冲读取 - 平衡性能和内存特殊场景处理CSV文件 - 使用pandas的chunksize参数JSON Lines - 逐行解析JSON对象文本分析 - 内存高…