使用 Linux 命令轻松构建数据库

大家好!我是大聪明-PLUS

数据库是许多应用程序的核心,从功能齐全的企业网站到购物清单和财务跟踪器等相对简单的工具,都离不开它。基于 SQL 的关系型数据库很流行,但在 Linux 系统上可以构建一个更简单、更透明的替代方案。

Linux 系统上可以构建哪些类型的数据库?

文本文件在 Linux 系统中占据主导地位。Linux 拥有完善的生态系统和许多强大的工具,可以轻松地合并文本文件,并通过操作文本文件实现各种功能。

具体来说,您可以构建数据库------一种结构化的信息源,可用于各种用途。通过使用文本文件和命令行工具,您可以创建简单的原型、快速验证数据,并像编写代码一样轻松地对数据进行版本控制。

可以使用哪些工具?

Linux 拥有许多实用命令,包括用于处理文本的命令。这些命令大多充当过滤器的角色,通过标准输入接收数据,对数据进行操作,并生成标准输出。

  • grep 提供输入搜索功能,允许您选择与一个或多个模式匹配的行。

  • cut 函数提取每一行选定的部分,并将其写入标准输出。

  • awk 是一种功能更强大的模式扫描和处理语言。

  • sort 函数 可以进行排序(正如你所预期的那样),但它也可以按特定列对数据进行排序,并能正确处理数字/字母排序。

  • 使用headtail命令 ,您可以从输出中提取指定的行片段。

  • join 支持位于多个文件中的相关数据。

您拥有 Linux 工具------如何使用它们创建和使用数据库?

在这个例子中,我们将创建一个简单的待办事项应用数据库。这类应用的所有基本功能都可以使用标准的 Linux 工具实现。此外,还可以使用脚本语言或将其迁移到关系型数据库来进一步扩展该应用的功能。

将表格创建为二维文件

最简单的结构化文本格式之一是DSV,即逗号分隔值。它是 CSV 格式(逗号分隔值)的更通用版本。Linux 下的结构化文本文件通常使用空格或冒号作为字段分隔符。一个经典的例子是文件 /etc/passwd

这种格式可用于存储各种数据,包括待办事项清单:

复制代码
`Buy milk:2024-10-21:2:open
Call bank:2024-10-20:1:closed`
复制代码
`echo "Take out the trash:$(date -I):3:open" > tasks`

以下是等效的 SQL 代码:

复制代码
INSERT` `INTO` tasks `VALUES`(`'Take out the trash'`, CURDATE(), `'3'`, `'open'`)`

请注意:此命令使用子命令获取当前日期。手动输入有点麻烦;用脚本自动执行会方便得多。

选择整个表格

数据选择或许是数据库操作中最常见的任务。最简单的选择是从表中选择所有信息,即:

复制代码
SELECT` `*` `FROM` tasks`

通过此命令,我们可以提取数据库中所有列,使其高度与所有行的高度相同。如果处理的是基于文件的数据库,则等效命令也很简单:

复制代码
`cat tasks`

使用 cut 选择列

更复杂的操作是将选择范围缩小到特定列。以下是在 SQL 中实现的方法:

复制代码
SELECT` task `FROM` tasks`

使用剪切工具,您可以实现几乎相同的功能:

复制代码
`cut -d':' -f1 tasks`

使用此选项,d我们可以指定分隔符------即文件中每行字段之间的分隔符。使用此选项,f我们可以选择特定字段。以下字符串显示了数据库中所有任务的列表:

使用 grep 或 awk 选择行

通常情况下,您不需要从数据库中检索所有行,而是需要以某种方式限制结果范围。在这种情况下,最常见的需求是按值筛选内容,如下例所示:

复制代码
SELECT` `*` `FROM` tasks `WHERE` status`=`open`

在这种情况下,grep 命令非常合适。使用此命令,您可以将字符串与以正则表达式指定的模式进行比较。例如,这样您就可以找到所有状态为"打开"的任务:

复制代码
`grep 'open$' tasks`

在这种情况下,我们利用了每行都以"status"字段结尾这一事实;$ 符号标记了行的结束。行中间的字段可能需要更复杂的正则表达式来处理。例如,以下是如何检索所有优先级为 2 的行:

复制代码
`grep ':2:[^:]*$' tasks`

但是 grep 只能匹配文本模式,无法处理像这样的更复杂的表达式:

复制代码
SELECT` status, task `FROM` tasks `WHERE` `date<2024-10-21

在这段 SQL 代码中,我们使用逻辑比较来检索特定日期之前创建的任务。我们可以尝试创建更复杂的正则表达式,但这可能会超出 grep 的处理能力。

在这种情况下,你需要像 awk 这样更高级的工具:

复制代码
`awk -F':' '$2<"2024-10-21" {print $1 ":" $2 }' tasks`

Awk 可以同时处理 grep 和 cut 任务。在这个例子中,部分

复制代码
`$2<"2024-10-21"`

这是一个前提条件,意味着只有日期较早的值才符合模式。之后,该命令将显示每一行的前两列。

使用头尾对结果进行分页

SQL 语言提供了一个运算符LIMIT,允许您从结果中选择特定数量的元素。以下是如何选择前两行:

复制代码
`head -2 tasks`

使用方括号 [ ]tail可以获取最后 n 行。与方括号 [ ] 结合使用时head,可以重现方括号 [ ] 运算符的功能LIMIT,包括移位。例如,以下是如何获取第 2 行到第 3 行的方法:

复制代码
`head -3 tasks | tail -2`

使用 sort 对字符串进行排序

运算符在许多 SQL 命令中扮演着关键角色ORDER BY。幸运的是,Linux 有一个功能强大的等效命令sort。与 `& cut` 和 `& ` 类似awk,您可以使用 `&` 指定分隔符和字段编号,尽管标志对应的字母不同。这次t,`&` 是分隔符,`&`k是字段编号:

复制代码
`sort -t':' -k2 tasks`

接下来,将显示所有字段,并按日期排序:

使用连接合并表

关系型数据库的本质是描述不同表之间的关系,其中一个表的字段引用另一个表的字段。你可能之前不知道,Linux 有一个JOIN与 SQL 运算符等效的命令------不出所料,它叫做join

让我们扩展待办事项列表数据,使其能够跟踪多个用户的任务。首先,让我们在原始待办事项文件中添加一个名为"名称"的新列,使数据如下所示:

然后,我们将创建一个人员文件,用于存储我们正在考虑的每位人员的任务数据:

现在您可以使用带分隔符的命令join,分隔符通过选项指定t

复制代码
`join -t':' -1 5 -2 1 tasks people`

使用 -1 和 -2 选项,我们可以指定要合并的每个文件中的字段编号。这里,我们分别指的是第一个和第五个字段。该命令join默认使用第一个字段,因此代码可以简化为:

复制代码
`join -t':' -1 5 tasks people`

结果如下:

为了使输出结果更简洁,你可以对连接的表进行管道化处理。这样就可以修剪和省略字段name

复制代码
`join -t':' -1 5 tasks people | cut -d':' -f2-`

此外,还可以使用以下方法将两个名称合并为一个名称awk

复制代码
`join -t':' -1 5 tasks people | awk -F':' '{print $2":"$3":"$4":"$5":"$6" "$7}'`

总而言之

最后,我们来看一个更复杂的 SQL 表达式。这个表达式连接两个表以获取姓名,并选择特定列和具有特定优先级的行。然后,它按日期排序,并仅选择第一个匹配的行:

复制代码
SELECT` task,`date`,priority,status,first_name,last_name
`FROM` tasks t
LEFT `JOIN` people p `ON` t`.name=`p`.name`
`WHERE` priority`=2`
`ORDER` `BY` `date`
`LIMIT` `1

等效的命令管道可能稍微难懂一些,但如果您熟悉以下关键工具,就不难理解了:

复制代码
`join -t':' -1 5 -2 1 tasks people \
  | awk -F':' '{print $2":"$3":"$4":"$5":"$6" "$7}' \
  | grep ':2:' \
  | sort -t ':' -k2 \
  | head -1`
相关推荐
一个平凡而乐于分享的小比特2 小时前
核心原理:文件系统 vs 归档格式
linux·文件系统·归档格式
鸠摩智首席音效师2 小时前
如何在 Linux 中使用 fallocate 命令 ?
linux·运维·服务器
秋深枫叶红2 小时前
嵌入式第四十三篇——数据库
linux·数据库·学习·oracle
淡忘_cx2 小时前
Ubuntu 24 飞牛虚拟机 ens2 网卡自动获取 IP(DHCP)配置文档
linux·tcp/ip·ubuntu
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之split命令(实操篇)
linux·运维·服务器·网络·笔记
musk12122 小时前
在 Win11 PowerShell 中通过 SSH 密钥实现无密码访问 Linux 服务器,公钥使用 方法2 手动复制
linux·ssh·win11
松涛和鸣2 小时前
42、SQLite3 :字典入库与数据查询
linux·前端·网络·数据库·udp·sqlite
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之rcp命令(实操篇)
linux·服务器·网络·chrome·笔记
Tipriest_2 小时前
Linux 下开发 C/C++ 程序为什么头文件引用路径这么多和复杂
linux·c语言·c++