【Shell 命令集合 文档编辑 】Linux 文本搜索 look 命令使用指南

简介: 【Shell 命令集合 文档编辑 】Linux 文本搜索 look 命令使用指南

Shell 命令专栏:Linux Shell 命令全解析

描述

look命令是Linux系统中的一个文本搜索工具,用于在指定的文件或标准输入中查找以指定字符串开头的单词。它的基本语法如下:

语法格式

look [选项] [模式] [文件...]

参数说明

  • -f:忽略大小写,查找匹配模式的单词。
  • -t:只显示单词的开头部分,而不是完整内容。
  • -b:只显示单词的结尾部分,而不是完整内容。

错误情况

  • 如果给定的文件不存在或无法访问,会显示错误信息。
  • 如果未提供模式或文件参数,会显示错误信息。
  • 如果找不到匹配的单词,不会显示错误信息,而是不输出任何内容。

注意事项

使用Linux Shell的look命令时,有一些注意事项需要注意:

  1. look命令只能用于查找以字典顺序排序的文件。如果文件未排序,则look命令可能无法正常工作。
  2. look命令默认区分大小写。如果需要忽略大小写进行查找,可以使用-f选项。
  3. look命令只能查找以字母或数字开头的单词。如果需要查找其他字符开头的单词,可以使用正则表达式。
  4. look命令只能查找完全匹配的单词。如果需要查找部分匹配的单词,可以使用正则表达式。
  5. look命令可以同时查找多个文件,多个文件之间用空格分隔。
  6. look命令默认情况下会显示匹配的单词的完整内容。如果只想显示单词的开头部分或结尾部分,可以使用-t-b选项。
  7. look命令不会显示错误信息,如果找不到匹配的单词,则不会输出任何内容。
  8. look命令支持通配符,可以在模式中使用*?进行模糊匹配
  9. look命令可以与其他命令结合使用,例如通过管道将查找结果传递给其他命令进行进一步处理。
  10. 在使用look命令时,需要确保有足够的权限来访问要查找的文件。

以上是使用Linux Shell的look命令时需要注意的一些事项,根据具体的使用场景和需求,还可以参考man手册或使用look --help命令获取更多信息。


底层实现

在Linux Shell中,look命令的底层实现是通过使用二进制查找算法来快速查找以字典顺序排序的文件中的单词。

具体来说,look命令会先根据指定的文件路径打开要查找的文件,并将其读取到内存中。然后,它会根据用户提供的关键词,在文件中进行二进制查找。

二进制查找算法的基本思想是将要查找的范围分成两半,然后确定关键词位于哪一半,并继续在该半范围内进行查找。这样,每次查找都可以将查找范围缩小一半,从而快速定位到关键词所在的位置。

在look命令中,它首先会读取文件中的每一行,并提取出每行的第一个单词。然后,它会根据用户提供的关键词,在这些单词中进行二进制查找。

由于look命令要求文件已经按字典顺序排序,因此它可以利用二进制查找算法的优势,快速定位到关键词所在的位置。

一旦找到匹配的单词,look命令会将该行完整地输出到标准输出。如果找不到匹配的单词,则不会输出任何内容。

总结来说,look命令底层实现是通过二进制查找算法快速定位到字典排序文件中的单词,并输出匹配的结果。这种实现方式可以在大规模的文件中高效地查找指定的单词。


示例

示例一

查找文件中以"apple"开头的单词,并显示完整内容:

look apple file.txt

示例二

在标准输入中查找以"hello"开头的单词,并忽略大小写:

echo "Hello, how are you?" | look -f hello

示例三

查找文件中以"world"开头的单词,并只显示单词的开头部分:

look -t world file.txt

示例四

在标准输入中查找以"linux"开头的单词,并只显示单词的开头部分:

echo "Linux is an operating system" | look -t linux

示例五

查找文件中以"program"结尾的单词,并只显示单词的结尾部分:

look -b program file.txt

示例六

在标准输入中查找以"example"结尾的单词,并只显示单词的结尾部分:

echo "This is an example" | look -b example

示例七

在标准输入中查找以"test"开头的单词,并忽略大小写:

echo "Testing is important" | look -f test

用c语言实现


以下是一个用C语言实现look命令的示例代码,包含了详细的注释说明:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 256
// 二进制查找函数
int binarySearch(char *word, FILE *file) {
    int low = ftell(file);  // 获取当前文件指针位置
    fseek(file, 0, SEEK_END);  // 将文件指针移动到文件末尾
    int high = ftell(file);  // 获取文件末尾位置
    int mid, cmp;
    while (low < high) {
        mid = (low + high) / 2;
        fseek(file, mid, SEEK_SET);  // 将文件指针移动到中间位置
        while (fgetc(file) != '\n') {
            if (ftell(file) <= low || ftell(file) >= high) {
                break;
            }
        }
        if (ftell(file) <= low || ftell(file) >= high) {
            break;
        }
        char line[MAX_LENGTH];
        fgets(line, MAX_LENGTH, file);
        line[strlen(line) - 1] = '\0';  // 去除行尾的换行符
        cmp = strcmp(line, word);
        if (cmp == 0) {
            return 1;  // 找到匹配的单词
        } else if (cmp < 0) {
            low = ftell(file);
        } else {
            high = ftell(file);
        }
    }
    return 0;  // 未找到匹配的单词
}
// look命令实现函数
void look(char *word, char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Error opening file.\n");
        return;
    }
    while (!feof(file)) {
        char line[MAX_LENGTH];
        fgets(line, MAX_LENGTH, file);
        line[strlen(line) - 1] = '\0';  // 去除行尾的换行符
        if (strncmp(line, word, strlen(word)) == 0) {
            printf("%s\n", line);  // 输出匹配的行
        } else if (strcmp(line, word) > 0) {
            break;  // 已经超过了匹配的范围,停止查找
        }
    }
    fclose(file);
}
int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Usage: ./look <word> <filename>\n");
        return 1;
    }
    char *word = argv[1];
    char *filename = argv[2];
    look(word, filename);
    return 0;
}

在这个示例代码中,我们使用了一个binarySearch函数来实现二进制查找算法。该函数接收一个单词和一个已按字典顺序排序的文件作为参数,并返回是否找到了匹配的单词。

look函数是实际实现look命令的函数。它接收一个单词和一个文件名作为参数,并在文件中查找匹配的行并输出。

main函数中,我们首先检查命令行参数的数量是否正确。然后,我们将命令行参数传递给look函数来执行查找操作。

注意:这只是一个简单的示例代码,没有考虑一些特殊情况(例如文件不存在或文件格式错误)。在实际应用中,可能需要添加更多的错误处理和边界检查来提高代码的健壮性。


结语

在我们的探索过程中,我们已经深入了解了Shell命令的强大功能和广泛应用。然而,学习这些技术只是开始。真正的力量来自于你如何将它们融入到你的日常工作中,以提高效率和生产力。

心理学告诉我们,学习是一个持续且积极参与的过程。所以,我鼓励你不仅要阅读和理解这些命令,还要动手实践它们。尝试创建自己的命令,逐步掌握Shell编程,使其成为你日常工作的一部分。

同时,请记住分享是学习过程中非常重要的一环。如果你发现本博客对你有帮助,请不吝点赞并留下评论。分享你自己在使用Shell命令时遇到的问题或者有趣的经验,可以帮助更多人从中学习。

此外,我也欢迎你收藏本博客,并随时回来查阅。因为复习和反复实践也是巩固知识、提高技能的关键。

最后,请记住:每个人都可以通过持续学习和实践成为Shell编程专家。我期待看到你在这个旅途中取得更大进步!

目录
相关文章
|
7月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
679 9
|
7月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
7月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
696 2
|
9月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1120 1
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
1715 25
|
11月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
338 4
|
11月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
599 3
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
281 18
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
1306 32
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
1235 0
Linux 如何更改默认 Shell