使用新的替代工具来改进旧的命令行工具。
在日常使用Linux/Unix系统时,我们需要使用很多命令行工具来完成工作,以及了解和管理我们的系统,比如使用du来监控磁盘利用率和top来显示系统资源。有些工具历史悠久。例如,top于1984年首次上映,而du则于1971年首次亮相。
这些年来,这些工具已经被现代化,移植到不同的系统中,但总的来说,它们仍然保留着最初的想法、外观和感觉。
这些工具非常优秀,对于许多系统管理员的工作流程来说至关重要。然而,近年来,开源社区开发了许多更有利的替代工具。虽然有些工具华而不实,但其他工具大大提高了它们的实用性,成为现代系统的绝佳选择。在本文中,我将介绍标准Linux命令行工具的五种替代方案。
du的替代:ncdu
工具NCurses DiskUsage (ncdu)提供了与du相似的结果,但是它基于NCurses的交互界面可以显示消耗大部分磁盘空间的目录。
首先,Ncdu需要花一些时间分析磁盘,然后按照最常用的顺序显示目录或文件,如下所示:
ncdu 1.14.2 ~使用箭头键导航,按?寻求帮助
-/home/gerardi-
96.7 GiB[# # # # # # # # # # #]/libvirt
33.9 GiB [### ] /。循环冗余码校验
7.0 GiB[]/项目。4.7 GiB[]/下载。3.9 GiB [ ] /。当地的
2.5 GiB [ ] /。微型轮班
2.4 GiB [ ] /.游民. d。1.9 GiB [ ] /。配置。1.8 GiB [ ] /。隐藏物
1.7 GiB[]/视频
1.1 GiB [ ] /go
692.6 MIb[]/文件。591.5 MiB [ ] /tmp
139.2 MiB [ ] /。定义变量
104.4 MiB [ ] /。哦,我的天啊
82.0 MIb[]/脚本
55.8 MiB [ ] /。浏览器名
54.6 MiB [ ] /。kube
41.8 MiB [ ] /。精力
31.5 MiB [ ] /。ansible
31.3 MiB [ ] /。宝石
26.5 MiB [ ] /。VIM_UNDO_FILES
15.3 MIb[]/个人
2.6 MiB [ ]。ansible_module_generated
1.4 MIb[]/背景
944.0 KiB[]/图片
644.0 KiB [ ]。zsh_history
536.0 KiB [ ] /。ansible_async
磁盘总使用量: 159.4千兆字节表观大小: 280.8千兆字节项目: 561540
您可以通过箭头键导航到每个结果。如果对所选结果按回车键,ncdu将显示目录的内容:
-/home/gerardi/libvirt-
/.
91.3 GiB[# # # # # # # # # # #]/图像
5.3 GiB[]/媒体
您可以深入每个目录,找出哪些文件占用了最多的磁盘空间。使用左箭头键返回到上一个目录。默认情况下,您可以按D键删除文件,但ncdu会在删除文件之前要求确认。如果要禁止删除以防止意外,可以通过-r选项设置只读访问:ncdu -r r。
Ncdu可以在许多平台和Linux发行版上使用。例如,您可以使用dnf从官方代码库直接将其安装在Fedora上:
$ sudo dnf安装ncdu
有关此工具的更多信息,请参见https:
//dev.yorhel.nl/ncdu。另外,Linux 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。top的替代:htop
htop是一个类似于top的交互式进程浏览器,提供了更好的用户体验。在默认情况下,htop显示的各项指标与top相同,而且是漂亮的彩色。
默认的htop如下所示:
与默认的top相比:
此外,htop的顶部还提供了系统的概述信息,底部的命令栏则显示了功能键命令,你还可以按下F2进入设置页面来自定义界面。在设置页面中,你可以更改其颜色,添加或删除指标、更改概述栏的显示选项。
虽然top的最新版本也可以通过配置获得相似的结果,但htop提供的默认配置更为合理,作为一个进程浏览器更加易于使用。
如果想了解有关该项目的更多信息,请查看htop主页(https://hisham.hm/htop/)。
man的替代:tldr
tldr命令行工具显示可以简化的命令文档,而且大部分文档都提供示例。它是tldr pages项目(https://tldr.sh/)的客户端。
这个工具不是man的替代品。man pages仍然是许多工具的规范以及完整的信息源。但是,在某些情况下,man的内容太多了。有时,你不需要有关命令的所有信息。你只需要记住基本选项。例如,curl命令的man page几乎有3,000行。相比之下,curl的tldr只有40行,如下所示:
$ tldr curl
# curl
Transfers data from or to a server.
Supports most protocols, including HTTP, FTP, and POP3.
More information: <https://curl.haxx.se>.
- Download the contents of an URL to a file:
curl http://example.com -o filename
- Download a file, saving the output under the filename indicated by the URL:
curl -O http://example.com/filename
- Download a file, following [L]ocation redirects, and automatically [C]ontinuing (resuming) a previous file transfer:
curl -O -L -C - http://example.com/filename
- Send form-encoded data (POST request of type `application/x-www-form-urlencoded`):
curl -d 'name=bob' http://example.com/form
- Send a request with an extra header, using a custom HTTP method:
curl -H 'X-My-Header: 123' -X PUT http://example.com
- Send data in JSON format, specifying the appropriate content-type header:
curl -d '{"name":"bob"}' -H 'Content-Type: application/json' http://example.com/users/1234
... TRUNCATED OUTPUT
TLDR的全称是“too long; didn’tread”(太长;未读),这是一句网络流行语,表示文章太长。这个名字非常适合这个汇总工具,因为manpages虽然非常实用,但内容太长。
在Fedora中,tldr客户端是用Python编写的。你可以使用dnf安装。有关其他客户端选项,请参见tldr pages项目(https://tldr.sh/)。
通常,tldr工具需要访问互联网才能查询tldr页面。Fedora中的Python客户端允许你下载和缓存这些页面以供离线访问。
有关tldr的更多信息,请运行tldr tldr。推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice
用sed/grep查找JSON数据的替代:jq
jq是JSON的命令行处理器。就像sed或grep一样,但主要是为了处理JSON数据。如果你是日常任务需要使用JSON的开发人员或系统管理员,那么这是你的工具箱中必不可少的工具。
与通用文本处理工具(例如grep和sed)相比,jq的主要优点在于它了解JSON数据结构,你可以通过一个表达式创建复杂的查询。
举例说明,假设你正在尝试在下列JSON文件中查找容器的名称:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"labels": {
"app": "myapp"
},
"name": "myapp",
"namespace": "project1"
},
"spec": {
"containers": [
{
"command": [
"sleep",
"3000"
],
"image": "busybox",
"imagePullPolicy": "IfNotPresent",
"name": "busybox"
},
{
"name": "nginx",
"image": "nginx",
"resources": {},
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never"
}
}
如果你利用grep直接查询name,则结果为:
$ grep name k8s-pod.json
"name": "myapp",
"namespace": "project1"
"name": "busybox"
"name": "nginx",
grep会返回所有包含单词name的行。你可以在grep中添加一些其他选项来限制查询结果,并通过正则表达式操作找到容器的名称。在使用jq获得所需结果时,你只需要使用一个模拟向下导航数据结构的表达式,如下所示:
$ jq '.spec.containers[].name' k8s-pod.json
"busybox"
"nginx"
该命令会返回两个容器的名称。如果你只想查看第二个容器的名称,则可以在表达式中添加数组元素索引:
$ jq '.spec.containers[1].name' k8s-pod.json
"nginx"
因为jq能够理解数据结构,所以即使文件格式稍有变化,它也可以提供相同的结果。但对于grep和se来说,格式稍有变化提供的结果就会完全不同。
jq还有很多功能,我需要用另写一篇文章才能介绍其所有的功能。有关更多信息,请参见jq项目页面(https://stedolan.github.io/jq/)、manpages或tldr jq。
find的替代:fd
fd是find命令的一种简单快速的替代。它的目的不是替换find的功能,而是提供一些合理的默认值,在某些情况下非常有用。
例如,在包含Git代码库的目录中搜索源代码文件时,fd会自动排除隐藏的文件和目录(包括.git目录),并忽略.gitignore文件中的模式。通常,它可以更快地查询,并提供相关度更高的结果。
在默认情况下,fd会针对当前目录执行不区分大小写的模式搜索,并输出彩色的结果。使用find进行的相同搜索时,你需要提供其他命令行参数。例如,搜索当前目录中所有的markdown文件(即.md或.MD文件),find命令如下所示:
$ find . -iname "*.md"$ find . -iname "*.md"
而如下fd搜索能够返回相同的结果:
$ fd .md
在有些情况下,fd也需要其他选项。例如,如果想让搜索包括隐藏的文件和目录,则必须使用选项-H,而find则不需要。
fd可用于许多Linux发行版。在Fedora中安装fd可使用标准代码库:
$ sudo dnf install fd-find