15分钟搞定Linux三剑客 grep sed awk
剑客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相关推荐
- Linux三剑客 grep sed awk 详细使用方法
Linux中最重要的三个命令在业界被称为"三剑客",它们是awk,sed,grep. 我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文 ...
- 9月29日云栖精选夜读 | 17个案例带你3分钟搞定Linux正则表达式
正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: Shell元字符,由Linux Shell进行解析: 正则表达式元字符,由vi/grep/sed/awk ...
- Shell ❀ 三剑客 - Grep + Sed + Awk
文章目录 八.三剑客 - Grep + Sed + Awk 1.Grep - 过滤 1.1 常用grep参数 1.2 使用方法 2.Sed - 行匹配 2.1 执行原理 2.2 常见语法 2.3 使用 ...
- 【开发者成长】5 分钟搞定 Linux 正则表达式
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: S ...
- linux正则表达式_【开发者成长】5 分钟搞定 Linux 正则表达式
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: S ...
- 三剑客grep sed awk
三剑客 正则(RE)表达式 应用场景 规则 注意事项 正则符号 基础正则 扩展正则 正则实例 正则 VS 通配符 三剑客 grep sed sed核心应用 awk awk执行过程 内置变量 awk 正 ...
- AI模型落地难?试试这个15分钟搞定的开源工具
自古兵家作战就讲究一个「度」. 公元 200年,官渡之战后.死敌袁绍的残兵败卒远逃塞北,劳师远征还是穷寇莫追,曹操陷入纠结.鬼才谋士郭嘉建言道:"用兵贵在神速!远征千里之外,辎重多.行军慢, ...
- Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)
shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...
- 验证码 html 自动验证码,15分钟搞定自动识别网站验证码
概述 很多开发者都讨厌网站的验证码,特别是写网络爬虫的程序员,而网站之所以设置验证码,是为了防止机器人访问网站,造成不必要的损失.现在好了,随着机器学习技术的发展,机器识别验证码的问题比较好解决了. ...
最新文章
- 在虚拟机中 windows 2003 装.net framework 3.5 出现问题.
- 微信 php 接口 函数,PHP的json_encode函数应用到微信接口有关问题(include \uxxxx will create fail)...
- C++ 统计字符串中某字符出现的次数
- mysql 表结构关系_mysql 表关系 与 修改表结构
- 牛逼的python代码_牛逼了!Python代码补全利器,提高效率告别996!
- POJ1220(高精度进制转换)
- SQL日期时间格式自由转换大全
- 深度学习及AR在移动端打车场景下的应用
- real time linux pdf,【整理】ubuntu real time Linux
- nacos 下线接口_微服务架构nacos注册中心为什么那么火
- 《第一本Docker书(修订版)》——第1章_简介_1.1Docker简介
- 查看Linux内核版本命令
- [RQNOJ PID85]三个袋子 {快速幂 or 矩阵乘法}
- IP地址的获取—分析从连接WiFi到上网的全过程(二)
- 【报错】安装scrapy时Could not build wheels for cryptography which use PEP 517 and cannot be installed direc
- android手机号码恢复,安卓手机怎么找回通讯录联系人_安卓手机恢复手机通讯录教程_3DM手游...
- Linux基础命令(持续更新中)
- Delphi 程序运行提示 “Database Login”对话框,让输入ADOConnection1 的UserName和Password...
- ae插件form_AE插件排行!!
- 小程序:微信公众平台:小程序