快捷链接
在 Linux 中我可以构建哪种数据库?
我将使用哪些工具?
如何使用 Linux 工具创建和使用数据库
数据库是许多应用程序的核心部分,从成熟的企业网站到诸如购物清单和财务跟踪器之类的简单工具。由 SQL 驱动的关系数据库很受欢迎,但 Linux 提供了一种更简单、更透明的替代方案。
在 Linux 中我可以构建哪种数据库?
在 Linux 中,文本文件占据主导地位。有许多强大的工具和鼓励将它们链接在一起的生态系统,您可以通过纯文本文件实现很多功能。
这包括构建数据库,它是一组有结构的数据,您能将其用于多种目的。使用文本文件和命令行工具,您可以创建简单的原型,快速检查数据,并像对任何代码一样轻松地对数据进行版本控制。
我将使用哪些工具?
有许多有用的 Linux 命令,其中许多都与文本一起使用。这些命令中的许多都是过滤器,通过标准输入接收数据,执行某些操作,并产生标准输出。
- grep搜索输入并选择与一个或多个模式匹配的行。
- cut提取每行的选定部分并将其写入标准输出。
- awk是一种更强大的模式扫描和处理语言。
- sort正如您所期望的那样来排序,但它可以对特定列进行排序,并正确处理数字/字母排序。
- headtail允许您从输出中提取行的切片。
- join支持多个文件中的相关数据。
如何使用 Linux 工具创建和使用数据库
在此示例中,您将为待办事项应用程序构建一个简单的数据库。您可以使用标准的 Linux 工具构建所有基本功能。最终,您可以通过使用脚本语言或迁移到关系数据库来扩展应用程序。
把表创建为平面文件
最简单的结构化文本格式之一是DSV,即分隔符分隔的值。这是 CSV(逗号分隔值)格式的一般情况。在 Linux 中,结构化文本文件通常使用空格或冒号(:)字符分隔字段。/etc/passwd 文件是一个经典示例:
您能够用这种格式存储多种数据,比如待办事项列表:
买牛奶:2024-10-21:2:open
打电话给银行:2024-10-20:1:closed
您可以使用任何文本编辑器更新您的数据库,这是纯文本格式的另一个优点。您甚至可以通过将 echo 的输出重定向到文件直接从命令行添加项目:
echo "倒垃圾:$(date -I):3:open" > tasks
这相当于 SQL:
向 tasks 插入值( '倒垃圾', 当前日期函数(), '3', '打开')
请注意,此命令使用子命令获取当前日期。如果您手动输入,这有点麻烦,但在脚本中会方便得多。
获取整个表
选择数据可能是最常见的数据库任务。基本情况是从表中选择所有内容,即
选择 * 从 tasks
这将从数据库的每一行获取所有列。对于基于文件的数据库,等效操作很简单:
cat tasks
使用 cut 选择列
再复杂一点,您可以将选择范围缩小到特定的列。在 SQL 中,如下所示:
选择 task 从 tasks
使用 cut 工具,您可以实现几乎相同的功能:
cut -d ':' -f1 tasks
d 选项指定分隔符,即文件每行中分隔字段的字符。f 选项让您选择特定的字段。这将为您提供数据库中所有任务的简单列表:
使用 grep 或 awk 选择行
通常您不会从数据库中获取每一行,而是希望限制结果。基于字段值进行筛选是最为明显的需求,比如:
选择 * 从 tasks 其中 状态= 打开
在这种情况下,grep 是完美的替代品。使用它通过正则表达式模式匹配行,例如,您可以找到每个状态为“打开”的任务:
grep '打开$' tasks
此特定情况利用了状态处于每行的最后一个字段这一事实;$ 用于匹配字符串的结尾。
选择 状态, 任务 从 tasks 其中 日期 < 2024 -10 -21
此 SQL 使用逻辑比较来获取特定日期之前的任务。您可以尝试构建更复杂的正则表达式,但这开始超出 grep 的能力。
您需要的是更强大的工具,如 awk:
awk -F ':' '$2<"2024-10-21" {print $1 ":" $2 }' tasks
Awk 可以完成 grep 和 cut 的工作。在此示例中,读取的部分
$2< "2024-10-21"
是一个前提条件,意味着只有具有更早日期的行才会匹配。然后,该命令打印每行的前两列。
Paginate Results With tail and head
SQL 的 LIMIT 子句允许您获取特定数量的结果。要获取前两行:
head -2 tasks
您可以使用 tail 获取最后 n 行。与 head 一起,这允许您近似 LIMIT 子句以包括偏移量。例如,要获取第 2 - 3 行:
head -3 tasks | tail -2
Sort Rows With sort
“ORDER BY”子句是许多 SQL 语句的重要部分。幸运的是,Linux 有一个很棒的等效命令:sort。与 cut 和 awk 一样,您可以按数字指定分隔符和字段,尽管标志使用不同的字母。这次,t 指定分隔符,k 指定字段编号:
sort -t ':' -k2 tasks
这将显示按日期排序的所有记录:
Join Tables With join
关系数据库都是关于不同表之间的关系,其中一个表中的字段引用另一个表中的字段。您可能没有意识到,但 Linux 有一个与 SQL 的 JOIN 子句等效的命令,不出所料,称为 join。
让我们扩展待办事项数据,以满足几个人的任务需求。
并且创建一个文件,用于存储我们将为其存储任务的每个人的详细信息
您现在可以使用通过 t 选项指定分隔符的连接命令
join -t ':' -1 5 -2 1 tasks people
-1 和 -2 选项分别指定了每个文件中要连接的字段编号。在此,它们分别是第 5 个和第 1 个字段。join 默认为使用第一个字段,所以您可以将其简化为
join -t ':' -1 5 tasks people
并且它将产生:
为了稍微清理输出,您可以将连接的表通过管道传给 cut 并省略名称字段
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 优先级为 2
ORDER BY 日期排序
LIMIT 1
等效的命令管道或许理解起来更有难度,但只要您熟悉了这些核心工具,就没那么复杂了
join -t':' -1 5 -2 1 任务 人员
| awk -F':''{print $2":"$3":"$4":"$5":"$6" "$7}'
| grep ':2:'
| sort -t ':' -k2
| head -1 (取第一个)
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/52246.html