<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on Nan0inPsyLog</title><link>https://nan0in27.cn/tags/linux/</link><description>Recent content in Linux on Nan0inPsyLog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>楠牧音 | glow Nan0in</copyright><lastBuildDate>Mon, 25 May 2026 15:01:35 +0800</lastBuildDate><atom:link href="https://nan0in27.cn/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>南大PA 0 1小记</title><link>https://nan0in27.cn/p/%E5%8D%97%E5%A4%A7pa-0-1%E5%B0%8F%E8%AE%B0/</link><pubDate>Fri, 22 Aug 2025 14:17:00 +0000</pubDate><guid>https://nan0in27.cn/p/%E5%8D%97%E5%A4%A7pa-0-1%E5%B0%8F%E8%AE%B0/</guid><description>&lt;img src="https://nan0in27.cn/p/%E5%8D%97%E5%A4%A7pa-0-1%E5%B0%8F%E8%AE%B0/banner.png" alt="Featured image of post 南大PA 0 1小记" /&gt;&lt;p&gt;详情可见&lt;br&gt;
&lt;a href="https://nan0in27.cn/files/南大PA.zip" download&gt;南大pa.zip&lt;/a&gt;&lt;br&gt;
注意是markdown格式的，有多层引用，请务必用markdown相关编辑器打开和浏览&lt;/p&gt;</description></item><item><title>通过游戏和《vim实用技巧》学习vim编辑器</title><link>https://nan0in27.cn/p/%E9%80%9A%E8%BF%87%E6%B8%B8%E6%88%8F%E5%92%8Cvim%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7%E5%AD%A6%E4%B9%A0vim%E7%BC%96%E8%BE%91%E5%99%A8/</link><pubDate>Tue, 18 Feb 2025 22:47:00 +0000</pubDate><guid>https://nan0in27.cn/p/%E9%80%9A%E8%BF%87%E6%B8%B8%E6%88%8F%E5%92%8Cvim%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7%E5%AD%A6%E4%B9%A0vim%E7%BC%96%E8%BE%91%E5%99%A8/</guid><description>&lt;img src="https://nan0in27.cn/p/%E9%80%9A%E8%BF%87%E6%B8%B8%E6%88%8F%E5%92%8Cvim%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7%E5%AD%A6%E4%B9%A0vim%E7%BC%96%E8%BE%91%E5%99%A8/pics/ban.png" alt="Featured image of post 通过游戏和《vim实用技巧》学习vim编辑器" /&gt;&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;VIM Adventures（又称VIM大冒险）是一款用于学习VIM编辑器使用的在线网页端小游戏，通过这个游戏，我们能够快速掌握VIM的一些常用的基本命令，学vim可以说这个游戏是必备的
《vim》实用技巧则是一本很经典的vim学习用教材，因此&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="部署"&gt;部署
&lt;/h2&gt;&lt;p&gt;由于&lt;a class="link" href="https://vim-adventures.com" target="_blank" rel="noopener"
&gt;官网&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
的版本只有前三关免费，之后的关卡需要25美元还只有六个月使用期限，对于学生党来说简直就是灾难，所以一开始我在&lt;a class="link" href="https://www.bilibili.com/opus/954236485052137495" target="_blank" rel="noopener"
&gt;这里&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
找到了可以游玩的托管项目——但是太慢了, 所以我准备部署在本地&lt;/p&gt;
&lt;h3 id="源码构建部署"&gt;源码构建部署
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;安装nodejs，具体的网上教程很多&lt;/li&gt;
&lt;li&gt;下载项目源代码，github上因为维权大多没有了，所以我提供一个&lt;a class="link" href="https://pan.baidu.com/s/1DSj7Ppn-QRvB54N2vEwWKg?pwd=LAIN" target="_blank" rel="noopener"
&gt;链接&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
提取码: LAIN&lt;/li&gt;
&lt;li&gt;进入工作目录，解压1.1.0那个版本并进入，打开CMD执行&lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;设置环境变量，在前一个目录(有.exe文件)下创建.env文件，并输入&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;APP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;D:&lt;span class="se"&gt;\v&lt;/span&gt;im&lt;span class="se"&gt;\v&lt;/span&gt;im-adventures-1.1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="c1"&gt;#自己根据情况控制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="5"&gt;
&lt;li&gt;运行.exe并打开127.0.0.1:80就可以本地运行了，存档的话要记得创建一个saved文件夹先才可以存档&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="vim使用技巧"&gt;VIM使用技巧
&lt;/h2&gt;&lt;h3 id="基本实用技巧"&gt;基本实用技巧
&lt;/h3&gt;&lt;h4 id="基础的宏指令"&gt;基础的宏指令
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.&lt;/code&gt;会执行我们上一次的 &lt;strong&gt;修改&lt;/strong&gt; 命令，因此也可以将其看作我们最初的一个宏，在此可以实现非常多的功能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;拒绝自我重复&lt;/strong&gt; 例如写c语言时我们常要在末尾添加&lt;code&gt;;&lt;/code&gt;，但是我们不想每一行都通过&lt;code&gt;j$.&lt;/code&gt;，这太麻烦了，那么我们可以使用&lt;code&gt;A&lt;/code&gt;指令，它允许我们实现&lt;code&gt;$a&lt;/code&gt;的功能，移动到一行末尾并进入插入模式，那么我们通过&amp;rsquo;A; j.&amp;lsquo;就可以实现每行末尾快速添加
，同样的，vim中有相当多的这样将多个指令合并成一个指令的&lt;code&gt;一箭双雕&lt;/code&gt;指令，&lt;code&gt;C S s o O&lt;/code&gt;等，并进入插入模式，这可以实现什么呢？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;以进废退&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;var foo = &amp;quot;method(&amp;quot;+argument1+&amp;quot;,&amp;quot;+argument2+&amp;quot;)&amp;quot;;&lt;/code&gt;这样一句语句在JS中并不美观，如果我们想要实现将+号变成前后有空格的样式，可以如下操作&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f+ &lt;span class="c1"&gt;#f{char}会搜索并找到下一处指定字符出现的位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;s 空格 + 空格 &lt;span class="c1"&gt;#s删除了x我们再通过后面的方法实现了以进废进，之所以这么做是为了之后调用宏考虑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;;&lt;/span&gt;. &lt;span class="c1"&gt;#;命令将会带我们来到下一个指定字符上，这样的话我们就可以轻松实现之前的操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;手动修改&lt;/strong&gt;&lt;br&gt;
例如一段文字中出现了多次一个单词，我们想要修改可以&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* &lt;span class="c1"&gt;#找到单词位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cw&lt;span class="o"&gt;{&lt;/span&gt;word&lt;span class="o"&gt;}&lt;/span&gt;ESC &lt;span class="c1"&gt;#删除单词字符并替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;n &lt;span class="c1"&gt;#找到下一处单词&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &lt;span class="c1"&gt;#重复即可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="总结"&gt;总结
&lt;/h4&gt;&lt;p&gt;我们发现在以上多个修改中，我们都通过&lt;code&gt;.&lt;/code&gt;来实现替换或添加字符到我们想要的位置，我们将其总结为&lt;br&gt;
一键移动，一键执行，这就是我们想要的&lt;code&gt;.&lt;/code&gt;范式&lt;/p&gt;
&lt;h3 id="普通模式"&gt;普通模式
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Just like a painter won&amp;rsquo;t pause with his brush on the page when he is rest,we truly need to rest
普通模式命令的强大往往来自于它可以把操作符和动作命令结合在一起。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;程序员就像画家，思考、阅读、穿梭于代码之间浏览后，我们并非需要插入模式来书写一切，我们只需some gadgets，复制移动删除（并非ctrlcctrlv）就可以完成我们的作品&lt;/p&gt;
&lt;h4 id="撤销单元切块"&gt;撤销单元切块
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;u&lt;/code&gt;会触发撤销最新一次的修改，可以是改变文档的操作，也可以是其他模式中的操作，因此我们可以控制撤销命令的 &lt;em&gt;粒子度&lt;/em&gt;&lt;br&gt;
那么多久应该修改一次插入模式呢，每一个&lt;code&gt;撤销块&lt;/code&gt;对应一次思考过程或许是可以的，当然你也可以按照个人习惯来，但是一般来讲，如果停顿的时间长到足以质疑”我应该退出吗“，那就退出吧&lt;/p&gt;
&lt;h4 id="构造可重复的修改"&gt;构造可重复的修改
&lt;/h4&gt;&lt;p&gt;正如前一章中一样，我们想高效完成一件事情，最需要的就是效率&lt;br&gt;
我们已一句&lt;code&gt;The end is nigh&lt;/code&gt;举例，将光标放到末尾&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;反向删除&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;db &lt;span class="c1"&gt;#先删除从末尾光标处到本单词头部的字符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x &lt;span class="c1"&gt;#因为还会存在一个字符，用x删除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;正向删除&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;b &lt;span class="c1"&gt;#移到单词头部&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dw &lt;span class="c1"&gt;#dw删除整个单词&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;删除整个单词
&lt;code&gt;daw&lt;/code&gt;即可——delete a word&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样看下来，虽然都是三个字符，但想必你知道如何区分最棒的语句吧，daw的话我们可以直接通过&lt;code&gt;.&lt;/code&gt;进行多次操作，岂不美哉&lt;/p&gt;
&lt;h4 id="何时重复何时快速"&gt;何时重复，何时快速
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;Delete more than one word&lt;/code&gt;, 如果我们想要删除more than两个单词，有多种方式，&lt;code&gt;d2w&lt;/code&gt;和&lt;code&gt;2dw&lt;/code&gt;以及&lt;code&gt;dw.&lt;/code&gt;都可以，而如果我们想要删除更多单词的时候，应该如何抉择?
如果我们dw加7个&lt;code&gt;.&lt;/code&gt;，想要撤销不小心造成的错误时可以精确操作，而一次性删除的话就无法实现。
——&lt;em&gt;只在必要的时候使用次数&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="双剑合璧天下无敌"&gt;双剑合璧，天下无敌
&lt;/h4&gt;&lt;p&gt;即 &lt;strong&gt;操作符 + 动作命令 = 操作&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;删除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;复制到寄存器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;g-&lt;/td&gt;
&lt;td&gt;反转大小写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gu&lt;/td&gt;
&lt;td&gt;转化为小写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gU&lt;/td&gt;
&lt;td&gt;转化为大写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;增加缩进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;减小缩进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;td&gt;自动缩进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一条额外规则，重复指令会作用在当前行上&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;完美而方便的缩进规则&lt;/strong&gt;
如果安装了textobj-entire插件，简单地执行&lt;code&gt;=ae&lt;/code&gt; 就可以作用在整个文件上，Kana Natsuno插件则是使用&lt;code&gt;=ie&lt;/code&gt;（windows上vscode安装自带的就是这个）
当然，如果想用= 命令来执行也是可以的，执行&lt;code&gt;gg=G&lt;/code&gt;就可以了&lt;/p&gt;
&lt;h3 id="插入模式"&gt;插入模式
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;即时更改错误，在插入模式下，退格键可以删除光标前的字符，我们还可以使用组合键&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;按键操作&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ctrl+w&lt;/td&gt;
&lt;td&gt;删除前一个单词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ctrl+u&lt;/td&gt;
&lt;td&gt;删除至行首&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ctrl+h&lt;/td&gt;
&lt;td&gt;删除前一个字符&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;当然，这些操作命令并不是插入模式独有的，命令行以及在bash中都可以使用它们&lt;/p&gt;
&lt;h4 id="返回普通模式"&gt;返回普通模式
&lt;/h4&gt;&lt;p&gt;最经典的便是ESC进行退出，当然也可以用&lt;code&gt;ctrl+o&lt;/code&gt;，这允许我们切换到插入-普通模式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;插入-普通模式：这允许我们执行一次普通模式命令后马上返回到插入模式&lt;/li&gt;
&lt;li&gt;当前行位于窗口顶部或底部时，我们可以用zz命令重绘制屏幕，便于查看内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="在不离开插入模式的情况下粘贴寄存器中的文本"&gt;在不离开插入模式的情况下，粘贴寄存器中的文本
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;practical Vim, by Drew Neil
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read Drew Neil&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我想将开头的Practical Vim放到文件末尾，
可以按以下步骤操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yt, #把开头复制到专用寄存器中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jA空格 #下一行到末尾，并添加空格
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ctrl+r 0 # 将寄存器中文本粘贴到光标处
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. ESC
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="随时随地做运算"&gt;随时随地做运算
&lt;/h4&gt;&lt;p&gt;例如我们需要计算六把椅子的总价，每把35元，
只需将光标移动到需要位置，然后执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ctrl+r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;35*6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当然这只是最简单的计算&lt;/p&gt;
&lt;h4 id="非常用字符插入"&gt;非常用字符插入
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;ctrl+v(对应数字)&lt;/code&gt;
如果想打倒问号，可以使用&lt;code&gt;ctrl+v u00bf&lt;/code&gt;
u对应四位十六进制&lt;/p&gt;
&lt;h3 id="可视模式"&gt;可视模式
&lt;/h3&gt;&lt;p&gt;基本就是选一块文本区域然后进行操作
三种可视模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;操作字符文本&lt;/li&gt;
&lt;li&gt;操作行文本&lt;/li&gt;
&lt;li&gt;操作块文本&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="基本操作"&gt;基本操作
&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v&lt;/td&gt;
&lt;td&gt;激活面向字符的可视模式&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;激活面向行的可视模式&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ctrl+v&lt;/td&gt;
&lt;td&gt;激活面向列块的可视模式&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gv❤&lt;/td&gt;
&lt;td&gt;重复上次高亮选区&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;切换高亮选区活动端（头尾）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="面向行的可视命令"&gt;面向行的可视命令
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以上这个代码的缩进存在问题，我们只需要在print这行按V进入可视模式后通过&amp;gt;进行缩进控制即可
下面用&lt;code&gt;.&lt;/code&gt;范式操控即可，这里需要8格缩进你也可以直接&lt;code&gt;2&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="面向列块方式编辑表格"&gt;面向列块方式编辑表格
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Chapter Page
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Normal mode 15
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Insert mode 31
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Visual mode 44
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以上这个纯文本表格，我们想在中间用管道符画竖线隔开，具体操作如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vim" data-lang="vim"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;先光标移动到合适位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;j #&lt;span class="nx"&gt;将可视位置用光标填满&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;x&lt;/span&gt;... #&lt;span class="nx"&gt;删除列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gv&lt;/span&gt; #&lt;span class="nx"&gt;再次选中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; #&lt;span class="nx"&gt;将光标替换为管道符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;yyp&lt;/span&gt; #&lt;span class="nx"&gt;快速复制粘贴一行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Vr&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt; #&lt;span class="nx"&gt;用连字符&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;替换一行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;效果如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Chapter | Page
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Normal mode | 15
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Insert mode | 31
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Visual mode | 44
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="长短不一高亮块后添加文本"&gt;长短不一高亮块后添加文本
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;var foo = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;var bar = &amp;#39;a&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;var foobar = foo + bar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以我们已经见过的JS代码片段举例
还是添加分号，但是我们这次用列块操作来修改&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;选中到第一行的1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ctrl+vjj$ #进入列块可视后jj到第三行后$可以使范围扩大到行结尾
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;A;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;esc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="命令行模式"&gt;命令行模式
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;vim——始于vi，Ex指令如同先祖的血液，在历史的长河奔腾不息&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>linux_roadmap学习</title><link>https://nan0in27.cn/p/linux_roadmap%E5%AD%A6%E4%B9%A0/</link><pubDate>Wed, 22 Jan 2025 00:47:00 +0000</pubDate><guid>https://nan0in27.cn/p/linux_roadmap%E5%AD%A6%E4%B9%A0/</guid><description>&lt;img src="https://nan0in27.cn/p/linux_roadmap%E5%AD%A6%E4%B9%A0/pics/ban.png" alt="Featured image of post linux_roadmap学习" /&gt;&lt;h2 id="题外话"&gt;题外话
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;del&gt;听学长指示闻着味就过来了&lt;/del&gt; 体验以后觉得不错，roadmap.sh非常适合入门学习，而且是交互式的，推荐用于某项技能的入门基础快速学习，但是要注意是 &lt;strong&gt;全英文&lt;/strong&gt; 的，不想啃就开翻译插件吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="basics-navigation"&gt;basics navigation
&lt;/h1&gt;&lt;h2 id="commands-and-basical-knowledge"&gt;commands and basical knowledge
&lt;/h2&gt;&lt;h3 id="navigation-basics"&gt;navigation basics
&lt;/h3&gt;&lt;h4 id="basic-commands"&gt;Basic commands
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt;: change directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt;: list files and direrctories in the current directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwd&lt;/code&gt;: view working directory &lt;code&gt;man&lt;/code&gt;: view manual page for a command(查看某个指令的详解)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="files-and-directories"&gt;files and directories
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;创建文件
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;touch&lt;/code&gt;: 在linux中用touch命令创建空文件
&lt;code&gt;touch newfile.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat&lt;/code&gt;: &lt;code&gt;cat &amp;gt; newfile.txt&lt;/code&gt; 如果不存在newfile.txt则创建，存在则覆盖&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;移动文件
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mv&lt;/code&gt;:&lt;code&gt;mv [options源文件] source destination&lt;/code&gt; source表示要移动的文件或目录，而destination表示目标位置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;删除文件
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rm&lt;/code&gt;:&lt;code&gt;rm example.txt&lt;/code&gt;永久性删除，如果想在删除前确认，可以使用&lt;code&gt;-i&lt;/code&gt;选项:&lt;code&gt;rm -i example.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rmdir&lt;/code&gt;:&lt;code&gt;rmdir [directory]&lt;/code&gt;删除目录&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="understanding-directory-hierarchy"&gt;Understanding Directory Hierarchy
&lt;/h4&gt;&lt;p&gt;在Linux中，了解目录层次结构是非常重要的。&lt;br&gt;
linux系统的目录结构也称为 &lt;strong&gt;文件系统层次结构标准&lt;/strong&gt;，即 &lt;strong&gt;FHS&lt;/strong&gt;，它是一种定义的树结构，有助于防止文件分散在整个系统中，并且易于导航和组织。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/&lt;/strong&gt;：根目录，文件系统的顶层&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/home&lt;/strong&gt;：用户主目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/bin&lt;/strong&gt;：二进制文件目录，包含常用的系统命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/sbin&lt;/strong&gt;：系统二进制文件目录，包含系统管理员使用的命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/etc&lt;/strong&gt;：系统配置文件目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/var&lt;/strong&gt;：可变数据(日志、假脱机文件)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/tmp&lt;/strong&gt;: 临时文件目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/usr&lt;/strong&gt;：用户应用程序和数据目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/lib&lt;/strong&gt;：共享库&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="editing-files"&gt;Editing Files
&lt;/h2&gt;&lt;p&gt;与其他操作系统一样，Linux允许出于多种目的编辑文件，无论您是需要配置某些系统功能还是编写脚本。Linux 默认提供多种文本编辑器，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nano&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vi/vim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emacs gedit&lt;/code&gt;&lt;br&gt;
每个编辑器都有自己的学习曲线和命令集&lt;br&gt;
例如,&lt;code&gt;nano&lt;/code&gt;是一个简单的文本编辑器，它易于使用，非常适合简单的文本编辑。&lt;code&gt;vi/vim&lt;/code&gt;则在另一方面，更为先进，提供广泛的功能和命令(老一辈的游刃有余)
要编辑文件首先要使用以下命令&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano &lt;span class="o"&gt;[&lt;/span&gt;filename&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi &lt;span class="o"&gt;[&lt;/span&gt;filename&lt;span class="o"&gt;]&lt;/span&gt; or vim &lt;span class="o"&gt;[&lt;/span&gt;filename&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#我就用过这两个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="vim编辑文件的基本工具"&gt;Vim：编辑文件的基本工具
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Vim（Vi Improved）是一款功能强大且灵活的文本编辑器，用于类 Unix 系统。它以原始 Vi 编辑器为基础，并添加了其他功能和改进，包括多级撤消、语法突出显示和大量用于文本操作的命令集。(虽然学起来很麻烦就是了)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vim主要以三种模式运行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normal(for navigation and manipulation).&lt;/li&gt;
&lt;li&gt;Insert(for editing text).&lt;/li&gt;
&lt;li&gt;Command(for running commands).&lt;br&gt;
要插入新内容，使用&lt;code&gt;i&lt;/code&gt;进入插入模式，然后输入内容。&lt;br&gt;
编辑完成后，按ESC键退出插入模式，然后输入&lt;code&gt;:wq&lt;/code&gt;保存并退出。&lt;br&gt;
当然Vim的操作远不止这些&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;一些学习平台和教程：&lt;br&gt;
&lt;a class="link" href="https://vim-adventures.com/" target="_blank" rel="noopener"
&gt;边玩游戏边学Vim&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;br&gt;
&lt;a class="link" href="https://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/" target="_blank" rel="noopener"
&gt;循序渐进学习Vim&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;br&gt;
&lt;a class="link" href="https://agou-images.oss-cn-qingdao.aliyuncs.com/pdfs/Vim%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89.pdf" target="_blank" rel="noopener"
&gt;Vim实用技巧&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="nano简单的文本编辑器"&gt;Nano：简单的文本编辑器
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Nano相对来说是更为流行、对用户来说友好的文本编辑器，用于直接在 &lt;strong&gt;Linux命令行界面(CLI Linux Command Line Interface)&lt;/strong&gt; 中编辑文件。是一个vi和emacs的替代品。对初学者来说更为简单实用，介绍一些针对流行的Linux发行版的安装方式(一般来说很多发行版是自带的)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Ubuntu based distributions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install nano
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Arch Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S nano
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="shell-and-other-basics"&gt;Shell and Other Basics
&lt;/h2&gt;&lt;p&gt;Linux Shell是一个命令行界面，用于与操作系统进行交互。&lt;br&gt;
shell 有助于简化系统命令，并充当用户和系统内核之间的中介界面。shell 可以高效快速地执行复杂任务。&lt;br&gt;
Linux中有多种shell，包括：&lt;code&gt;Bourne shell(sh)&lt;/code&gt;、&lt;code&gt;C shell(csh)&lt;/code&gt;、&lt;code&gt;Bourne-Again Shell(bash)&lt;/code&gt;等。&lt;/p&gt;
&lt;h3 id="command-path-in-shell-basics"&gt;Command Path in Shell Basics
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Simply put, command path is a variable that is used by the shell to determine where to look for the executable files to run.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通常，shell需要知道命令的可执行文件的绝对路径才能运行它，而 &lt;strong&gt;command&lt;/strong&gt; &lt;strong&gt;path&lt;/strong&gt; 允许shell自动按正确顺序搜索指示的目录。这些路径存储在 &lt;strong&gt;$PATH&lt;/strong&gt;环境变量中。&lt;br&gt;
&lt;code&gt;echo $PATH&lt;/code&gt;将返回shell按顺序搜索的所有目录，以查找要运行的命令
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="pics/1.png"&gt;
&lt;img src="pics/1.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3 id="environment-variables"&gt;Environment Variables
&lt;/h3&gt;&lt;p&gt;在Linux中, 环境变量是 &lt;strong&gt;动态命名&lt;/strong&gt; 的值，可以影响 shell 中正在运行的进程的行为。&lt;br&gt;
它们存在于每个shell的进程当中，一个shell的进程的环境变量包括但不限于&lt;br&gt;
user’s home directory, command search path, terminal type, and program preferences.&lt;br&gt;
环境变量有助于实现 Unix 系统中灵活的自定义。它们提供了一种在 Linux 中的多个应用程序和进程之间共享配置设置的简单方法。&lt;/p&gt;
&lt;p&gt;可以使用 &lt;code&gt;env&lt;/code&gt;命令列出shell会话中的所有环境变量，如果想查看某个特定的变量，则可以使用&lt;code&gt;echo $PATH&lt;/code&gt;命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List all environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ env
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Print a particular variable like PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$VARIABLE_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;具体地学习以及 &lt;strong&gt;实验&lt;/strong&gt; 可见&lt;a class="link" href="https://labex.io/tutorials/linux-environment-variables-in-linux-385274" target="_blank" rel="noopener"
&gt;Linux环境变量&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="command-help"&gt;Command Help
&lt;/h3&gt;&lt;p&gt;上文就有提到，在Linux中学会使用命令帮助非常重要，它能使用户轻松浏览Linux Shell命令。
例如:&lt;br&gt;
&lt;code&gt;man [command]&lt;/code&gt;可以在任何命令钱调出其手册条目，其中解释了该命令的作用、语法、可用选项&lt;br&gt;
&lt;code&gt;help [command]&lt;/code&gt;选项也可以显示命令的可用选项和用法。更适合shell内置函数，对每个函数进行简要描述。
可见&lt;a class="link" href="https://labex.io/tutorials/linux-get-help-on-linux-commands-18000" target="_blank" rel="noopener"
&gt;获取Linux命令帮助&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;br&gt;
以及&lt;a class="link" href="https://www.baeldung.com/linux/man-command" target="_blank" rel="noopener"
&gt;如何使用手册页&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 id="redirects"&gt;Redirects
&lt;/h3&gt;&lt;p&gt;Linux的shell为user提供了一种管理命令/程序的输入和输出流的强大方法，称为 &lt;strong&gt;重定向&lt;/strong&gt;。&lt;br&gt;
Linux是一个多用户和多任务操作系统，每个进程通常打开3个流：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准输入（stdin）：默认情况下，从键盘读取输入。&lt;/li&gt;
&lt;li&gt;标准输出（stdout）：默认情况下，将输出写入屏幕。&lt;/li&gt;
&lt;li&gt;标准错误（stderr）：默认情况下，将错误消息写入屏幕。&lt;br&gt;
Linux的重定向功能便于我们操作流，从而提高运行命令/程序的灵活性。除了默认设备(键盘啦终端啦)外， &lt;strong&gt;I/O&lt;/strong&gt;流可以重定向到其他文件/设备。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，如果想将命令输出存储到文件中而不是打印到控制台，可以使用&amp;quot;&amp;gt;&amp;ldquo;运算符号&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -al &amp;gt; file_list.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;将&amp;quot;ls -al&amp;quot;的输出写入了txt中，如果已存在该文件就覆盖&lt;/p&gt;
&lt;h4 id="experiment"&gt;experiment
&lt;/h4&gt;&lt;p&gt;见&lt;a class="link" href="https://labex.io/tutorials/linux-logical-commands-and-redirection-387332" target="_blank" rel="noopener"
&gt;逻辑命令和重定向&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h5 id="运算符"&gt;&amp;amp;&amp;amp;运算符
&lt;/h5&gt;&lt;p&gt;该运算符用于将多个命令链接在一起，并仅在第一个命令成功执行时才执行第二个命令，对于有依赖的命令链接很有用
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="pics/image1.png"&gt;
&lt;img src="pics/image1.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h5 id="运算符-1"&gt;||运算符
&lt;/h5&gt;&lt;p&gt;当第一个命令失败时才执行第二个命令。这对于提供后备选项或错误消息很有用。&lt;/p&gt;
&lt;h5 id="追加输出重定向符号"&gt;&amp;raquo;追加输出重定向符号
&lt;/h5&gt;&lt;p&gt;如果我们想要附加信息的话，可以使用&amp;rdquo;&amp;raquo;&amp;ldquo;运算符，它将命令的输出附加到文件中，而不是覆盖现有内容。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;First line&amp;#34;&lt;/span&gt; &amp;gt; multiline.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Second line&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; multiline.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Third line&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; multiline.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat multiline.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id="管道运算符"&gt;|管道运算符
&lt;/h5&gt;&lt;p&gt;管道运算符将一个命令的输出作为另一个命令的输入。这对于将一个命令的输出传递给另一个命令进行处理非常有用。&lt;br&gt;
例如&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;apple banana cherry date elderberry&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;echo命令将字符串&amp;quot;apple banana cherry date elderberry&amp;quot;输出到标准输出&lt;/li&gt;
&lt;li&gt;tr命令将空格字符转换为换行符，每个水果名称都单独一行&lt;/li&gt;
&lt;li&gt;sort命令将输出按字母顺序排序
于是有这样的输出:
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="pics/image2.png"&gt;
&lt;img src="pics/image2.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后我们综合一下这些技术来创建一个文件，搜索特定单词，然后重定向输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;The quick brown fox jumps over the lazy dog&amp;#34;&lt;/span&gt; &amp;gt; sentence.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat sentence.txt &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;fox&amp;#34;&lt;/span&gt; &amp;gt; fox_result.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Search completed successfully&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Search failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat fox_result.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;结果会是什么样的？可以自己想一下&lt;/p&gt;
&lt;h3 id="superuser"&gt;Superuser
&lt;/h3&gt;&lt;p&gt;超级用户，也称为“root 用户”，是 Linux 中拥有广泛权力、特权和功能的用户帐户。此用户可以完全控制系统并可以访问存储在系统上的任何数据。这包括修改系统配置、更改其他用户的密码、安装软件以及在 shell 环境中执行更多管理任务的能力。&lt;br&gt;
用&lt;code&gt;su&lt;/code&gt;或&lt;code&gt;sudo&lt;/code&gt;命令切换到超级用户，&lt;code&gt;sudo&lt;/code&gt;允许我们以另一个用户身份运行命令，默认为root。还有一个关键区别：&lt;br&gt;
&lt;code&gt;sudo&lt;/code&gt;会记录用户执行的命令，而&lt;code&gt;su&lt;/code&gt;不会。&lt;/p&gt;
&lt;h2 id="working-with-files"&gt;Working with Files
&lt;/h2&gt;&lt;p&gt;处理文件是Linux的重要组成部分，就在上面，我们学习了Linux 终端中用于文件处理的一些基本命令包括&lt;code&gt;touch&lt;/code&gt;创建文件、&lt;code&gt;mv&lt;/code&gt;移动文件、&lt;code&gt;cp&lt;/code&gt;复制文件、&lt;code&gt;rm&lt;/code&gt;删除文件以及&lt;code&gt;ls&lt;/code&gt;列出文件和目录。&lt;br&gt;
接下来我们还要具体学习一部分文件操作&lt;/p&gt;
&lt;h3 id="file-permissions"&gt;File Permissions
&lt;/h3&gt;&lt;p&gt;三种用户: &lt;strong&gt;owners&lt;/strong&gt;, &lt;strong&gt;groups&lt;/strong&gt;, and &lt;strong&gt;others&lt;/strong&gt; who can have a different set of permissions.&lt;br&gt;
看一个例子:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;4096&lt;/span&gt; Jan &lt;span class="m"&gt;1&lt;/span&gt; 12:00 filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第一个&lt;code&gt;-&lt;/code&gt;表示这是一个文件，如果是&lt;code&gt;d&lt;/code&gt;则表示这是一个目录。接下来的9个字符表示权限，每3个字符一组，分别代表&lt;strong&gt;owner&lt;/strong&gt;, &lt;strong&gt;group&lt;/strong&gt;, and &lt;strong&gt;others&lt;/strong&gt;的权限。(懒得写了)&lt;/p&gt;
&lt;h3 id="archiving-and-compressing"&gt;Archiving and Compressing
&lt;/h3&gt;&lt;p&gt;Linux提供了强大归档实用程序，用于将文件和目录打包到单个文件中，以便于传输或备份。&lt;br&gt;
主要工具有&lt;code&gt;tar&lt;/code&gt;和&lt;code&gt;gzip&lt;/code&gt;以及&lt;code&gt;bzip2&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tar: 是一种多功能工具，可以管理和组织文件到一个文档中。&lt;/li&gt;
&lt;li&gt;gzip和bzip2&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To create a tar archive:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -cvf archive_name.tar directory_to_archive/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To extract a tar archive:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xvf archive_name.tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To create a gzip compressed tar archive:一步创建压缩文档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -cvzf archive_name.tar.gz directory_to_archive/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To extract a gzip compressed tar archive:一步解压&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzvf archive_name.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="experiment-1"&gt;experiment
&lt;/h4&gt;&lt;p&gt;我们来实践一下, 在~/Linux_study下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p tar/&lt;span class="o"&gt;{&lt;/span&gt;subdir1,subdir2&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#该-p选项允许 mkdir 根据需要创建父目录。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;This is file 1&amp;#34;&lt;/span&gt; &amp;gt; tar/file1.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;This is file 2&amp;#34;&lt;/span&gt; &amp;gt; tar/file2.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tree tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以看到&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;nan0in㉿BF-202501180754&lt;span class="o"&gt;)&lt;/span&gt;-&lt;span class="o"&gt;[&lt;/span&gt;~/Linux_study&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ tree tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── file1.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── file2.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── subdir1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── subdir2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt; directories, &lt;span class="m"&gt;2&lt;/span&gt; files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;让我们用tar打包：&lt;code&gt;tar -cvf tar_archive.tar tar&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-c&lt;/code&gt;选项表示创建一个新归档文件，&lt;code&gt;-v&lt;/code&gt;选项表示详细模式(可选)，&lt;code&gt;-f&lt;/code&gt;选项表示指定归档文件的名称。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要查看内容而不提取，可以使用：&lt;code&gt;tar -tvf tar_archive.tar&lt;/code&gt;:-t是详细列出,-f指定了文件,-v表示列出内容
要提取文件内容，我们可以这么做：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir extracted_tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xvf tar_archive.tar -C extracted_tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;-x选项表示提取归档文件的内容，&lt;code&gt;-C&lt;/code&gt;选项表示指定提取目录, 告诉tar提取之前更改&lt;code&gt;extracted_tar&lt;/code&gt;为当前目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;nan0in㉿BF-202501180754&lt;span class="o"&gt;)&lt;/span&gt;-&lt;span class="o"&gt;[&lt;/span&gt;~/Linux_study&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ tree extracted_tar/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;extracted_tar/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── file1.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── file2.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── subdir1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── subdir2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt; directories, &lt;span class="m"&gt;2&lt;/span&gt; files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;接下来我们用命令gzip来压缩它：&lt;code&gt;gzip tar_archive.tar&lt;/code&gt;
现在我们可以看到&lt;code&gt;tar_archive.tar.gz&lt;/code&gt;文件，用&lt;code&gt;ls -lh tar_archive.tar.gz&lt;/code&gt;可以看到它的大小234字节&lt;/p&gt;
&lt;h4 id="打包和压缩的区别"&gt;打包和压缩的区别
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Packaging
&lt;ul&gt;
&lt;li&gt;目的：将多个文件和目录合并为一个文件。&lt;/li&gt;
&lt;li&gt;功能：分组文件&lt;/li&gt;
&lt;li&gt;工具：&lt;code&gt;tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;结果：档案的总大小通常略大于其中所有文件的大小总和。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compression
&lt;ul&gt;
&lt;li&gt;目的：减小文件的大小。&lt;/li&gt;
&lt;li&gt;功能：应用算法消除数据中的冗余&lt;/li&gt;
&lt;li&gt;工具：&lt;code&gt;gzip&lt;/code&gt;和&lt;code&gt;bzip2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;结果：压缩后的文件通常比原始文件小，使用前需解压
如下:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;nan0in㉿BF-202501180754&lt;span class="o"&gt;)&lt;/span&gt;-&lt;span class="o"&gt;[&lt;/span&gt;~/Linux_study&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;size of the original directory:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; du -sh tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;size of the original directory:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;20K tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;nan0in㉿BF-202501180754&lt;span class="o"&gt;)&lt;/span&gt;-&lt;span class="o"&gt;[&lt;/span&gt;~/Linux_study&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;size of the tar archive:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; ls -lh test_archive0.tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;size of the tar archive:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; nan0in nan0in 10K Feb &lt;span class="m"&gt;1&lt;/span&gt; 22:06 test_archive0.tar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;nan0in㉿BF-202501180754&lt;span class="o"&gt;)&lt;/span&gt;-&lt;span class="o"&gt;[&lt;/span&gt;~/Linux_study&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;size of the compressed tar.gz:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; ls -lh tar_archive.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;size of the compressed tar.gz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; nan0in nan0in &lt;span class="m"&gt;234&lt;/span&gt; Feb &lt;span class="m"&gt;1&lt;/span&gt; 21:32 tar_archive.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="copy-and-renaming"&gt;Copy and Renaming
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;cp:&lt;code&gt;cp /path/to/original/file /path/to/copied/file&lt;/code&gt;指定文件和目标路径&lt;/li&gt;
&lt;li&gt;mv:&lt;code&gt;mv /path/to/original/file /path/to/moved/file&lt;/code&gt;&lt;br&gt;
指定要重命名或移动的文件和要重命名或移动到的文件和路径&lt;/li&gt;
&lt;li&gt;重命名：
如我们要将&lt;code&gt;index.html&lt;/code&gt;重命名为&lt;code&gt;home.html&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv index.html home.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;移动多个文件&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv *.js scripts/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;实现了将所有js文件移动到scripts目录下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;安全转移：使用&lt;code&gt;-i&lt;/code&gt;选项&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv -i *.js scripts/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;enter后将会收到消息:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv: overwrite &lt;span class="s1"&gt;&amp;#39;scripts/file1.js&amp;#39;&lt;/span&gt;? n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输入n后就不会覆盖了&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="soft-linkshard-links"&gt;Soft links/Hard links
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;硬链接：指向文件系统中的同一物理位置, 可以理解为 &lt;strong&gt;镜像&lt;/strong&gt;，源文件删除后硬链接仍存在&lt;/li&gt;
&lt;li&gt;软链接：指向文件系统中的另一个位置, 可以理解为 &lt;strong&gt;快捷方式&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;创建硬链接：&lt;code&gt;ln /path/to/original/file /path/to/link&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建软链接：&lt;code&gt;ln -s /path/to/original/file /path/to/link&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除链接：&lt;code&gt;rm /path/to/link&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="text-processing"&gt;Text Processing
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;文本处理是系统管理员和开发人员的一项基本任务。Linux 是一个强大的操作系统，它提供了强大的文本搜索、操作和处理工具。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用户可以使用&lt;code&gt;awd&lt;/code&gt; &lt;code&gt;sed&lt;/code&gt; &lt;code&gt;grep&lt;/code&gt; &lt;code&gt;cut&lt;/code&gt;等命令进行文本过滤、替换和处理正则表达式。shell脚本、python等编程语言都可以在Linux实现出色的文本处理功能&lt;br&gt;
当然还有&lt;code&gt;vim&lt;/code&gt; &lt;code&gt;nano&lt;/code&gt;等文本编辑器
&lt;strong&gt;非常 非常关键&lt;/strong&gt;
以下部分不做实验，只举少量例子
资源:&lt;a class="link" href="https://ryanstutorials.net/linuxtutorial/filters.php" target="_blank" rel="noopener"
&gt;Linux Filters&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;a class="link" href="https://earthly.dev/blog/linux-text-processing-commands/" target="_blank" rel="noopener"
&gt;Linux Text Processing&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 id="stdinstdoutstderr"&gt;stdin/stdout/stderr
&lt;/h3&gt;&lt;p&gt;Linux 中 stdout 和 stderr 的概念属于 Linux 文本处理的基础，在 Linux 中，程序执行时一般会开启三个通信通道，分别是 STDIN（标准输入）、STDOUT（标准输出）、STDERR（标准错误）。&lt;/p&gt;
&lt;p&gt;通道(channels)都有特殊的功能
STDOUT会发送大多数shell命令输出的通道
STDERR专门用于发送错误信息&lt;/p&gt;
&lt;h4 id="示例"&gt;示例
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &amp;gt; stdout.txt 2&amp;gt;stderr.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;将stdout重定向到stdout.txt中
&lt;code&gt;2&amp;gt;&lt;/code&gt;则将stderr重定向到stderr.txt中，正确输出和错误信息将存储在不同文件中检查和处理&lt;/p&gt;
&lt;h3 id="cut"&gt;cut
&lt;/h3&gt;&lt;p&gt;剪切命令允许我们从文件或输出中剪切出每行的部分，并将其显示在标准输出（通常是终端）上。它通常用于scripts和pipe，尤其是用于&lt;strong&gt;文件操作&lt;/strong&gt;和&lt;strong&gt;文本操作&lt;/strong&gt;。
我们需要某个特殊部分的时候这个指令会很有用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cut OPTION... &lt;span class="o"&gt;[&lt;/span&gt;FILE&lt;span class="o"&gt;]&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="示例-1"&gt;示例
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;one,two,three,four&amp;#34; | cut -d &amp;#34;,&amp;#34; -f 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此命令以逗号分隔，输出第二个字段也就是
&lt;code&gt;two&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="paste"&gt;paste
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paste &lt;span class="o"&gt;[&lt;/span&gt;-s&lt;span class="o"&gt;][&lt;/span&gt;-d &amp;lt;间隔字符&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;--help&lt;span class="o"&gt;][&lt;/span&gt;--version&lt;span class="o"&gt;][&lt;/span&gt;文件...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 Linux 中，paste 是一个功能强大的文本处理实用程序，主要用于合并来自多个文件的行。它允许用户按列而不是行合并数据，为文本数据处理增加了极大的灵活性。用户可以选择特定的分隔符来分隔列，从而提供多种方式输出。&lt;/p&gt;
&lt;h4 id="示例-2"&gt;示例
&lt;/h4&gt;&lt;p&gt;
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="1.png"&gt;
&lt;img src="1.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;paste file1.txt file2.txt &amp;gt; combined.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="2.png"&gt;
&lt;img src="2.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3 id="sort"&gt;sort
&lt;/h3&gt;&lt;p&gt;Linux 提供了多种处理和操作文本文件的工具，其中之一就是 sort 命令。Linux&lt;code&gt;sort&lt;/code&gt;中的该命令用于逐行对文本文件的内容进行排序。该命令使用 ASCII 值对文件进行排序。可以使用此命令以多种不同的方式对文件中的数据进行排序，例如按字母顺序、数字顺序、反向顺序甚至按月排序。sort 命令将文件作为输入，并在stdout上打印排序后的内容。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort filename.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一般会用重定向&lt;/p&gt;
&lt;p&gt;复杂一点的：
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="3.png"&gt;
&lt;img src="3.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort -n -t: -k2 students.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;-n 决定按Numeric排序 (-nr加上r就会逆向派)&lt;/li&gt;
&lt;li&gt;-t: 指定字符以冒号分隔&lt;/li&gt;
&lt;li&gt;-k2 使用第二个字段作为排序键
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-sort-command-text-sorting-219196" target="_blank" rel="noopener"
&gt;见sort命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tr"&gt;tr
&lt;/h3&gt;&lt;p&gt;用于翻译或替换字符，从标准输入读入并写入标准输出。虽然翻译多用，但是功能实际上很多，比如用于替换一组符号，删除或压缩重复字符
用法&lt;/p&gt;
&lt;h4 id="示例-3"&gt;示例
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;a-z&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A-Z&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;实现了将小写a-z替换为大写A-Z
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-tr-command-character-translating-388064" target="_blank" rel="noopener"
&gt;见tr命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 id="head--tail"&gt;head &amp;amp; tail
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;head&lt;/code&gt;允许用户输出文件的头部，通常用于预览文件开头，这可以快速检查超大文件中的数据，通常将每个文件的前10行打印到标准输出&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;head file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也可以自定义输出行数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;head -n &lt;span class="m"&gt;5&lt;/span&gt; file.txt &lt;span class="c1"&gt;#头部五行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://labex.io/tutorials/linux-linux-head-command-file-beginning-display-214302" target="_blank" rel="noopener"
&gt;见head命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tail&lt;/code&gt;命令用于输出文件最后部分，将最后的&lt;code&gt;N&lt;/code&gt;字节、行、块、字符或单词打印到标准输出&lt;/p&gt;
&lt;h3 id="join我不怎么会用"&gt;join（我不怎么会用）
&lt;/h3&gt;&lt;p&gt;join允许我们在一个公告字段上合并文件的行，就类似SQL中的“join”，处理大量数据时特别管用，用于两个文件中的行来形成包含以有意义的方式关联的行对的行&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意！只有文件排序后，该命令才能正常工作
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-join-command-file-joining-219193" target="_blank" rel="noopener"
&gt;见join命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="split"&gt;Split
&lt;/h3&gt;&lt;p&gt;于将大文件拆分为小文件的命令，顾名思义。Linux&lt;code&gt;split&lt;/code&gt;中的命令根据用户指定的行或字节将文件分成多个相等的部分。
由于其实用性，它是一个有用的命令。例如，如果您有一个大型数据文件，由于其大小而无法有效使用，则可以使用 split 命令将文件拆分为更易于管理的部分。
基本语法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;split &lt;span class="o"&gt;[&lt;/span&gt;--help&lt;span class="o"&gt;][&lt;/span&gt;--version&lt;span class="o"&gt;][&lt;/span&gt;-&amp;lt;行数&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-b &amp;lt;字节&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-C &amp;lt;字节&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-l &amp;lt;行数&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;要切割的文件&lt;span class="o"&gt;][&lt;/span&gt;输出文件名&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;默认情况下&lt;code&gt;Split&lt;/code&gt;会将文件分成几个较小的文件，每个文件1000行，如果没有提供输入文件，或输入文件为&lt;code&gt;-&lt;/code&gt;，它会从标准输入读取
例如有一个&lt;code&gt;bigfile.txt&lt;/code&gt;要拆分为一个个有500行的文件，命令如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;split -l &lt;span class="m"&gt;500&lt;/span&gt; bigfile.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="pipe"&gt;pipe
&lt;/h3&gt;&lt;p&gt;没错，熟悉的管道命令，用于Linux中连接两个或多个命令的强大功能，允许将一个命令通过&lt;code&gt;pipe&lt;/code&gt;作为另外一个的输入。对于文本处理尤其有用，一个简单的例子&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;\.txt$&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ls列出文件，grep获取目录下文件并过滤掉不以&lt;code&gt;.txt&lt;/code&gt;结尾的文件&lt;/p&gt;
&lt;h3 id="nl"&gt;nl
&lt;/h3&gt;&lt;p&gt;对于文本中要编号行数有用,&lt;code&gt;number lines&lt;/code&gt;，如果你需要概览某一部分也可以用到这个指令，&lt;code&gt;nl&lt;/code&gt;只会读到非空行，当然也可以根据命令进行修改&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nl &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;file_name&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;-b a便会对所有行进行编号
如果没有指定文件，nl命令会等待用户的标准输入
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-nl-command-line-numbering-210988" target="_blank" rel="noopener"
&gt;见nl&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wc"&gt;wc
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;word count&lt;/code&gt;
用于计算数量，可以是字节数、符号数、词数、行数，当然不止可以读行数，还可以跟踪程序输出，计算代码行数等，是 &lt;strong&gt;用于大规模文本分析和精密分析的宝贵工具&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wc &lt;span class="o"&gt;[&lt;/span&gt;输出的参数&lt;span class="o"&gt;]&lt;/span&gt; file1.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="4.png"&gt;
&lt;img src="4.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
行数 单词数 字符数 文件名
-l 行
-w 单词
-m 计算字符数 也可组合使用
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-wc-command-text-counting-219200" target="_blank" rel="noopener"
&gt;见wc命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 id="expandunexpand"&gt;expand/unexpand
&lt;/h3&gt;&lt;p&gt;是一个Unix和类Unix操作系统中的一个命令行实用程序, 可将制表符转换为空格
emmm，有了这个命令可以减轻制表符所带来的扰乱格式，使用linux shell脚本时就很有用，制表符空格在不同系统或文本编辑器上可能有不同格式会不一致，这样使用大大提高代码可读性
该&lt;code&gt;expand&lt;/code&gt;命令默认将制表符转换为 8 个空格。以下是示例用法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;expand filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在此示例中，&lt;code&gt;filename&lt;/code&gt;是要将制表符转换为空格的文件的名称。运行该命令后，制表符转换后的内容将打印到标准输出。
要指定每个制表符的空格数，&lt;code&gt;-t&lt;/code&gt;可以使用以下选项：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;expand -t 4 filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在此示例中，每个制表符&lt;code&gt;filename&lt;/code&gt;将被替换为 4 个空格。然后输出将显示在控制台上。
unexpand就是相反的操作&lt;/p&gt;
&lt;h3 id="uniq"&gt;uniq
&lt;/h3&gt;&lt;p&gt;用于过滤重复的行，来帮助检查和处理文本文件。无论处理的是数据列表还是大型文本文档，该&lt;code&gt;uniq&lt;/code&gt;命令都允许您查找和过滤重复的行，甚至可以提供文件中每个唯一行的计数。重要的是要记住，&lt;code&gt;uniq&lt;/code&gt;只会删除彼此相邻的重复项，因此为了充分利用此命令，通常&lt;code&gt;sort&lt;/code&gt;首先使用该命令对数据进行排序。&lt;/p&gt;
&lt;p&gt;使用示例&lt;code&gt;uniq&lt;/code&gt;为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort names.txt | uniq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在此示例中，&lt;code&gt;names.txt&lt;/code&gt;是一个包含名称列表的文件。该&lt;code&gt;sort&lt;/code&gt;命令对文件中的所有行进行排序，然后&lt;code&gt;uniq&lt;/code&gt;删除所有重复的行。结果输出将是 中的唯一名称列表&lt;code&gt;names.txt&lt;/code&gt;。
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-uniq-command-duplicate-filtering-219199" target="_blank" rel="noopener"
&gt;见uniq&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 id="grep"&gt;grep💖
&lt;/h3&gt;
&lt;div class="notice notice-note" &gt;
&lt;div class="notice-title"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon notice-icon" viewBox="0 0 512 512" fill="#436170"&gt;&lt;path d="M504 256a248 248 0 11-496 0 248 248 0 01496 0zm-248 50a46 46 0 100 92 46 46 0 000-92zm-44-165l8 136c0 6 5 11 12 11h48c7 0 12-5 12-11l8-136c0-7-5-13-12-13h-64c-7 0-12 6-12 13z"/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;p&gt;LINUX三剑客，grep awk sed&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;grep&lt;/code&gt;全局正则表达式打印）被认为是类 Unix 操作系统（包括 Linux）文本处理领域的重要工具。它是一款功能强大的实用程序，可以搜索和过滤与给定模式匹配的文本，当它识别出与模式匹配的行时，会将该行打印到屏幕上&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; 是许多 shell 脚本、bash 命令和命令行操作的重要组成部分，它是一种多功能工具，每个 Linux 发行版都预装了它。它包含三个主要部分 - 格式、操作和正则表达式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;另一种选择——&lt;code&gt;ripgrep&lt;/code&gt;，支持&lt;code&gt;grep&lt;/code&gt;所有功能并进行扩展&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt; pattern &lt;span class="o"&gt;[&lt;/span&gt;files&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;或
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;[&lt;/span&gt;-abcEFGhHilLnqrsvVwxy&lt;span class="o"&gt;][&lt;/span&gt;-A&amp;lt;显示行数&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-B&amp;lt;显示列数&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-C&amp;lt;显示列数&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-d&amp;lt;进行动作&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-e&amp;lt;范本样式&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;-f&amp;lt;范本文件&amp;gt;&lt;span class="o"&gt;][&lt;/span&gt;--help&lt;span class="o"&gt;][&lt;/span&gt;文件或目录...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;常用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i&lt;/code&gt;：忽略大小写进行匹配。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;：反向查找，只打印不匹配的行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt;：显示匹配行的行号。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt;：递归查找子目录中的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l&lt;/code&gt;：只打印匹配的文件名。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;：只打印匹配的行数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="https://ryanstutorials.net/linuxtutorial/grep.php" target="_blank" rel="noopener"
&gt;学习grep和正则表达式&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;br&gt;
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-grep-command-pattern-searching-219192" target="_blank" rel="noopener"
&gt;见grep命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;br&gt;
可以看博客园的&lt;a class="link" href="https://www.cnblogs.com/along21/p/10366886.html" target="_blank" rel="noopener"
&gt;这篇文章&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h4 id="正则表达式概述"&gt;正则表达式概述
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;（点）- 单个字符。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?&lt;/code&gt; 前一个字符仅匹配 0 次或 1 次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&lt;/code&gt; 前面的字符匹配 0 次或更多次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; - 前面的字符匹配 1 次或多次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{n}&lt;/code&gt; - 前一个字符恰好匹配 n 次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{n,m}&lt;/code&gt;- 前一个字符匹配至少 n 次，但不超过 m 次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[agd]&lt;/code&gt; - 该字符是方括号内的字符之一。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[^agd]&lt;/code&gt; - 该字符不是方括号内的字符之一。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[cf]&lt;/code&gt; - 方括号内的破折号表示范围。在这种情况下，它表示字母 c、d、e 或 f。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;（）&lt;/code&gt; - 允许我们将多个字符分组为一个字符。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt;（管道符号）——逻辑或运算。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;^&lt;/code&gt; - 匹配行的开头。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt; - 匹配行尾。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="awk"&gt;awk
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;三剑客之二awk&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;awk 是一种功能强大的文本处理语言，广泛用于类 Unix 操作系统，包括 Linux。awk 以其三位原始开发者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的名字命名
该语言由脚本中的一组命令组成，本质上，awk 逐行读取输入文件，识别与脚本中指定的模式相匹配的模式，然后根据这些匹配执行动作。
下面是如何使用 awk 打印文件每行的前两个字段的示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;awk &amp;#39;{print $1,$2}&amp;#39; filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这将显示“filename”中每一行的第一个和第二个字段（通常用空格分隔）
&lt;a class="link" href="https://labex.io/tutorials/linux-linux-awk-command-text-processing-388493" target="_blank" rel="noopener"
&gt;见awk命令&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
c&lt;/p&gt;
&lt;h3 id="sed"&gt;sed
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;三剑客之三sed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;格式： &lt;code&gt;sed [options] '[地址定界] command' file(s)&lt;/code&gt;&lt;br&gt;
sed是一种流编辑器，一次处理 &lt;strong&gt;一行&lt;/strong&gt; 把当前处理的行存储在临时缓冲区作为&lt;code&gt;patternspace&lt;/code&gt;，接着会用sed命令进行缓冲区内容处理并输出在屏幕后读取下一行直到末尾并且不重定向输出或-i就不会对文件修改&lt;/li&gt;
&lt;li&gt;功能：主要用来自动编辑一个或多个文件, 简化对文件的反复操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="常用选项"&gt;常用选项
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;-n&lt;/strong&gt;：不输出模式空间内容到屏幕，即不自动打印，只打印匹配到的行&lt;/li&gt;
&lt;li&gt; **-e：**多点编辑，对每行处理时，可以有多个Script&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;-f&lt;/strong&gt;：把Script写到文件当中，在执行sed时-f 指定文件路径，如果是多个Script，换行写&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;-r&lt;/strong&gt;：支持&lt;strong&gt;扩展的正则&lt;/strong&gt;表达式&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;-i&lt;/strong&gt;：直接将处理的结果写入文件&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;-i.bak&lt;/strong&gt;：在将处理的结果写入文件之前备份一份&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="地址定界"&gt;地址定界
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt; 不给地址：对全文进行处理&lt;/li&gt;
&lt;li&gt; 单地址：
&lt;ul&gt;
&lt;li&gt; #: 指定的行&lt;/li&gt;
&lt;li&gt; /pattern/：被此处模式所能够匹配到的每一行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; 地址范围：
&lt;ul&gt;
&lt;li&gt; #,#&lt;/li&gt;
&lt;li&gt; #,+#&lt;/li&gt;
&lt;li&gt; /pat1/,/pat2/&lt;/li&gt;
&lt;li&gt; #,/pat1/&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;~：步进&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;  sed -n &lt;strong&gt;&amp;lsquo;1~2p&amp;rsquo;&lt;/strong&gt;  只打印奇数行 （1~2 从第1行，一次加2行）&lt;/li&gt;
&lt;li&gt;  sed -n &lt;strong&gt;&amp;lsquo;2~2p&amp;rsquo;&lt;/strong&gt;  只打印偶数行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="编辑命令"&gt;编辑命令
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;d：删除&lt;/strong&gt;模式空间匹配的行，并立即启用下一轮循环&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;p：打印&lt;/strong&gt;当前模式空间内容，追加到默认输出之后&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;a&lt;/strong&gt;：在指定行&lt;strong&gt;后面追加&lt;/strong&gt;文本，支持使用\n实现多行追加&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;i&lt;/strong&gt;：在行&lt;strong&gt;前面插入&lt;/strong&gt;文本，支持使用\n实现多行追加&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;c&lt;/strong&gt;：&lt;strong&gt;替换&lt;/strong&gt;行为单行或多行文本，支持使用\n实现多行追加&lt;/li&gt;
&lt;li&gt; w：保存模式匹配的行至指定文件&lt;/li&gt;
&lt;li&gt; r：读取指定文件的文本至模式空间中匹配到的行后&lt;/li&gt;
&lt;li&gt; =：为模式空间中的行打印行号&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;!&lt;/strong&gt;：模式空间中匹配行&lt;strong&gt;取反&lt;/strong&gt;处理&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;s///&lt;/strong&gt;：&lt;strong&gt;查找替换&lt;/strong&gt;，支持使用其它分隔符，如：s@@@，s###；
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;加g表示行内全局替换；&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt; 在替换时，可以加一下命令，实现大小写转换&lt;/li&gt;
&lt;li&gt; \l：把下个字符转换成小写。&lt;/li&gt;
&lt;li&gt; \L：把replacement字母转换成小写，直到\U或\E出现。&lt;/li&gt;
&lt;li&gt; \u：把下个字符转换成大写。&lt;/li&gt;
&lt;li&gt; \U：把replacement字母转换成大写，直到\L或\E出现。&lt;/li&gt;
&lt;li&gt; \E：停止以\L或\U开始的大小写转换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="演示"&gt;演示
&lt;/h4&gt;&lt;p&gt;常用选项&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;/aaa/p&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed &lt;span class="s2"&gt;&amp;#34;/aaa/p&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -e &lt;span class="s2"&gt;&amp;#34;s/a/A/&amp;#34;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;s/b/B/&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ vim sedscript.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ cat sedscript.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;s/A/a/g
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -f sedscript.txt three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaBBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -i.bak &lt;span class="s2"&gt;&amp;#34;s/a/A/g&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sedscript.txt three_sword three_sword.bak
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ cat three_sword.bak
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;地址界定&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;p&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AAA
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed &lt;span class="s2"&gt;&amp;#34;2s/b/B/g&amp;#34;&lt;/span&gt; three_sword &lt;span class="c1"&gt;#替换第二行的b为B&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AAA
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BBBB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;/aaa/p&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;^C
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;/aaa/p&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ cat three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AAA
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sedscript.txt three_sword three_sword.bak
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ vim three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;/aaa/p&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;1,2p&amp;#34;&lt;/span&gt; three_sword &lt;span class="c1"&gt;# 打印1~2行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed -n &lt;span class="s2"&gt;&amp;#34;/aaa/,/DD/p&amp;#34;&lt;/span&gt; three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ vim three_sword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ sed &lt;span class="s2"&gt;&amp;#34;1~2s/[aA]/E/g&amp;#34;&lt;/span&gt; three_sword &lt;span class="c1"&gt;#奇数行a或A替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EEE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EEBBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="tee"&gt;tee
&lt;/h3&gt;&lt;p&gt;Linux tee命令用于读取标准输入的数据，并将其内容输出成文件。（就是打印输出同时存入文件）&lt;/p&gt;
&lt;p&gt;tee指令会从标准输入设备读取数据，将其内容输出到标准输出设备，同时保存成文件。&lt;/p&gt;
&lt;p&gt;在pwncollege的考察中我们知道，tee实际上实现的是复制数据流&lt;br&gt;
借助tee，我们可以同时实现让多个文件接受输出&lt;br&gt;
&lt;code&gt;command1 | tee &amp;gt;(command2) &amp;gt;(commannd3)&lt;/code&gt;
&lt;code&gt;&amp;gt;()&lt;/code&gt;会实现一个进程的替换，&amp;gt;(command2)实际上创建了一个文件描述符&lt;br&gt;
&lt;code&gt;&amp;quot;/dev/fd/63&amp;quot;​&lt;/code&gt;类似于这样&lt;/p&gt;
&lt;h3 id="obj文件目标文件或可执行文件odjdump"&gt;obj文件（目标文件或可执行文件）——odjdump
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;在Linux环境下，我们可以使用objdump命令对目标文件(obj)或可执行文件进行反汇编，它以一种可阅读的格式让你更多的了解二进制文件可能带有的附加信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;objdump [-a|--archive-headers]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[-d|--disassemble]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[-D|--disassemble-all]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[-f|--file-headers]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-F
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--file-offsets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 当在对sections进行反汇编时，无论是否显示相应的symbol，都会显示其在文件内的偏移(offset)。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[-i|--info]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--section-headers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--headers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 显示obj文件各个sections的头部摘要信息。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; obj文件中segments可能会被relocate，比如在ld时通过使用-Ttext、-Tdata或者-Tbss选项。然而，有一些
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 对象文件格式，比如a.out，其本身并没有保存起始地址信息。在这种情况下，尽管ld可以正确的对这些sections
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 进行relocate，但是使用objdump -h来查看各sections的头部摘要信息时则不能正确的显示地址信息。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--syms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 显示文件的符号表入口。类似于nm -s提供的信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-T
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--dynamic-syms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 显示文件的动态符号表入口，仅仅对动态目标文件意义，比如某些共享库。它显示的信息类似于 nm -D(--dynamic)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 显示的信息
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="xxd"&gt;xxd
&lt;/h3&gt;&lt;p&gt;xxd是Linux下命令行工具，用于将文件或数据转换为十六进制格式显示，还可以将十六进制数据重新转化为二进制文件&lt;br&gt;
功能：&lt;strong&gt;调试、文件内容分析、数据转化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语法格式：&lt;br&gt;
&lt;code&gt;xxd [options][inputfile[outputfile]]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;options:&lt;br&gt;
- &lt;code&gt;-r&lt;/code&gt;：十六进制-&amp;gt;二进制（反向操作）
- &lt;code&gt;-p/-ps&lt;/code&gt;：以连续纯十六进制（不带偏移地址和ascii）输出
- &lt;code&gt;-s offset&lt;/code&gt; &lt;code&gt;-l length&lt;/code&gt;两者经常搭配使用，前者指定从偏移位置开始读取（负数则是末尾）后者显示指定长度的字节&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="strace"&gt;strace
&lt;/h3&gt;&lt;p&gt;一个强大的 Linux 调试工具，用于跟踪进程执行时的系统调用和信号。它能详细记录进程对系统调用的使用情况，包括参数、返回值、时间消耗等&lt;br&gt;
我们需要动态跟踪程序进程时便可以使用&lt;/p&gt;
&lt;h4 id="跟踪进程"&gt;跟踪进程
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;strace ls -lh /var/log/messages&lt;/code&gt; 会跟踪 &lt;code&gt;ls...&lt;/code&gt;这条命令的执行过程并输出所有的系统调用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跟踪已经在进行的进程：指定PID &lt;code&gt;strace -p 17553&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重定向到文件：&lt;code&gt;strace -o strace_output.txt ls -lh /var/log/messages&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="server-review"&gt;server review
&lt;/h2&gt;&lt;p&gt;在审查 Linux 服务器的过程中需要包括评估服务器的性能、安全性和配置，以确定需要改进的地方或任何潜在问题。审查范围可以包括检查安全增强功能、检查日志文件、查看用户帐户、分析服务器的网络配置以及检查其软件版本。
Linux以其稳定性和安全性闻名，已成为全球许多网络和服务器后端的必备软件。根据使用的发行版，Linux 提供了多种工具和命令来执行全面的服务器审查。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 显示内存信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#显示磁盘使用情况&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 显示cpu加载情况&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uptime
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="authentication-logs"&gt;authentication logs
&lt;/h3&gt;&lt;p&gt;在处理 Linux 服务器及其维护时，需要定期检查的最重要组件之一是身份验证日志。这些日志通常位于 /var/log/auth.log（适用于基于 Debian 的发行版）或 /var/log/secure（适用于 Red Hat 和 CentOS），记录服务器上发生的所有与身份验证相关的事件和活动。其中包括系统登录、密码更改和发出的 sudo 命令等。&lt;/p&gt;
&lt;p&gt;身份验证日志是监控和分析 Linux 服务器安全性的宝贵工具。它们可以指示暴力登录攻击、未经授权的访问尝试以及任何可疑行为。定期分析这些日志是确保服务器安全性和数据完整性的一项基本任务。&lt;/p&gt;
&lt;p&gt;下面是如何使用&lt;code&gt;tail&lt;/code&gt;命令查看身份验证日志的最后几个条目的示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;熟悉阅读和理解身份验证日志，因为这是确保服务器安全的重要方法之一。&lt;/p&gt;
&lt;h3 id="system-services"&gt;system services
&lt;/h3&gt;&lt;p&gt;Linux 服务器因其稳定性和灵活性而广受欢迎，这些因素使其成为企业和组织在管理各种服务时的首选。在 Linux 服务器下运行的服务包括 Web 服务、数据库服务、DNS 服务器、邮件服务器等。&lt;/p&gt;
&lt;p&gt;作为 Linux 系统管理员，定期检查这些正在运行的服务以管理资源、检查其状态和解决问题非常重要，从而确保服务器的健康和性能。&lt;/p&gt;
&lt;p&gt;Linux 有多种工具可以实现这一点，例如：&lt;code&gt;systemctl&lt;/code&gt; &lt;code&gt;service&lt;/code&gt; &lt;code&gt;netstat&lt;/code&gt; &lt;code&gt;ss&lt;/code&gt; &lt;code&gt;lsof&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;例如，该命令&lt;code&gt;systemctl&lt;/code&gt;在 Linux 系统上广泛用于列出所有正在运行的服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --type&lt;span class="o"&gt;=&lt;/span&gt;service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此命令将显示所有活动服务及其当前状态的列表。它是服务器管理的必需品，应该是任何 Linux 系统管理员工具箱的一部分。&lt;/p&gt;
&lt;h2 id="process-management"&gt;process management
&lt;/h2&gt;&lt;p&gt;进程管理是任何操作系统不可或缺的一部分，Linux 也不例外。在 Linux 上运行的每个程序（无论是应用程序还是系统操作）都被视为进程。这些进程执行不同的任务，但协同工作以提供无缝的操作体验。&lt;/p&gt;
&lt;p&gt;在 Linux 中，用户可以使用不同的命令来交互和管理这些进程，以执行各种进程管理任务，例如查看当前正在运行的进程、终止进程、更改进程的优先级等。了解这些命令以及如何有效地使用它们对于 Linux 进程管理至关重要。&lt;/p&gt;
&lt;p&gt;例如，ps 命令提供有关当前正在运行的进程的信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这将列出所有当前正在运行的进程，其中包含进程 ID、运行该进程的用户、其消耗的 CPU 和内存、启动该进程的命令等信息。
&lt;code&gt;top&lt;/code&gt;是另一个常用命令。它提供系统当前状态的实时更新视图，包括进程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;top
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;另一个强大的工具是&lt;code&gt;kill&lt;/code&gt;，它可以向进程发送特定信号。例如，你可以使用&lt;code&gt;SIGTERM&lt;/code&gt;(15) 正常停止进程，或使用 (9) 强制停止进程&lt;code&gt;SIGKILL&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; -SIGTERM pid
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; -SIGKILL pid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="listfind-processes"&gt;list/find processes
&lt;/h3&gt;&lt;p&gt;文件系统&lt;code&gt;proc&lt;/code&gt;是一个强大的工具&lt;br&gt;
具体来说它提供有关正在运行的进程的详情信息，包括&lt;strong&gt;PID、状态和资源消耗&lt;/strong&gt;
我们也可以通过探索proc目录（/proc），我们可以深入了解和查看系统内核参数和每个进程的具体系统详细信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# view specifics of a particular PID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/&lt;span class="o"&gt;{&lt;/span&gt;PID&lt;span class="o"&gt;}&lt;/span&gt;/status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="process-signals"&gt;process SIGNALS
&lt;/h3&gt;&lt;p&gt;即 &lt;strong&gt;进程信号&lt;/strong&gt;，这是Unix和Linux系统中的一种通信机制，它们提供了一种通知进程同步或异步时间的方法。&lt;br&gt;
有多种信号可用，比如SIGINT、SIGSTOP、SIGKILL等，可将其发送到正在运行的进程来中断、暂停或终止
例如，向PID12345进程发送stop信号&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; -SIGSTOP &lt;span class="m"&gt;12345&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里再讲一下kill命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;signal or option&lt;span class="o"&gt;]&lt;/span&gt; PID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Linux中的kill是用于手动终止进程的内置命令，用kill基本是请求进程暂停、停止&lt;/p&gt;
&lt;h3 id="process-priorities"&gt;process priorities
&lt;/h3&gt;&lt;p&gt;Linux内核在proc结构中队进程进行排序，通常位于&lt;code&gt;/proc&lt;/code&gt;文件系统目录下。此结构包含有关所有活动进程信息, 也包括了优先级&lt;br&gt;
优先级从&lt;font color="#ff0000"&gt;-20到+19&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;通过了解和管理进程优先级，我们可以优化系统性能并控制哪些进程获得更多/更少的CPU关注&lt;br&gt;
看一个简单命令，用于显示所有进程的ID、优先级和用户&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps -eo pid,pri,user,comm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;需更改任何进程的优先级，可以用&lt;code&gt;renice&lt;/code&gt;命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;renice -5 -p &lt;span class="o"&gt;[&lt;/span&gt;PID&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;#increase priority by 5 units for process ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="process-forking"&gt;process Forking
&lt;/h2&gt;&lt;p&gt;forking在Linux进程管理中非常常见，它进行了对一个进程自身的复制（子进程），并且允许几个进程并发进行执行，fork的进程几乎是完全一致的除了PID等少数的值 来个C的源码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pid_t&lt;/span&gt; &lt;span class="n"&gt;child_pid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Try creating a child process
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;child_pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// If a child is successfully created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;child_pid&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Child created with PID: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child_pid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Fork failed&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;fork成功就会返回进程ID&lt;/p&gt;
&lt;h2 id="user-management"&gt;User Management
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;可参考文章&lt;a class="link" href="https://labex.io/tutorials/linux-user-account-management-49" target="_blank" rel="noopener"
&gt;usermanager&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前言：&lt;br&gt;
Linux的开放式系统有一个用户管理系统，使得可以有大量用户进行跟系统的交互。&lt;br&gt;
在Linux中会进行用户角色、分配权限、组、所有权和其他相关方面的交互，我们需要牢记，如果作为Linux管理员尤其&lt;br&gt;
为了使操作更流畅可控，Linux中的user操作包括&lt;code&gt;creating&lt;/code&gt; &lt;code&gt;deleting&lt;/code&gt; &lt;code&gt;modifying&lt;/code&gt;等等，也包括了为用户/组分配文件和目录的权限和所有权&lt;/p&gt;
&lt;p&gt;我们通过基本的shell命令对Linux用户进行管理&lt;/p&gt;
&lt;h3 id="用户"&gt;用户
&lt;/h3&gt;&lt;p&gt;例如我们创建一个用户：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo useradd fumofumo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果没有sudo就会出现permission denied&lt;br&gt;
为了验证我们可以&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo grep -w &lt;span class="s1"&gt;&amp;#39;fumofumo&amp;#39;&lt;/span&gt; /etc/passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我们会看到类似输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fumofumo:x:1001:1001::/home/fumofumo:/usr/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里解释一下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户名：fumofumo&lt;/li&gt;
&lt;li&gt;密码：x（实际存储在别处）&lt;/li&gt;
&lt;li&gt;用户ID：1001&lt;/li&gt;
&lt;li&gt;组ID：1001&lt;/li&gt;
&lt;li&gt;主目录:/home/fumofumo（这里没有创建）&lt;/li&gt;
&lt;li&gt;默认shell：/bin/sh&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="创建有主目录的用户"&gt;创建有主目录的用户
&lt;/h4&gt;&lt;p&gt;接下来我们创建并给用户提供一个主目录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo useradd -m vortex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;-m提供了创建主目录的命令&lt;/p&gt;
&lt;p&gt;可以用下面的命令来验证&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ls -ld /home/vortex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过&lt;code&gt;sudo passwd&lt;/code&gt;为其创建一个密码
通过&lt;code&gt;sudo userdel -r&lt;/code&gt;删除用户&lt;/p&gt;
&lt;h3 id="users-and-groups"&gt;Users and Groups
&lt;/h3&gt;&lt;p&gt;Linux用户中的用户管理使用用户组高效管理系统用户和权限&lt;br&gt;
每个用户都有一个主组和一个或多个附加组, 可以通过&lt;code&gt;groupadd&lt;/code&gt; &lt;code&gt;goupdel&lt;/code&gt; &lt;code&gt;groupmod&lt;/code&gt;等命令来管理组&lt;/p&gt;
&lt;h4 id="组"&gt;组
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gruopadd demo &lt;span class="c1"&gt;#由此可以创建一个组并有唯一的组ID,使用-g 创建特定ID的组 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupmod -n demo &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="c1"&gt;#将demo组重命名为test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo usermod --append --groups demo user1 &lt;span class="c1"&gt;#将user1添加demo组&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gpasswd --delete user1 demo &lt;span class="c1"&gt;#修改组信息,删除user1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupdel demo &lt;span class="c1"&gt;#删除组&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="service-management"&gt;Service Management
&lt;/h2&gt;&lt;p&gt;Service
Management是Linux系统管理的一个重要方面，涉及到安装、配置、监控和维护系统服务和守护进程。Linux系统通常运行多个服务和守护进程，这些服务和守护进程在后台执行任务并提供功能，例如Web服务器、数据库服务器、文件服务器等。
现代Linux发行版中服务管理通常由systemd处理&lt;/p&gt;
&lt;h3 id="checking-service-status"&gt;Checking Service Status
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status apache2.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这是一个检查服务状态的命令，systemctl是systemd的命令行工具，apache2.service是要检查的服务名称&lt;br&gt;
该命令可以提供有关Apachw2服务器的状态信息, 通过高效管理服务状态,Linux管理员可以诊断和纠正问题&lt;/p&gt;
&lt;h3 id="startstop-service"&gt;start/stop service
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To start a service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start service_name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To stop a service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop service_name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To restart a service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart service_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;务必使用sudo进行操作, 这些命令在不同发行版或有不同&lt;/p&gt;
&lt;h3 id="checking-logs"&gt;Checking logs
&lt;/h3&gt;&lt;p&gt;检查日志在系统管理和故障排除过程中至关重要&lt;br&gt;
日志中包含系统进程/用户/管理员生成的一些重要日志&lt;code&gt;/var/log&lt;/code&gt;. 可以使用多个命令访问和查看日志. 例如,&lt;code&gt;dmesg&lt;/code&gt;可以使用命令显示kernel ring buffer. 多数情况下我们直接使用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl -u service_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第一个命令将显示从启动到调用日志的整个系统日志, 而第二个命令会显示特定服务运行状况&lt;/p&gt;
&lt;h3 id="creating-new-service"&gt;creating new service
&lt;/h3&gt;&lt;p&gt;在Linux中创建服务是指设置后台应用程序以实现运行并执行所需任务的过程. 通常包括编写服务文件(即脚本), 以指定如何使用服务管理系统启动, 停止和重新启动服务.&lt;br&gt;
例如可以简单创建一个&lt;code&gt;test_service.service&lt;/code&gt;文件:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;My Custom Service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;network.target
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Service&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/your/executable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Install&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后将服务文件放在&lt;code&gt;/etc/systemd/excutable&lt;/code&gt;来用ststemed识别它, 注意,Linux的最佳实践规定, 出于安全考虑, 我们尽量不要用root运行, 一般考虑新用户运行服务&lt;/p&gt;
&lt;h2 id="disk-and-filesystems"&gt;Disk and Filesystems
&lt;/h2&gt;&lt;p&gt;Linux 使用各种文件系统来帮助我们存储和检索计算机系统硬件（例如磁盘）上的数据。文件系统定义了数据在这些存储设备上的组织、存储和检索方式。常见的 Linux 文件系统包括 EXT4、FAT32、NTFS 和 Btrfs。&lt;/p&gt;
&lt;p&gt;每种文件系统都有其自身的优点、缺点和用例。例如，EXT4 通常用于 Linux 系统卷，因为它具有稳定性和与 Linux 的兼容性；而 FAT32 则可用于 USB 驱动器等可移动介质，因为它几乎兼容所有操作系统。
挂载硬盘时要尤其注意&lt;br&gt;
&lt;code&gt;df -T&lt;/code&gt;进行查看&lt;/p&gt;
&lt;h3 id="inodes"&gt;Inodes
&lt;/h3&gt;&lt;p&gt;inodes(索引节点)是文件系统中的一个核心概念
理解inode不仅有助于提高系统操作水平, 还可以有助于我们理解 &lt;em&gt;unix&lt;/em&gt; 的设计美学, 即如何把底层复杂性抽象出简单概念&lt;/p&gt;
&lt;h4 id="inode是什么"&gt;Inode是什么
&lt;/h4&gt;&lt;p&gt;文件储存在硬盘上，硬盘的最小存储单位叫做&amp;quot;扇区&amp;rdquo;（Sector）512字节一个扇区(0.5KB)&lt;br&gt;
操作系统读取硬盘, 不会一个个扇区读取, 这样效率太低, 而是一个一个块(block)进行读取.&lt;br&gt;
而由多个扇区组成的 &lt;strong&gt;块&lt;/strong&gt; 就是文件读取的最小单位了. 一般在4KB, 即连续八个sector组成一block&lt;br&gt;
文件数据这样存储了, 我们还需要一个地方储存文件元信息.&lt;br&gt;
as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一些常规文件信息File type - regular file, directory, character device, etc&lt;/li&gt;
&lt;li&gt;持有者&lt;/li&gt;
&lt;li&gt;组&lt;/li&gt;
&lt;li&gt;访问权限&lt;/li&gt;
&lt;li&gt;Timestamps 时间戳, 包含mtime（上次文件修改时间）、ctime（上次属性更改时间）、atime（上次访问时间）&lt;/li&gt;
&lt;li&gt;文件的硬链接数&lt;/li&gt;
&lt;li&gt;文件大小&lt;/li&gt;
&lt;li&gt;文件分配块数&lt;/li&gt;
&lt;li&gt;文件指针(指向文件数据块)- 非常重要!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mounts"&gt;mounts
&lt;/h3&gt;&lt;p&gt;挂载系统，以&lt;code&gt;mount source /mnt/**&lt;/code&gt;方式挂载文件系统、u盘等&lt;/p&gt;
&lt;h3 id="adding-disks"&gt;adding disks
&lt;/h3&gt;&lt;p&gt;下是管理磁盘的常用命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用于&lt;code&gt;lsblk&lt;/code&gt;列出所有块设备（磁盘和分区）。&lt;/li&gt;
&lt;li&gt;用于&lt;code&gt;fdisk /dev/sdX&lt;/code&gt;在磁盘上创建新分区。&lt;/li&gt;
&lt;li&gt;用于&lt;code&gt;mkfs.ext4 /dev/sdX1&lt;/code&gt;在分区上创建新的文件系统。&lt;/li&gt;
&lt;li&gt;用于&lt;code&gt;mount /dev/sdX1 /mount/point&lt;/code&gt;将文件系统挂载到目录。
具体方法可见&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# example commands to add new disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsblk &lt;span class="c1"&gt;# list all disks and partitions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fdisk /dev/sdb &lt;span class="c1"&gt;# let&amp;#39;s suppose new disk is /dev/sdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkfs.ext4 /dev/sdb1 &lt;span class="c1"&gt;# make filesystem(e.g., ext4) on partition 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount /dev/sdb1 /mnt &lt;span class="c1"&gt;# mount new filesystem to /mnt directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="swap"&gt;swap
&lt;/h3&gt;&lt;p&gt;Linux中Swap用于物理内存（RAM）已满情况。如果系统需要更多内存，而物理内存已满，则内存中不活动页面移动到Swap，适用于虚拟内存。&lt;/p&gt;
&lt;p&gt;拥有交换空间可确保系统物理内存不足时，可以将部分数据移动到Swap来释放RAM空间，但是会影响性能，因为基于磁盘的存储比 RAM 慢。&lt;/p&gt;
&lt;p&gt;通常Swap会在两个地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自己的专有分区中&lt;/li&gt;
&lt;li&gt;现有文件系统的常规文件中&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可见Arch Wiki&lt;/p&gt;
&lt;h3 id="lvm"&gt;LVM
&lt;/h3&gt;&lt;p&gt;Linux Logical Volume&lt;br&gt;
一个设备映射器框架，为Linux内核提供逻辑卷管理。为了简化磁盘管理，允许使用abstracted storage divices作为逻辑卷而不是直接使用物理存储设备&lt;br&gt;
LVM很灵活，可以调整卷大小、跨物理磁盘镜像卷、在磁盘间移动卷而无需关闭电源。&lt;br&gt;
LVM 在 3 个级别上工作：Phisical Volumes (PV)、Volume Groups (VGS) 和Logical Volumes (LV)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PV 是实际的磁盘或分区。&lt;/li&gt;
&lt;li&gt;VG 将 PV 组合成单个存储池。&lt;/li&gt;
&lt;li&gt;LV 从 VG 中划分出部分内容供系统使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="创建lvm"&gt;创建LVM
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pvcreate /dev/sdb1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vgcreate my-vg /dev/sdb1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lvcreate -L 10G my-vg -n my-lv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;由此实现创建一个物理卷&lt;code&gt;/dev/sdb1&lt;/code&gt;，然后创建一个卷组&lt;code&gt;my-vg&lt;/code&gt;。最后，我们从卷组中划分出一个10GB逻辑卷后将其命名为&lt;code&gt;my-lv&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;据此，管理存储系统更加便利，可见&lt;a class="link" href="https://blog.csdn.net/weixin_42915431/article/details/121881054" target="_blank" rel="noopener"
&gt;CSDN LVM具体介绍&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class="notice notice-warning" &gt;
&lt;div class="notice-title"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon notice-icon" viewBox="0 0 576 512" fill="#704343"&gt;&lt;path d="M570 440c18 32-5 72-42 72H48c-37 0-60-40-42-72L246 24c19-32 65-32 84 0l240 416zm-282-86a46 46 0 100 92 46 46 0 000-92zm-44-165l8 136c0 6 5 11 12 11h48c7 0 12-5 12-11l8-136c0-7-5-13-12-13h-64c-7 0-12 6-12 13z"/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;p&gt;Windows不支持LVM，所以你不能在其上检测到LVM分区盘&lt;/p&gt;&lt;/div&gt;
&lt;h2 id="booting-linux"&gt;Booting Linux
&lt;/h2&gt;&lt;p&gt;启动项，我们启动电脑系统的时候，system bootloader会加载到内存数据（回存放到固定位置）并根据选择我们启动指定的系统&lt;/p&gt;
&lt;p&gt;这整个加载过程会包含一系列的阶段，&lt;br&gt;
POST(Power-On Self Test) MBR(Master Boot Record) GRUB（引导启动界面系统）Kernel等等。最后我们就会加载进入GUI界面（或者通过命令行交互接口启动）&lt;/p&gt;
&lt;p&gt;这里提供一个经典的GRUB配置，一般在&lt;code&gt;/etc/default/grub&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRUB_DEFAULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRUB_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRUB_DISTRIBUTOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;lsb_release -i -s 2&amp;gt; /dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Debian&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;quiet splash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRUB_CMDLINE_LINUX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这是一个最基本的启动Linux的Grub配置，但是根据不同的发行版和不同的需求配置启动的过程是相同的（说的就是你 &lt;code&gt;F**k Nvidia&lt;/code&gt;）&lt;/p&gt;
&lt;h3 id="logs"&gt;Logs
&lt;/h3&gt;&lt;p&gt;Linux也会维护日志，以帮助管理员了解系统运行情况。日志记录了所有内容，包括用户活动、系统错误和内核信息。系统启动、加载和初始化关键系统组建时就尤为重要。&lt;/p&gt;
&lt;p&gt;Linux的logs under booting是启动过程中生成的信息，记录了启动过程中生成的消息和信息。这些日志记录了系统启动期间发生的所有操作、事件供我们诊断系统行为。&lt;/p&gt;
&lt;p&gt;Linux使用各种日志消息级别，从&lt;code&gt;emerg&lt;/code&gt;（系统不可用）到&lt;code&gt;debug&lt;/code&gt;（调试级别消息）。在启动过程中，系统将kernel init serve等各个组件的信息存储，看看&lt;code&gt;juornalctl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以使用&lt;code&gt;dmesg&lt;/code&gt;查看启动消息，用于读取和打印kernel ring buffer。还有系统的日志设置来访问它们，日志中可见文件&lt;code&gt;/var/log&lt;/code&gt;&lt;br&gt;
你也可以&lt;code&gt;sudo dmesg | less&lt;/code&gt;启动日志查看，less查看&lt;/p&gt;
&lt;h3 id="boot-loaders"&gt;Boot Loaders
&lt;/h3&gt;&lt;p&gt;引导加载程序将操作系统内核加载到系统内存中，内核才会初始化硬件组件和加载必要驱动程序，启动schedular调度程序来执行初始化进程。&lt;/p&gt;
&lt;p&gt;GRUB是我现在使用的，也时常用的目前流行的Linux booting，并提供各式的特色像图形化界面、脚本加载、调试功能等等。&lt;/p&gt;
&lt;p&gt;不管怎么样，对于你使用的引导加载程序的特点和与其他的不同点是要好好熟悉才是可以的&lt;/p&gt;
&lt;div class="notice notice-info" &gt;
&lt;div class="notice-title"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon notice-icon" viewBox="0 0 512 512" fill="#705943"&gt;&lt;path d="M256 8a248 248 0 100 496 248 248 0 000-496zm0 110a42 42 0 110 84 42 42 0 010-84zm56 254c0 7-5 12-12 12h-88c-7 0-12-5-12-12v-24c0-7 5-12 12-12h12v-64h-12c-7 0-12-5-12-12v-24c0-7 5-12 12-12h64c7 0 12 5 12 12v100h12c7 0 12 5 12 12v24z"/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;p&gt;可见&lt;a class="link" href="https://www.gnu.org/software/grub/" target="_blank" rel="noopener"
&gt;GNU GRUB&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
官网了解更多&lt;/p&gt;&lt;/div&gt;
&lt;h2 id="networking-"&gt;Networking 🌟
&lt;/h2&gt;&lt;p&gt;LInux的网络功能通过各种管理工具建立了跨平台的系统连接和资源共享（所以服务器基本都使用的是Linux）。默认的配置存储在&lt;code&gt;/etc/network/interfaces&lt;/code&gt;&lt;br&gt;
关键的指令包括了&lt;code&gt;ifconfig&lt;/code&gt; 或&lt;code&gt;ip&lt;/code&gt;来进行接口管理，支持各种协议并且有非常优秀的拓展性，这对于系统的连接和网络故障排除都非常重要。Linux还支持基于文件的处理的网络配置方式，将一系列配置都通过文件来进行处理。比如&lt;code&gt;/etc/network/interfaces&lt;/code&gt;或者&lt;code&gt;/etc/sysconfig/network-scripts/&lt;/code&gt;等等，具体取决于发行版。以下是一些学习用链接（注意对于计算机来说最重要的是实践）
&lt;a class="link" href="https://centlinux.com/linux-networking/" target="_blank" rel="noopener"
&gt;Linux网络综合指南&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;br&gt;
&lt;a class="link" href="https://dev.to/iaadidev/a-beginners-guide-to-linux-networking-fundamentals-dev-ops-prerequisite-7-434o" target="_blank" rel="noopener"
&gt;Linux 网络基础初学者指南&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;a class="link" href="https://linuxjourney.com/lesson/network-basics" target="_blank" rel="noopener"
&gt;网络基础实践&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
（这个很好用）&lt;/p&gt;
&lt;h3 id="tcpip-stack"&gt;TCP/IP Stack
&lt;/h3&gt;&lt;p&gt;即Transmission Control Protocol/Internet Ptorocol 传输控制协议和互联网协议&lt;br&gt;
&lt;font color="#ff0000"&gt;计算机网络通信的基础网络协议套件&lt;/font&gt;
分为四个基本层:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network Interface （网络接口层）&lt;/li&gt;
&lt;li&gt;Internet （互联网层）&lt;/li&gt;
&lt;li&gt;Transport（传输层）&lt;/li&gt;
&lt;li&gt;Application （应用层）
Linux中，其为操作系统功能不可或缺的一部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="详情"&gt;详情
&lt;/h4&gt;&lt;p&gt;基本的家用网络有以下基本的不同组件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ISP——互联网服务提供商，我们付费在家使用互联网的公司&lt;/li&gt;
&lt;li&gt;路由器——允许网络上的设备连接到互联网，一般现代路由器支持 &lt;strong&gt;以太网线连接&lt;/strong&gt; 和 &lt;strong&gt;无线网&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;WAN WLAN LAN 广域网 无线局域网 局域网&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们在看几个实例之前，我们必须做一些非常boring。。。的术语&lt;br&gt;
&lt;em&gt;The OSI&lt;/em&gt; 即（Open Systems Interconnection)开放系统互联模型是一个网络理论模型。我们将会知道数据包是如何在 &lt;font color="#ff0000"&gt;七个&lt;/font&gt; 不同的层级中进行传输的（没错就是大家都必须要学的计网基础口牙），OSI模型确切的存在并实际在我们如今使用的TCP/IP 协议中起到了必不可少的作用&lt;/p&gt;
&lt;p&gt;收集，寻址，传输和路由方式——通过TCP/IP协议套件协同工作，我们逐步了解这些协议是如何工作的，从而详细展示数据包在网络中的传输流程&lt;/p&gt;
&lt;h4 id="tcpip模型"&gt;TCP/IP模型
&lt;/h4&gt;&lt;h5 id="四层网络介绍"&gt;四层网络介绍
&lt;/h5&gt;&lt;p&gt;&lt;strong&gt;应用层&lt;/strong&gt;&lt;br&gt;
顶层，决定计算机程序（web浏览器）如何与传输层服务进行交互以查看发送、接受的数据&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP(超文本传输协议Hypertext Transfer Protocol)——互联网上的网页&lt;/li&gt;
&lt;li&gt;SMTP(简单邮件传输协议Simple Mail Transfer Protocol)——电子邮件传输&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;传输层&lt;/strong&gt;
决定数据如何传输，包括检查正确端口、数据完整性以及基本传输数据包&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP(传输控制协议Transport Control Protocol)——保证可靠的数据传输&lt;/li&gt;
&lt;li&gt;UDP(用户数据包协议 User Detapack Protocol)——不可靠的数据传输&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;网络层&lt;/strong&gt;&lt;br&gt;
指定如何在主机以及网络之间进行包传输&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP（互联网协议Internet Protocol)——帮助数据包从一台机器路由到另一台（选择路径）&lt;/li&gt;
&lt;li&gt;ICMP(互联网控制消息协议Internet Control Message Protocol)——帮助我们了解错误信息、调试信息等实时信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;链路层&lt;/strong&gt;&lt;br&gt;
指定了如何在物理硬件之间发送数据。例如，数据通过以太网、光纤等传输&lt;/p&gt;
&lt;p&gt;然后在我们深入探讨之前，聊一聊网络寻址。&lt;br&gt;
在我们发送数据包时，我们必须知道它寄给谁以及它来自哪里。我们的主机和其他主机使用MAC地址(Media Access Control)以及IP地址来进行识别&lt;/p&gt;
&lt;h5 id="网络寻址"&gt;网络寻址
&lt;/h5&gt;&lt;p&gt;&lt;strong&gt;MAC地址&lt;/strong&gt;&lt;br&gt;
MAC地址，硬件地址唯一标识符，不会发生改变。也就是对应着我们计算机的网卡设备。该网络适配器便可标识我们的计算机。一个以太网设备的MAC地址类似于&lt;code&gt;00:C4:B5:45:B2:43&lt;/code&gt;。而每个适配器都有一个OUI(organizationally unique identifier)标识符来标识制造商，一般可有MAC地址前三个字节用于表示&lt;br&gt;
例如 &lt;em&gt;戴尔&lt;/em&gt; 的MAC地址OUI为&lt;code&gt;00-14-22&lt;/code&gt;，因此戴尔的网络适配器的MAC地址可能类似：&lt;code&gt;00-14-22-34-B2-C2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IP地址&lt;/strong&gt;&lt;br&gt;
与硬件无关的用于识别网络设备的地址，会根据IPv4 IPv6而又有不同的语法描述。&lt;br&gt;
就假设IPv4，典型的地址是：&lt;code&gt;10.24.12.4&lt;/code&gt;。&lt;br&gt;
通常其用于网络的软件方面，任何连接到互联网的系统都会有一个IP地址，并且如果网络发生变化IP地址也会随之变化，并且在整个互联网中始终唯一（但是如果进行了NAT即网络地址转换）就可能导致多个设备通过一个公网IP进行共享上网从而在内部使用私有IP分配而对外映射为唯一的公网IP&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主机名&lt;/strong&gt;&lt;br&gt;
通过主机名，其获取你的IP地址，将地址与一个特定和易于理解的名称进行绑定（只需要记住域名）&lt;/p&gt;
&lt;h5 id="应用层-apllication-layer"&gt;应用层 Apllication Layer
&lt;/h5&gt;&lt;p&gt;假设我要给Sh1ori发送一个邮件，我们接下来分析一下TCP/IP 层会做什么&lt;br&gt;
记住这些packet包在传输的过程中要包含&lt;code&gt;header&lt;/code&gt;头 和一个&lt;code&gt;payload&lt;/code&gt; 有效数据&lt;br&gt;
header通常会告诉我们这个包从哪来，要到哪去。数据包在网络中传输，每一层都会在header上添加一些信息，我们称为frame&lt;br&gt;
我们在电子邮件客户端发送邮件时，应用层会对数据进行封装。而应用层通过指定的 &lt;strong&gt;端口&lt;/strong&gt; 与 &lt;strong&gt;传输层&lt;/strong&gt; 通信，然后再通过该端口进行数据发送，我们希望通过应用层的协议SMTP进行发送，该协议会打开到该端口的连接（比如SMTP使用25），然后哦通过端口接收数据后，这些数据被发送到 &lt;strong&gt;传输层&lt;/strong&gt; 进行封装为数据段&lt;/p&gt;
&lt;h5 id="传输层--transport-layer"&gt;传输层 Transport Layer
&lt;/h5&gt;&lt;p&gt;帮助我们将数据以网络可读的方式进行传输，它将数据分解成多个块并传输，按照正确顺序重新组合在一起，这些快会被称为段 segments，使得网络数据传输更方便容易，接下来讲传输层的概念&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ports 端口&lt;/strong&gt;，引出这个概念，我们虽然知道了远程的IP地址，但不足以让我们将数据发送到特定的进程或服务上。像HTTP的服务会使用端口作为通信通道。如过我们需要发送网页的数据，就通过HTTP端口（80）发送。除了形成数据，传输层同时将源地址和目标地址的端口都附加到了数据段上，这样双方都可以知道使用的端口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UDP&lt;/strong&gt; 并不可靠，现在也不常用，但确实在一些地方会进行使用，例如在媒体流传输中，即使丢失一些帧也没关系，因为这样可以更快地获取数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCP&lt;/strong&gt; 提供可靠的面向连接的数据流，使用端口和主机之间收发数据。应用程序会从主机的一个端口建立到另一个远程主机端口，对此我们掏出了三次握手协议来确保客户端和服务器能够进行一次正常通信连接
&lt;ul&gt;
&lt;li&gt;1 客户端（连接进程）发送SYN segment=1（同步标志位） 给服务器来请求一次连接并随机生成一个初始数据包序列号&lt;code&gt;seq=x&lt;/code&gt;含义：“服务器，我想与你连接，我的seq=x,能否听到我？”&lt;/li&gt;
&lt;li&gt;2 服务器-&amp;gt;客户端，回复一个&lt;code&gt;STN=1&lt;/code&gt;和&lt;code&gt;ACK=1&lt;/code&gt;的段，随机生成一个初始序列号&lt;code&gt;seq=y&lt;/code&gt;，并确认客户端的数据包序列号&lt;code&gt;ack=x+1&lt;/code&gt;（下一次从x+1开始）含义：“我可以听到！（此时ack=x+1），我的seq=y，可以与你进行连接，能否听到？”&lt;/li&gt;
&lt;li&gt;3 客户端-&amp;gt;服务器，发送一个&lt;code&gt;ACK=1&lt;/code&gt;的段，确认服务器序列号&lt;code&gt;ack=y+1&lt;/code&gt;，并且此时序列号为&lt;code&gt;seq=x+1&lt;/code&gt;（seq客客户端数据接着上一次开始发送）含义：“我还在！(此时ack=y+1）那么我们开始通信吧！”
或者可以看到表格
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;步骤&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;发送方&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;接收方&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;动作&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第一次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SYN (同步序号)&lt;/strong&gt;：A 发送一个 SYN 包到 B，并指明自己希望建立连接。A 进入 &lt;code&gt;SYN-SENT&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第二次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SYN-ACK (同步+确认)&lt;/strong&gt;：B 收到 SYN 后，发送 SYN-ACK 包。SYN 表示 B 同意建立连接；ACK 表示确认收到了 A 的 SYN。B 进入 &lt;code&gt;SYN-RECEIVED&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第三次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ACK (确认)&lt;/strong&gt;：A 收到 B 的 SYN-ACK 后，发送一个 ACK 包进行确认。A 进入 &lt;code&gt;ESTABLISHED&lt;/code&gt; 状态。B 收到 ACK 后，也进入 &lt;code&gt;ESTABLISHED&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过三次握手，数据可以有条理的进行交换并实现客户端和服务器的通信，并且消灭掉超时的连接，避免冗余的历史连接（如果只有两次握手就可能导致前一次历史的SYN=1的信号在发送失败后重新连网时再次发送给服务器接受导致识别为错误的失效历史连接）&lt;br&gt;
然后是四次挥手，其为TCP用来安全、可靠地终止连接的机制，由于 TCP 是全双工的（双方可独立发送和接收），关闭连接也必须分两次进行。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;步骤&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;发送方&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;接收方&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;动作&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第一次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FIN (终止)&lt;/strong&gt;：A 发送 FIN 包，表示 A 不再发送数据。A 进入 &lt;code&gt;FIN-WAIT-1&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第二次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ACK (确认)&lt;/strong&gt;：B 收到 FIN 后，发送 ACK 包确认收到。&lt;strong&gt;此时 B 仍可向 A 发送数据&lt;/strong&gt;。A 进入 &lt;code&gt;FIN-WAIT-2&lt;/code&gt; 状态；B 进入 &lt;code&gt;CLOSE-WAIT&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第三次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FIN (终止)&lt;/strong&gt;：B 发送完所有数据后，发送 FIN 包，表示 B 也不再发送数据。B 进入 &lt;code&gt;LAST-ACK&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第四次&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;客户端 A&lt;/td&gt;
&lt;td&gt;服务端 B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ACK (确认)&lt;/strong&gt;：A 收到 B 的 FIN 后，发送 ACK 包确认。A 进入 &lt;code&gt;TIME-WAIT&lt;/code&gt; 状态（等待 2MSL 时间后进入 &lt;code&gt;CLOSED&lt;/code&gt;）；B 收到 ACK 后立即进入 &lt;code&gt;CLOSED&lt;/code&gt; 状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id="网络层-network-layer"&gt;网络层 NetWork Layer
&lt;/h5&gt;&lt;p&gt;决定数据包从源到客户端的route, 数据包在同一网络中传输; 而互联网由许多网络组成，构成互联网的较小的网络被称为子网。所有子网以某种方式相互连接，因此我们可以上网进行网址访问。&lt;br&gt;
网络层中接受传输层的报文段并封装在IP数据包中，将源的IP地址和目标主机的IP地址附加到数据包的header中。最后数据包包含了目的地、来源信息，发送到链路层&lt;/p&gt;
&lt;h5 id="链路层-link-layer"&gt;链路层 Link Layer
&lt;/h5&gt;&lt;p&gt;TCP/IP模型的最底层。也是硬件特定的层，我们的数据包再次封装成frame，头部是源MAC地址和目标MAC地址，checksums校验值和分隔符来判定包的尾部&lt;br&gt;
幸运的是在一个网络上，我们的包不必传输很远。首先，链路层将我们源机的MAC地址放到frame头部，现在我们需要知道Sh1ori的MAC地址，嘶怎么知道呢？既然Sh1ori不在互联网上，我们如何找到他——ARP！&lt;br&gt;
&lt;strong&gt;ARP(Address Resolution Protocol)&lt;/strong&gt; 是用来解析查找与IP地址相关联的MAC地址的。ARP在同一网络内使用。如果Sh1ori跟我们不再同一网络上，我们会使用route系统来确定下一个可以接收到数据包的路由器。一旦进入到同一网络了我们就可以使用ARP解析。&lt;br&gt;
当我们处于同一网络中，系统首先使用ARP查找表, 表中存储了IP地址与MAC地址对应信息。如果表不存在就使用ARP。系统使用ARP协议向网络发送广播信息，以查找IP地址为xx.xx.x.x的主机。&lt;br&gt;
广播信息是一种特殊信息，会发送给网络上所有主机。而任何拥有所请求查找IP地址的机器便会恢复一个ARP包包含IP地址和MAC地址&lt;br&gt;
我们得到必要数据后，链路层通过网卡将该frame转发。 &lt;font color="#ff0000"&gt;但是！&lt;/font&gt;数据包不是跟我说的一样那么简单传输的，实际上我们没有到达Sh1ori的网络呢！在这个过程中，至少经过两次TCP/IP模型在任何数据送达或接收前。这个数据包经历的过程大概是这样的&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nan0in给Sh1ori发邮件，数据-&amp;gt;传输层&lt;/li&gt;
&lt;li&gt;传输层中数据封装到TCP/UDP中形成段，附加目标和源的TCP或UDP端口，段发到网络层&lt;/li&gt;
&lt;li&gt;网络层将数据封装到IP数据包中，附加源IP和目标IP, 路由到链路层&lt;/li&gt;
&lt;li&gt;数据包到达Nan0in硬件中封装成帧，对应IP也封装进去&lt;/li&gt;
&lt;li&gt;Sh1ori通过物理层接收该数据帧并检查数据完整性，解封帧内容，将IP数据包发到网络层&lt;/li&gt;
&lt;li&gt;网络层读取数据包，查找附加的源IP和目标IP, 检查是否与目标IP相同，相同则解封数据包，发送到传输层&lt;/li&gt;
&lt;li&gt;传输层解封数据段，检查TCP/IP端口，根据端口和应用层建立联系&lt;/li&gt;
&lt;li&gt;应用层从指定端口的传输层接收数据，然后呈现给Sh1ori&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="dhcp"&gt;DHCP
&lt;/h4&gt;&lt;p&gt;DHCP（Dynamic Host Configuration Protocol）动态主机配置协议 为我们的机器分配IP地址、子网掩码以及网关。可以联想一下手机号码和电话运营商的关系&lt;br&gt;
优势很多，网络管理员可以方便的分配IP地址并防止重复，每个物理网络都用对应DHCP服务器，方便主机申请IP地址，在常规家庭中则是路由器。目前来看DHCP获取所有动态主机信息的方式有&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DHCP DISCOVER——client通过广播信息来搜索DHCP服务器，&lt;/li&gt;
&lt;li&gt;DHCP OFFER——DHCP服务器回复信息。包括一个数据包：包含 DHCP 租用时间、子网掩码、IP 地址等信息。client收到后&lt;/li&gt;
&lt;li&gt;DHCP REQUEST ——客户端选择DHCP发出了另一个广播，让DHCP服务器知道它接受哪个提议&lt;/li&gt;
&lt;li&gt;DHCP ACK——服务器发送确认&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而DHCP服务器需要静态IP才能有效管理，可以处理DNS和网络数据。DHCP服务器可以有效地管理IP地址和相关信息，确保每台客户端获得唯一的IP和所有正确的网络信息
&lt;a class="link" href="https://network-guides.com/dhcp-protocol/" target="_blank" rel="noopener"
&gt;DHCP协议说明&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 id="subnetting-子网划分"&gt;Subnetting 子网划分
&lt;/h3&gt;&lt;p&gt;子网划分将网络划分为更小的子网，提高Linux网络性能和安全性。按照IP寻址的方案组织IP地址，防止冲突，高效利用地址范围。用&lt;code&gt;route -n&lt;/code&gt;可以查看路由表，而&lt;code&gt;route add -net xxx.xxx.xxx.x/xx gw yyy.yyy.yyy.y&lt;/code&gt;可以添加子网，将发送到xxx&amp;hellip; 网段的ip转发到静态路由网关&lt;/p&gt;
&lt;h3 id="ethernet--arprarp"&gt;Ethernet &amp;amp; arp/rarp
&lt;/h3&gt;&lt;p&gt;以太网（LAN local-area network） ARP（地址解析协议——将IP地址转换为MAC地址）RARP（反向ARP）&lt;br&gt;
通过这些协议，本地网络通信和地址解析得以实现&lt;br&gt;
&lt;em&gt;&lt;strong&gt;什么是DNS？&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
DNS，即Domain Name System，域名系统，就像互联网上的电话簿，它有以下的工作原理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人性化的域名&lt;/li&gt;
&lt;li&gt;机器可读地址——IPV4地址&lt;/li&gt;
&lt;li&gt;DNS翻译，后台会将域名自动转化为IP地址
Linux系统使用DNS &lt;code&gt;/etc/resolv.conf&lt;/code&gt;来配置DNS解析，使用&lt;code&gt;nslookup&lt;/code&gt; &lt;code&gt;dig&lt;/code&gt;命令进行查询DNS和排除网络连接问题，在我的arch linux上打开看到是像下面这样的&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nameserver 210.32.32.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nameserver 210.32.32.10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;search .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果在你的服务器上，nameserver是DNS服务商的IP（可以是你服务器自己的），domain是本地主机的域名，通过设置多个要尝试&lt;strong&gt;自动添加的域名后缀&lt;/strong&gt;，按顺序搜索直到找到有效结果。(search和domain是冲突的，不能同时使用)&lt;br&gt;
你可以用&lt;code&gt;dig&lt;/code&gt;命令来干一些有意思的事情&lt;br&gt;
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="Pasted%20image%2020250701002646.png"&gt;
&lt;img src="Pasted%20image%2020250701002646.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
我们用dig可以尝试找到网站的IP地址，上面这个就是我的博客网站; 我们也可以据此王爵到一些域名的托管位置、记录等等&lt;br&gt;
&lt;code&gt;dig -x&lt;/code&gt;可以挖掘出更多用惯特定IP的信息&lt;/p&gt;
&lt;h3 id="ip-routing"&gt;IP Routing
&lt;/h3&gt;&lt;p&gt;IP路由，设计配置路由表和网络路由以便在网络上转发数据包。而内核选择路由以方便将数据包发送到目的地。使用&lt;code&gt;ip&lt;/code&gt;命令进行配置。使用&lt;code&gt;ip route show&lt;/code&gt;我们可以显示所有内核已知路由来排除故障和管理&lt;br&gt;
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="Pasted%20image%2020250630235334.png"&gt;
&lt;img src="Pasted%20image%2020250630235334.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;这里有一个默认路由，通过网关地址via后的进行跳转。dev wlp0s20f3则是使用的无线网络接口。proto dhcp说明通过DHCP动态获得&lt;br&gt;
&lt;div class="post-img-view"&gt;
&lt;a data-fancybox="gallery" href="Pasted%20image%2020250630235617.png"&gt;
&lt;img src="Pasted%20image%2020250630235617.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
在linux上，我们可以通过设置路由连接到本地网络eth0上，例如&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;格式 ip route add &amp;lt;network&amp;gt;/&amp;lt;netmask&amp;gt; via &amp;lt;gateway&amp;gt; dev &amp;lt;interface&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ip route add 192.168.1.0/24 dev eth0 &lt;span class="c1"&gt;#将所有数据通过设备eth0发送到本地192...上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ip route add 192.168.2.0/24 via 192.168.2.254 dev eth0 &lt;span class="c1"&gt;#通过192.168.2.254网关为192.168.2.0/24网络路由流量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过Ping或者host命令我们可以确保可以访问到网关、互联网上的其他网站&lt;/p&gt;
&lt;h3 id="ssh"&gt;SSH
&lt;/h3&gt;&lt;p&gt;Secure Shell，想必不需要我们讲了，它提供点对点的安全远程访问、命令执行和通信。我们可以设置基本的ssh配置，也可以通过ssh密钥对进行身份验证管理; 例如通过&lt;code&gt;ssh git@111.229.23.145&lt;/code&gt;连接上我的服务器。&lt;br&gt;
&lt;code&gt;ssh username@server_IP&lt;/code&gt;是连接的基础方式&lt;/p&gt;
&lt;h3 id="file-transfer"&gt;File Transfer
&lt;/h3&gt;&lt;p&gt;Linux文件传输涉及在网络 系统之间复制或移动文件。命令行上支持使用FTP HTTP SCP NFS等协议。常用命令有&lt;code&gt;scp&lt;/code&gt; &lt;code&gt;rsync&lt;/code&gt;和&lt;code&gt;wget&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="shell-programing"&gt;shell programing
&lt;/h2&gt;&lt;p&gt;shell编程，通过脚本自动执行Linux中的管理任务、重复操作和系统监控。btw，我使用zsh。&lt;br&gt;
shell变成非常适合系统自动化&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/zsh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;就可以easily print your first &amp;ldquo;hello world&amp;quot;了&lt;br&gt;
可以试试这个&lt;a class="link" href="https://www.learnshell.org/" target="_blank" rel="noopener"
&gt;学习 Shell - 免费交互式 Shell 教程&lt;/a&gt;
&lt;span style="white-space: nowrap;"&gt;&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" /&gt;
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor"&gt;
&lt;/svg&gt;&lt;/span&gt;
&lt;/p&gt;</description></item></channel></rss>