BNU-FZH

fengzhenhua@outlook.com

对于解析函数,可以将其Taylor展开为: \[\begin{equation}\label{eq:taylor} f(x_{i+1})=f(x_i)+f'(x_i)h+\frac{f''(x_i)}{2}h^2+\cdots \end{equation}\] 现在据式\(\eqref{eq:taylor}\)来计算多阶导数,取近似到二阶项,则一阶导数为 \[\begin{equation}\label{eq:taylor1} f'(x_i)=\frac{f(x_{i+1})-f(x_i)}{h}+O(h) \end{equation}\] 将式\(\eqref{eq:taylor1}\)中的函数\(f\)替换为相应的导数\(f'\)得二阶导数,然后出现的一阶导数使用式\(\eqref{eq:taylor1}\)替换,从而得到二阶导数用零阶导数表达的算式 \[\begin{equation}\label{eq:taylor2} f''(x_i)=-\frac{f(x_{i+2})-2f(x_{i+1})+f(x_i)}{h^{2}}+O(h) \end{equation}\] 按前述方法可以求出任意阶导数使用零阶导数表达的算式,于是可以将式\(\eqref{eq:taylor}\)取更多的项以提高其导数\(f'(x_i)\)的精度,比如取到二阶项 \[\begin{equation}\label{eq:taylor3} f'(x_i)=\frac{f(x_{i+1})-f(x_i)}{h}-\frac{f(x_{i+2})-2f(x_{i+1})+f(x_i)}{2h^{2}}h+O(h^2) \end{equation}\] 化简式\(\eqref{eq:taylor3}\)\[\begin{equation}\label{eq:taylor4} f'(x_i)=\frac{-f(x_{i+2})+4f(x_{i+1})-3f(x_i)}{2h}+O(h^2) \end{equation}\]

tar的选项参数

1
2
3
4
5
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

1
2
3
4
5
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

--delete从存档中删除 注意是两个减号。

下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

举例说明

  1. 压缩一个目录

    1
    eg:  tar -cvzf test.tar.gz  tar  #压缩当前目录下的tar目录,压缩包的名字叫test.tar.gz

  2. 压缩其中某一类型的文件

    1
    eg:  tar -cvzf test.tar.gz  ./*.c #压缩当前目录下的.c为后缀的文件。但是不能压缩以.开头的文件

  3. 查看一个压缩文件的内容

    1
    eg: tar -tvf test.tar.gz   #查看当前目录下test.tar.gz压缩文件中的文件

  4. 解压一个文件

    1
    eg.  tar -xvzf test.tar.gz #解压test.tar.gz到当前目录下面

  5. 文件夹做一个归档文件、备份一个目录、

    1
    eg: tar -cvf test.tar tar #将tar文件夹下的文件生成一个test.tar归档文件

  6. 将某一类型的文件做成归档文件、备份某一类型的文件

    1
    eg:tar -cvf test.tar ./tar/*.c   # 将tar文件夹下所有以.c结尾的文件放到test.tar 文件中,但是以.开头的文件不行

  7. 向归档文件中添加一个文件夹

    1
    eg: tar -rf test.tar  ./test1  #将test1文件夹中的所有文件,添加到test.tar 归档文件中

  8. 删除归档文件中的文件

    1
    eg: tar -f test.tar --delete a.c  #删除test.tar文件中的 a.c文件

  9. 删除归档文件中的某一类的文件

    1
    eg: tar -f test.tar --delete *.c  #删除test.tar文件中的 以.c结尾的文件

  10. 释放归档文件

    1
    eg:  tar  -xvf  test.tar  #释放test.tar归档文件中的内容到 当前目录下

  11. 查看归档文件中的内容

    1
    eg: tar -tvf test.tar 

总结

格式与解压命令
1
2
3
4
5
6
7
8
9
1、*.tar           用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2 用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
使用举例
1
2
3
4
tar cvf  etcbak.tar etc/      打包一个tar
tar xvf etcbak.tar 解开一个tar
tar cvzf etcbak.tar.gz etc/ 打包压缩一个 tar
tar zxvf etcbak.tar.gz 解压一个tar

LaTeX排版系统主要有CTeX套装TeXLive, 然而我们建议大家尽量使用TeXLive, 原因是:

CTeX套装

CTeX套装是科学院吴凌云研究员的个人作品。在 CTeX套装刚刚问世之时,因其解决了繁琐的中文字体安装工作,所以广受欢迎。但是,一方面 CTeX套装已经很久不更新,内里的宏包、工具陈旧;另一方面,随着 XeLaTeX 的发展,以及 xeCJK 等技术的成熟,上述这些繁琐的工作已经没有必要而失去意义;因此,.

CTeX宏集

虽然它的名字也是「CTeX」,但是 CTeX 宏集和 CTeX 套装是两个不同的东西。CTeX 宏集是集成了中文支持、操作系统判定、字体选择、版式预设为一体的一组宏包和文档类的合集。我们推荐在任何情况下,优先使用 CTeX 宏集处理中文。

TeXLive

TeXLiveTUG (TeX User Group) 维护和发布的 TeX 系统,可说是「官方」的 TeX 系统。我们推荐任何阶段的 TeX 用户,都尽可能使用 TeXLive,以保持在跨操作系统平台、跨用户的一致性。TeXLive 的官方站点是 https://tug.org/texlive/.

归纳总结

  • 不要安装和使用 CTeX 套装!
  • 请在任何情况下优先使用 CTeX 宏集在 LaTeX 中处理中文!
  • 具体安装配置请参考:ArchLinux安装指南

简介

Includes styles for American Physical Society, American Institute of Physics, and Optical Society of America. The distribution consists of the RevTeX class itself, and several support packages.

文献引用显示和隐藏脚注

在使用revtex4编写论文时,发现所有的footnote都会在引用文献中出现,调用其说明文档revtex4.pdf后发现其使用规则并没有详细介绍。于是经过一翻查找得到设置方法:即使用选项footinbib实现在参考文献列表中出现footnote的内容,使用选项nofootinbib则不在参考文献中出现footnote. 即

1
2
\documentclass[footinbib]{revtex4}   %默认启用此选项
\documentclass[nofootinbib]{revtex4} %关闭需手动设置

参考文章

本来我的Outlook邮箱是相当纯净的,但是最近总是收到Start Daily的邮件,有点不能接受。研究后发现解决方法:

  • 登录网页版的Outlook邮箱:Outlook登录
  • 点击右上角您的头象,然后选择我的Microsoft帐户
  • 在左侧点击第二项您的信息
  • 在右侧向下滚动,找到帐户信息, 再点击通信首选项
  • 将所有的订阅取消,然后点击应用,Outlook得归清静。

插件vim-vsnip自带了相当数量的补全插件,但是一般都是通用的片段,对于编写自己常用的文件还需要自定义片段。本文记录自定义片段的具体过程。

安装插件

~/.config/nvim/lua/lazy-init.lua
1
2
3
4
5
6
7
require("lazy").setup({
...
'hrsh7th/cmp-vsnip' ,
'hrsh7th/vim-vsnip' ,
'rafamadriz/friendly-snippets' ,
...
})

编辑片段

这里可以使用命令VsnipOpen, 或者直接编辑~/.vsnip/markdown.json就可以直接添加markdown相应的片段。在编写过程中,为了适应Next博客主题输入数学公式的需要,需要输入$$, 但是这个片段是错误的,因为默认$是变量的符号,于是转义,片段的转义符号为\\, 于是得相应片段为:

~/.vsnip/markdown.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
{
"math-sup": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["^{"],
"body": [
"^{$1}<++>"
],
"description": "math formular"
},
"math-sub": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["_{"],
"body": [
"_{$1}<++>"
],
"description": "math formular"
},
"math-dkuohao": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["{"],
"body": [
"{$1}<++>"
],
"description": "math formular"
},
"math-fkuohao": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["["],
"body": [
"[$1]<++>"
],
"description": "math formular"
},
"math-ykuohao": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["("],
"body": [
"($1)<++>"
],
"description": "math formular"
},
"math-sqrt": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["sqrt"],
"body": [
"\\sqrt{$1}<++>"
],
"description": "math formular"
},
"math-frac": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["frac"],
"body": [
"\\frac{$1}{<++>}<++>"
],
"description": "math formular"
},
"math-tag": {
"prefix": ["tag"],
"body": [
"\\$\\tag{$1}\\label{tag<++>}\\$<++>"
],
"description": "math referance"
},
"math-eqref": {
"prefix": ["eqref"],
"body": [
"\\$\\eqref{eq:$1}\\$<++>"
],
"description": "math referance"
},
"math-label": {
"prefix": ["eqlabel"],
"body": [
"\\label{eq:$1}<++>"
],
"description": "math labels"
},
"math-multi2": {
"prefix": ["align"],
"body": [
"\\$\\$\\begin{align}",
"$1",
"\\end{align}\\$\\$<++>"
],
"description": "Multi-line Equations"
},
"math-multi1": {
"prefix": ["mequation"],
"body": [
"\\$\\$\\begin{equation}\\label{eq:$1}",
"\\begin{aligned}",
"<++>",
"\\end{aligned}",
"\\end{equation}\\$\\$<++>"
],
"description": "Multi-line Equations"
},
"math-simple": {
"prefix": ["equation"],
"body": [
"\\$\\$\\begin{equation}\\label{eq:$1}",
"<++>",
"\\end{equation}\\$\\$<++>"
],
"description": "Simple Equation"
},
"LinkGrid": {
"prefix": ["linkgrid"],
"body": [
"{% linkgrid %}",
" $1 | https://<+url+> | <+description+> | /Picture/<++>",
"{% endlinkgrid %}"
],
"description": "For diary.sh write"
},
"button": {
"prefix": ["button"],
"body": [
"{% button https://<+url+>, $1 %}"
],
"description": "For diary.sh write"
},
"fold": {
"prefix": ["fold"],
"body": [
"<details><summary>$1</summary>",
"<+contents+>",
"</details>"
],
"description": "For diary.sh write"
},
"more": {
"prefix": ["more"],
"body": [
"<!-- more -->"
],
"description": "For diary.sh write"
},
"arrow": {
"prefix": ["arrow"],
"body": [
"${1|&rarr;,&uarr;,&darr;,&larr;,&harr;|}"
]
},
"picture": {
"prefix": ["picture"],
"body": [
"![$1](/Picture/<+pic+> \"<+title+>\")<++>"
]
},
"centertext": {
"prefix": ["center"],
"body": [
"{% cq %}",
"$1",
"{% endcq %}",
"<++>"
]
},
"textcolor": {
"prefix": ["color"],
"body": [
"<label style=\"color:${1|red,yellow,blue,cyan,gold,green,gray,orange|}\"><++></label><++>"
]
},
"underline": {
"prefix": ["underline"],
"body": [
"<u>$1</u><++>"
]
},
"sub": {
"prefix": ["__"],
"body": [
"<sub>$1</sub><++>"
]
},
"sup": {
"prefix": ["^^"],
"body": [
"<sup>$1</sup><++>"
]
},
"href": {
"prefix": ["ref"],
"body": [
"[$1](/<+year+>/<+month+>/<+day+>/<+article+>)"
],
"description": "Ref the article of my blog"
},
"hurl": {
"prefix": ["url"],
"body": [
"[$1](<+url+>)<++>"
]
},
"delete": {
"prefix": ["delete"],
"body": [
"~~$1~~"
]
},
"code": {
"prefix": ["code"],
"body": [
"{% code <+title+> lang:${1|sh,python,lua,perl,yaml,ruby|} %}",
"<+code+>",
"{% endcode %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"codeblock": {
"prefix": ["codeblock"],
"body": [
"{% codeblock <+title+> lang:${1|sh,python,lua,perl,yaml,ruby|} %}",
"<+code+>",
"{% endcodeblock %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"```": {
"prefix": ["```"],
"body": [
"```${1|sh,python,lua,perl,yaml,ruby|} <+title+> ",
"<+code+>",
"```",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"note": {
"prefix": ["note"],
"body": [
"{% note ${1|default,primary,success,info,warning,danger|} %}",
"<++>",
"{% endnote %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"tabs": {
"prefix": ["tabs"],
"body": [
"{% tabs ${1:<+UniqueName+>} %}",
"<!-- tab ${2:<+tabcaption+>} -->",
"<++>",
"<!-- endtab -->",
"<++>",
"{% endtabs %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"tab": {
"prefix": ["tab"],
"body": [
"<!-- tab ${2:<+tabcaption+>} -->",
"<++>",
"<!-- endtab -->",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"label": {
"prefix": ["label"],
"body": [
"{% label ${1|default,primary,success,info,warning,danger|}@${2:<+content+>} %}<++>"
],
"description": "Next theme environment for Hexo"
},
"centerquote": {
"prefix": ["centerquote"],
"body": [
"{% centerquote %}",
"${1:<+content+>}",
"{% endcenterquote %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"video": {
"prefix": ["video"],
"body": [
"{% video ${1|/Video/<++>,https://<+website+>|}%}<++>"
],
"description": "Next theme environment for Hexo"
},

"pdf": {
"prefix": ["pdf"],
"body": [
"{% pdf ${1|/PDF/<++>.pdf,https://<+website+>|}%}<++>"
],
"description": "Next theme environment for Hexo"
},
"grouppicture": {
"prefix": ["grouppicture"],
"body": [
"{% grouppicture ${1:<+number+>}-${2:<+layout+>} }%}",
"![${3:<+picturetitle+>}](${4:<+picture+>})",
"{% endgroudpicture %}",
"<++>"
],
"description": "Next theme environment for Hexo"
}
}

参考资料

inix 是一个用于获取 Linux 系统信息的终端命令。能够获取软件和硬件的详细信息,比如计算机型号、内核版本、发行版号以及桌面环境等信息,甚至可以读取主存模块占用主板的哪块 RAM 卡槽等详细信息。

inxi 还可以用于监控系统中正在消耗 CPU 或者内存资源的进程。

在本文中,我将展示使用 inxi 命令获取系统信息的常用操作。

首先,我将展示下如何安装 inxi 命令。

在 Linux 上安装 inxi

inxi 是一个非常流行的工具,所以在大多数 Linux 发行版仓库中都可以轻松获取到该工具。不过还没有流行到各大 Linux 发行版默认就安装了该软件,所以需要我们自己安装一下。

在 Ubuntu/Debian 发行版系统中,安装命令:

1
sudo apt install inxi

在 Fedora/RHEL8-based 等发行版中,安装命令:

1
2
sudo dnf install -y epel-release
sudo dnf install -y inxi

在 Arch Linux 以及它的派生分支版本中,安装命令:

1
sudo pacman -S inxi

使用 inxi 获取系统信息

你可以在终端运行 inxi 命令来总体浏览下系统信息。

1
inxi

如下图所示,运行 inxi 命令可以简要浏览 CPU、时钟频率(speed/min/max)、内核(Kernel)、内存(Mem)、磁盘存储空间(Storage)、运行进程数量(Procs)以及 Shell 等信息。

The default output of inxi command

使用 -b 参数可以获取更为详细的系统信息。-b 参数会读取更多有关 CPU、驱动器、当前运行进程、主板 UEFI 版本、GPU、显示分辨率以及网络设备等详细信息。

1
inxi -b
Detailed hardware and software information about machine as reported by inxi

类似 -b 参数使用方法,inxi 还有许多其他的参数可供使用。你可以综合使用这些参数来获取你关心的信息。

让我们看几个实例。

获取音频设备信息

使用 -A 参数可以获取有关音频(输出)设备信息,包括物理音频(输出)设备、声音服务器以及音频驱动等详细信息。

1
inxi -A
Output of inxi command when “-A” flag is used

获取电池信息

使用 -B 参数,可以获取有关电池的信息(如果安装了电池)。你将读取到例如以 Wh(瓦特小时)为单位的当前电池电量和状况。

因为我使用的是台式机,所以这里仅仅作为一个示例,让我们看看使用 inxi -B 会输出什么。

1
Battery:   ID-1: BAT0 charge: 50.0 Wh (100.0%) condition: 50.0/50.0

获取 CPU 信息

-C 参数用于获取有关 CPU 的详细信息。比如包括 CPU 缓存大小、频率(单位 MHz,如果有多核,会显示每个核心的频率)、核心数、CPU 型号以及 CPU 是 32 位还是 64 位。

1
inxi -C
Detailed CPU information displayed by inxi

注意,如果是在虚拟机中使用 inix -Cinxi 读取到的 CPU 的最大和最小频率可能异常。下面是一个在四核 Debian 11 虚拟机中使用 -C 参数的示例输出。

An example output of using the “-C” flag in a Virtual Machine

获取更多的系统信息

使用 -F 参数可以获取更详细的系统信息(类似 -b 参数,但会更为详细)。几乎囊括了所有层次的系统信息。

1
inxi -F

获取图形显示相关信息

-G 参数可以获取和图形相关的信息。

它会显示所有的图形设备(GPU)、正在使用的 GPU 驱动(有助于检查是否使用 Nvidia 驱动还是 nouveau 驱动)、显示输出分辨率和驱动程序版本。

1
inxi -G

获取运行进程信息

-I 参数(大写字母 i)显示正在运行的进程、当前 shell 、内存(内存使用情况)以及 inxi 版本号等信息。

inxi get running process info

获取内存信息

可能你已经猜到了,-m 参数可以获取与内存相关的信息。

它读取了如总可用内存、最大内存容量(硬件或 CPU 支持的)、主板物理内存插槽数、是否存在 ECC、插入的内存插槽,以及枚举每个插槽中运行的内存模块的大小和运行速度等信息。

1
inxi -m

要使用 -m 参数获取更详细的信息,例如最大容量、每个插槽的内存模块信息等,需要超级用户权限。

1
sudo inxi -m

如果只是希望简短的输出内存信息,可以使用 -memory-short 参数。

使用 -memroy-short 参数将会只显示总内存以及当前已使用的内存量。

查看正在使用的包存储库

当使用 -r 参数时,会列举当前正在使用的包管理仓库或者更新本地仓库缓存中的所有存储库列表。

List of repositories in use

获取 RAID 设备信息

-R 参数用于获取所有 RAID 设备相关信息。

令人惊喜的是,它甚至显示了有关 ZFS RAID(默认情况下,多数 Linux 系统不包含该文件系统)的信息。它显示了 RAID 设备上文件系统的详细信息、状态(包含离线状态、总大小和可用大小等)。

1
inxi -R

在 Linux 终端中查询天气(对,这是可以的)

利用 -W 参数,你可以查询地球上任何地方的天气情况。

-W 参数后面,需要携带以下中的任一一个体现位置的信息

  • 邮政编码
  • 纬度
  • 城市(及州)、国家(不能含有空格,使用 “+” 替换空格)
1
inxi -W Baroda,India
Use of the “-W” flag with inxi followed by the city,country location descriptor

监控系统资源使用情况

inxi 除了提供有关已安装的硬件和驱动的信息外,还可以用于资源监控。

使用 -t 参数可以显示进程信息。你还可以可选项 -c (用于 CPU)和 -m(用于内存)。这些选项结合使用可以按指定数量列出进程信息。

下面是一些使用 -t 参数监控资源信息的示例。

1
inxi -t

命令 inxi -t 默认效果等同于 inxi -t cm5 的效果。

No difference in output of “inti -t” and “inxi -t cm5”
1
inxi -t cm10

偶尔需要监控资源使用情况时,该工具挺管用。如果需要更多的资源监控功能,则推荐使用 专用系统资源监控工具

总结

对于需要诊断计算机问题以及获取那些并不熟悉的软硬件信息的人来说,inxi 工具是十分便利且有用的。它能识别那些消耗 CPU、内存的进程;可以检查是否安装了合适的图形驱动程序、主板 UEFI/BIOS 是否需要更新等等。

事实上,在 inxi 开源社区论坛上,我们要求那些寻求帮助的成员提供 inxi 命令输出内容以便判断他们当前正在使用什么样的系统环境。

我知道也有其他的工具可以读取 Linux 上的硬件信息,不过 inxi 同时能读取硬件和软件信息,这也是我喜欢它的地方所在。

在日常Shell脚本的编写过程中,经常遇到判断文件或文件夹是否存在的问题,有时候也需要判断文件的新旧,所以本文罗列出Shell对文件的相关判断方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]

应用举例

文件夹不存在则创建

1
2
3
4
5
if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi

文件存在则删除

1
2
3
4
5
if [ ! -f "/data/filename" ];then
echo "文件不存在"
else
rm -f /data/filename
fi

判断文件夹是否存在

1
2
3
4
5
if [ -d "/data/" ];then
echo "文件夹存在"
else
echo "文件夹不存在"
fi

判断文件是否存在

1
2
3
4
5
if [ -f "/data/filename" ];then
echo "文件存在"
else
echo "文件不存在"
fi

先创建一个测试文件testfile, 如下

testfile
1
2
3
4
5
6
7
8
9
10
$ cat testfile #查看testfile 中的内容  
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki

数据的搜寻并显示

搜索 testfile 有 oo 关键字的行:
1
2
3
$ nl testfile | sed -n '/oo/p'
5 Google
7 Runoob

数据的搜寻并删除

删除 testfile 所有包含 oo 的行,其他行输出
1
2
3
4
5
6
7
8
$ nl testfile | sed  '/oo/d'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test
6 Taobao
8 Tesetfile
9 Wiki

数据的搜寻并执行命令

搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo 替换为 kk,再输出这行:

1
2
$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'  
5 Gkkgle

参考资料

前几天配置好的新电脑后,逐步完成ArchLinux的使用细节配置,但是在使用paru安装软件时会出现一个提示:

1
错误:选项节 [options] 中有未知的选项 'FileManager'

这源自于paru的配置文件/etc/paru.conf中出现了错误,即将[bin]前的注释去掉,即修改为:

/etc/paru.conf
1
2
3
4
# Binary OPTIONS
#
[bin]
FileManager = vifm

注意:在之前的配置中我的[bin]是被注释掉的,但是能正常工作,或许是升级后作者修复了这个bug,因些需要严格的启动这个选项。