我敢打赌,看完这些Linux文本查找技巧,提高你80%工作效率!

2024-03-16 04:08

本文主要是介绍我敢打赌,看完这些Linux文本查找技巧,提高你80%工作效率!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg

作者:守望先生

公众号:编程珠玑

前言

之前介绍过很多linux下查找相关的命令,而对文件内容搜索的命令似乎还没有涉及,因此本文介绍文本搜索命令--grep。

常见用法

我们会经常结合管道符(|)来使用它,即在前面命令执行的结果中查找包含相关字符串的内容。例如:

$ ps -ef|grep redis

ps -ef用于查看系统进程情况,但是它列出的结果很多,如果我们只想看到自己需要的,则通过管道符,用grep进行过滤搜索,例如搜索redis相关的进程,最后它只会列出和redis相关的进程了:

$  ps -ef|grep redis
root     10748 10733  0 21:14 pts/21   00:00:00 redis-server *:6379
root     10754 10733  0 21:14 pts/21   00:00:00 grep --color=auto redis

那么如果要排除某些不相关信息呢?我们可以使用-v参数

$ ps -ef|grep redis |grep -v auto
root     10748 10733  0 21:14 pts/21   00:00:00 redis-server *:6379

这样一来,包含auto相关的结果就不会出现在最终结果里了。

如果只想统计结果数量呢?我们可以结合-c(count)参数:

$ ps -ef|grep redis -c
2

文件内容搜索

好了,说完了最常见的用法,我们来看看如何搜索文件内容。实际上awk和sed在这方面也颇有经验,不过本文的主角是grep,所以另外两个命令暂时不涉及。我们来看几个实例。

在指定文件中查找指定关键字

例如,要在linux_command_debug.md文件中,查找test字符串:

$  grep "test" aaa/bbb/linux_command_debug.md
int test(int a,int b)test(a,b);

如果想要显示指定关键字的行号,可以使用-n参数,例如:

$  grep -n "test" aaa/bbb/linux_command_debug.md
18:int test(int a,int b)
27:    test(a,b);
搜索时指定或排除多个文件

前面提到了对一个文件内容进行搜索,如果是多个呢?或者不想从某些文件里搜索呢?

如果想对文件进行指定也是可以的,例如搜索所有的md结尾的文件:

$  grep -n "test" *.md

或者可以使用--exclude参数来排除某些文件,例如,查找包含test,但是排除txt文件:

$ grep -rn "test" --exclude=*.txt

搜索时就会忽略.txt结尾的文件了。

如果要排除的条件比较多,可以将要排除的条件存储在另外一个文件里:

$ grep -rn "test" --exclude-from=skip.txt

skip.txt的内容可以是模式匹配的文件名或者具体文件名:

*.txt
test.md

这样,以.txt结尾,以及test.md文件都不会搜索了。

除此之外,还可以排除指定目录,它需要用到--exclude-dir参数:

$ grep -rn "test" --exclude-dir=aaa

它在搜索时将会跳过aaa目录下的文件。

查找包含指定关键字的文件

如果要在当前目录下所有文件查找包含“int main(void)”字符串的文件:

$ grep -rn "int main(void)"
aaa/bbb/c_main_func.md:49:int main(void)
aaa/bbb/c_main_func.md:71:int main(void) { /* ... */ }
aaa/bbb/c_array.md:104:int main(void)
aaa/bbb/c_array.md:129:int main(void)
aaa/bbb/pc-lint.md:42:int main(void)
aaa/bbb/pc-lint.md:128:int main(void)

这可能是最实用的使用方法之一了。这里-r参数表示递归查找当前目录的文件,-n会显示查找位置的行号,如果只想显示包含该指定关键字的文件名,可使用-l(--file-with-matches)参数:

$ grep -rln "int main(void)"
aaa/bbb/c_main_func.md
aaa/bbb/c_array.md
aaa/bbb/pc-lint.md

如果你尝试一下就会发现,如果不带-r参数,它会暂停,等待你从控制台输入,例如:

$ grep -n "test"
test
1:test

所以使用时记得带上相关参数奥!

查找不包含指定关键字的文件

前面提到了如何查找包含某个关键字的文件,如果要找的是不包含该关键字的文件呢?

$ grep -rLn "int main(void)"
(这里会显示不包含指定关键字内容的文件名)
搜索时忽略大小写

使用-i(--ignore-case)参数即可:

$ grep -rni "int MAIN(void)"
aaa/bbb/c_main_func.md:49:int main(void)
aaa/bbb/c_main_func.md:71:int main(void) { /* ... */ }
aaa/bbb/c_array.md:104:int main(void)
aaa/bbb/c_array.md:129:int main(void)
aaa/bbb/pc-lint.md:42:int main(void)
aaa/bbb/pc-lint.md:128:int main(void)
搜索显示不包含指定关键字的行

前面的大部分例子都是显示符合条件的行,如果要显示不符合条件的行呢?可以用我们前面提到的-v参数:

$ grep -rnv "int main(void)"
(内容较多,未显示)

从结果中就会发现,它会展示出包含指定关键字的文件,但是展示的是不包含该关键字的行。

显示指定关键字前后内容

假如你需要查看包含指定关键字行附近的行,前面的方式是没有办法看到的,不过我们可以用-A(--after-context=)和-B(--before-context=)参数来显示前后的行:

$ grep -rn "int main(void)" -A 1 -B 1
aaa/bbb/c_array.md-103-}
aaa/bbb/c_array.md:104:int main(void)
aaa/bbb/c_array.md-105-{
(其他内容省略)

通过最后加上-A和-B参数,显示了指定关键字前后的行,这在日志搜索分析时非常有用。

指定规则文件进行搜索

如果有多个搜索关键字怎么处理呢?我们可以把关键字写在一个文件,搜索时指定文件即可,例如规则文件为key.txt:

int main(void)
test

从指定文件中搜索上面的关键字:

$ cat filename |grep -f key.txt

这样结果就会显示匹配key.txt文件中所有关键字的行,非常适合用于多个条件的搜索。

正则表达式搜索

看完前面的内容,是不是还没有感受到grep的强大?grep的另一个强大之处是,它的搜索支持正则表达式,例如查找文本行以t开头,以t结尾的文件:

$ grep -rn ^t.*t$
key.txt:2:test
aaa/bbb/c_operate_redis_start.md:68:typedef struct Stu_Info_Struct
aaa/bbb/c_operate_redis_start.md:101:typedef struct Stu_Info_Struct

其中^t,表明以t开头,t$表明以t结尾,如果需要使用扩展的正则表达式进行搜索,可使用egrep命令。关于正则表达式的写法,本文不做详细介绍。

总结

在内容搜索方面,grep常常能够助我们一臂之力,因此掌握grep的使用也是linux学习不可缺少的一部分,当然我们不需要完全记住每个参数的作用,但我们至少知道有这样的参数,并且在需要时能够快速查询到。本文常用参数如下:

  • -v #显示不包含匹配关键字的所有行。

  • -l #显示包含匹配关键字的文件

  • -L #显示不包含匹配关键字的文件

  • -r #递归搜索

  • -i #忽略大小写

  • -n #显示关键字所在行号

  • -A n #显示关键字后n行

  • -B n #显示关键字前n行

  • --exclude #搜索时排除某些文件

  • --exclude-dir #搜索时排除某些目录

  • -f #指定规则文件进行搜索

推荐阅读:

第四期人工智能 NLP / CV 课 培训招生

必会的 24 道 Shell 脚本面试题

你是一直认为 count(1) 比 count(*) 效率高么?

640?wx_fmt=jpeg

这篇关于我敢打赌,看完这些Linux文本查找技巧,提高你80%工作效率!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814249

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n