剑客grep

来者何人

grep是linux上的字符串搜索匹配命令。这个名字来自于linux编辑器vim的一个命令g/re/p,表示全局匹配某个正则表达式并打印出来,这也体现了grep自身的功能。

基本技能

搜索字符串

比如我们想在一个有10万条信息的文本中找到Zhang3的信息:

$ cat students.txt
name    age     phone   address
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

我们可以借助grep来搜索:

$ grep Zhang3 students.txt
Zhang3  19      10001   Sichuan

可以看到,基本命令格式包括grep <要匹配的内容> <要搜索的文件>

搜索所在行 -n

能否查到Zhang3的信息在第几行

通过-n参数,即 number 行号

$ grep -n Zhang3 students.txt
3:Zhang3        19      10001   Sichuan

如何查找除Zhang3以外的其他信息?

通过-v参数,即 –invert-match,反选除Zhang3以外的信息

$ grep -v Zhang3 students.txt
name    age     phone   address
LiSi    18      10086   Beijing
Wang5   19      91182   Newyork

不知道具体大小写,搜索李四怎么办?

可以用 -i,–ignore-case 即忽略大小写

$ grep -i lisi students.txt
LiSi    18      10086   Beijing

复杂模式匹配

如果想搜索张三和李四两位同学的信息怎么做?

-E 表示正则表达式,然后用“A|B”选择A或者B。

$ grep -E 'Zhang3|LiSi' students.txt
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan

也可以选择名字中带数字的人

$ grep -E "[a-zA-Z]+[0-9]+" students.txt
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

如果我之前把一段笔记写在一个文件里了,但我忘了文件名,应该怎么找到呢?

只记得笔记是关于“canves 旋转”的,可以用递归搜索’-r’的方法去查找

$ grep -r "canves 旋转" *
Z_其他/30分钟搞定Linux三剑客.md:85:只记得笔记是关于“canves 旋转”的
h_Android笔记/bitmap旋转.md:18:## 2. canves 旋转

可以看到,我在两个文件中写过这条笔记。命令中的*表示当前目录的所有文件。

想看看这条记录这行后面几行写了什么?可以用-A n -B n A表示after, B表示before。比如查看那条记录后5行

$ grep -r "canves 旋转" * -A 5
Z_其他/30分钟搞定Linux三剑客.md:只记得笔记是关于“canves 旋转”的,可以用递归搜索'-r'的方法去查找
Z_其他/30分钟搞定Linux三剑客.md-
Z_其他/30分钟搞定Linux三剑客.md-
Z_其他/30分钟搞定Linux三剑客.md-
Z_其他/30分钟搞定Linux三剑客.md-
Z_其他/30分钟搞定Linux三剑客.md-
--
--
h_Android笔记/bitmap旋转.md:## 2. canves 旋转
h_Android笔记/bitmap旋转.md-
h_Android笔记/bitmap旋转.md-什么是canves ,什么是旋转,哈哈哈
h_Android笔记/bitmap旋转.md-
h_Android笔记/bitmap旋转.md-
h_Android笔记/bitmap旋转.md-

剑客sed

自我介绍

sed 是一个文本文件处理器,名字的含义是 [s]tream [ed]iter ,即流处理器,能够逐行的处理文本中的数据,按照需要对每行进行增删改查操作。比grep功能更强大。

查找功能

sed的搜索功能和grep基本一样。基本格式为

sed [搜索参数] ’/要搜索的内容/ p‘ <搜索那个文件>

其中 p表示print,打印出匹配到的行

搜索张三

$ sed '/Zhang3/ p' students.txt
name    age     phone   address
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

可以看到所有的都打印出来了,但张三被打印了两次。因为流处理器会把每一行处理后的数据打印出来(这里我们没有修改,所以显示原有内容),同时查找命令也会把查找结果打印出来。可以用 -n参数禁止输出每行处理后的结果。这样就能只显示搜索到的结果了。

$ sed -n '/Zhang3/ p' students.txt
Zhang3  19      10001   Sichuan

查找名字中带数字的人,用了个正则表达式

$ sed -n '/[a-zA-Z]\+[0-9]/ p' students.txt
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

查找以L开头的行

sed -n '/^L/ p' students.txt
LiSi    18      10086   Beijing

^表示行开头 $表示行结尾

$ sed -n '/an$/ p' students.txt
Zhang3  19      10001   Sichuan

但是^( )放在括号前面表示逻辑非,即选择不包括这个模式的行。

选择不是以an结尾的行

$ sed '/^(an$)/ p' students.txt
name    age     phone   address
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

修改替换

基本格式为:

sed ’s/被替换部分/替换成什么/' 文件名

我们想把LiSi的名字改成 Li4,用s命令,substitute。

$ sed 's/LiSi/Li4/' students.txt
name    age     phone   address
Li4     18      10086   Beijing
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

有个比较难的需求,想把Li4的地址改为HeNan,可以先搜索李四的记录,然后把他的地址改为HeNan

需要用到【搜索加替换】命令格式

sed ’/搜索定位内容/s/被替换部分/替换成什么/' 文件名
sed   '/Li/s/Beijing/HeNan/' students.txt
name    age     phone   address
LiSi    18      10086   HeNan
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

逐个字符替换,如果我想对文本进行简单的加密,想把所有的数字【0-9】替换成【A-J】

$ sed 'y/0123456789/abcdefghij/' students.txt
name    age     phone   address
LiSi    bi      baaig   Beijing
Zhangd  bj      baaab   Sichuan
Wangf   bj      jbbic   Newyork

y命令可以把一段字符替换成另一段字符。

如果我们想给这个表格添加一个成绩列怎么办呢?【难度较大,可跳过】

先给表头行添加一个列明 “score”,然后从第2行到最后一行,每行替换行末尾符号为成绩缺省字符“Null”。

需要两个命令,多个命令使用时,要用 -e 参数,即execute, 格式为:

sed -e '命令1' -e '命令2' 文件

所以对我们加成绩列的需求:

$ sed -e '1 s/$/\tscore/' -e '2,$ s/$/\tNull/' students.txt
name    age     phone   address score
LiSi    18      10086   Beijing Null
Zhang3  19      10001   Sichuan Null
Wang5   19      91182   Newyork Null

包括两个命令,'1 s/$/\tscore/' ,先定位第一行,然后用替换指令s把行末尾标志$替换为制表符\t和score。

第二个命令,'2,$ s/$/\tNull/',定位第2行到最后一行$,然后把行末标志$替换为制表符\tNULL

可以看到 $即可表示一行的末尾,也可表示文件的最后一行。

查找删除

命令格式

sed '/搜索该内容/ d' 文件名

我们尝试删除LiSi:

sed '/LiSi/ d' students.txt
name    age     phone   address
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

添加一行

命令格式

sed '/搜索该内容/a\在下一行添加一行内容' 文件名

其中a\表示在下一行添加内容(append)。

比如,想在,Wang5这行数据后面添加一行“End of File”

$ sed '/Wang5/a\End of File' students.txt
name    age     phone   address
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork
End of File

此外 i\表示在前一行添加(insert)。比如想在name前面添加“ students info ”:

$ sed '/name/i\  Students Info' students.txtStudents Info
name    age     phone   address
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

结果重定向

最后我们会发现,我们之前做了那么多修改,并没有写入students.txt中。可以通过输出重定向>(推荐),因为我们做了修改,是不可撤销不可逆转的,所以建议,把修改保存到其他文件中。

$ sed '/name/i\  Students Info' students.txt >s2.txt
$ cat s2.txtStudents Info
name    age     phone   address
LiSi    18      10086   Beijing
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

剑客awk

介绍

awk是一个很强大的文本处理工具。awk三个字母分别是三位初始开发者的名字首字母。相比于grep和sed,awk中的命令可以变得非常复杂。简单搜索匹配替换等功能用 grep 和sed就可以,复杂的,建议用python等脚本语言。所以,我基本上没怎么用过awk。但是还是要学学,万一哪天用上了呢? 起码有个地方查。

功能介绍

基本功能

awk对一行文本的分割功能非常强大,通过变量$1,$n表示分割后的第n个字符串。$0表示整行内容。

比如,打印每行的第一个和第三个字符串

$ awk '{print $1,$3}' students.txt
name phone
LiSi 10086
Zhang3 10001
Wang5 91182

这里默认以空格作为分割父,其他分割符可通过-F ‘,- ’参数设置。

通过 -v 可以设置变量。

$ awk -v a='Mr.'   '{print a$1}' students.txt
Mr.name
Mr.LiSi
Mr.Zhang3
Mr.Wang5

也可以用正则表达是筛选出名字中带数字的行。

$ awk '/[a-zA-Z]+[1-9]/ {print $0} ' students.txt
Zhang3  19      10001   Sichuan
Wang5   19      91182   Newyork

未完,待续…

15分钟搞定Linux三剑客 grep sed awk相关推荐

  1. Linux三剑客 grep sed awk 详细使用方法

    Linux中最重要的三个命令在业界被称为"三剑客",它们是awk,sed,grep. 我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文 ...

  2. 9月29日云栖精选夜读 | 17个案例带你3分钟搞定Linux正则表达式

    正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: Shell元字符,由Linux Shell进行解析: 正则表达式元字符,由vi/grep/sed/awk ...

  3. Shell ❀ 三剑客 - Grep + Sed + Awk

    文章目录 八.三剑客 - Grep + Sed + Awk 1.Grep - 过滤 1.1 常用grep参数 1.2 使用方法 2.Sed - 行匹配 2.1 执行原理 2.2 常见语法 2.3 使用 ...

  4. 【开发者成长】5 分钟搞定 Linux 正则表达式

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: S ...

  5. linux正则表达式_【开发者成长】5 分钟搞定 Linux 正则表达式

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: S ...

  6. 三剑客grep sed awk

    三剑客 正则(RE)表达式 应用场景 规则 注意事项 正则符号 基础正则 扩展正则 正则实例 正则 VS 通配符 三剑客 grep sed sed核心应用 awk awk执行过程 内置变量 awk 正 ...

  7. AI模型落地难?试试这个15分钟搞定的开源工具

    自古兵家作战就讲究一个「度」. 公元 200年,官渡之战后.死敌袁绍的残兵败卒远逃塞北,劳师远征还是穷寇莫追,曹操陷入纠结.鬼才谋士郭嘉建言道:"用兵贵在神速!远征千里之外,辎重多.行军慢, ...

  8. Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)

    shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...

  9. 验证码 html 自动验证码,15分钟搞定自动识别网站验证码

    概述 很多开发者都讨厌网站的验证码,特别是写网络爬虫的程序员,而网站之所以设置验证码,是为了防止机器人访问网站,造成不必要的损失.现在好了,随着机器学习技术的发展,机器识别验证码的问题比较好解决了. ...

最新文章

  1. 在虚拟机中 windows 2003 装.net framework 3.5 出现问题.
  2. 微信 php 接口 函数,PHP的json_encode函数应用到微信接口有关问题(include \uxxxx will create fail)...
  3. C++ 统计字符串中某字符出现的次数
  4. mysql 表结构关系_mysql 表关系 与 修改表结构
  5. 牛逼的python代码_牛逼了!Python代码补全利器,提高效率告别996!
  6. POJ1220(高精度进制转换)
  7. SQL日期时间格式自由转换大全
  8. 深度学习及AR在移动端打车场景下的应用
  9. real time linux pdf,【整理】ubuntu real time Linux
  10. nacos 下线接口_微服务架构nacos注册中心为什么那么火
  11. 《第一本Docker书(修订版)》——第1章_简介_1.1Docker简介
  12. 查看Linux内核版本命令
  13. [RQNOJ PID85]三个袋子 {快速幂 or 矩阵乘法}
  14. IP地址的获取—分析从连接WiFi到上网的全过程(二)
  15. 【报错】安装scrapy时Could not build wheels for cryptography which use PEP 517 and cannot be installed direc
  16. android手机号码恢复,安卓手机怎么找回通讯录联系人_安卓手机恢复手机通讯录教程_3DM手游...
  17. Linux基础命令(持续更新中)
  18. Delphi 程序运行提示 “Database Login”对话框,让输入ADOConnection1 的UserName和Password...
  19. ae插件form_AE插件排行!!
  20. 小程序:微信公众平台:小程序

热门文章

  1. 如何查看python之禅_Python 之禅
  2. 阻塞队列和非阻塞队列
  3. 平面设计之色彩搭配构成
  4. 昨天写了这些骚代码,今天上班差点被同事揍了
  5. PYSearch-iOS快捷搭建搜索功能
  6. 计算机应用知识点Windows7,计算机应用教程:Windows7环境
  7. win10黑屏,画面卡死无法唤醒,无法操作
  8. 神盾局特工的背景知识 SHIELD的等级制度
  9. 批处理命令PUSHD和POPD
  10. Ubuntu下使用动画壁纸 LiveWallpaper