linux三剑客及正则表达(grep,sed,awk)
首先我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。
在说这三个命令前我们要插入一个小插曲就是“正则表达式”。
目录
正则表达与三剑客的说明
grep
sed
awk
awk,for,if循环实现高级搜索
正则表达与三剑客的说明
所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。
三剑客与正则表达式是什么关系呢?
我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。
三剑客:
1.grep文本搜索工具(过滤匹配的行)
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.sed流式编辑器 逐行处理
对文档进行非交互式增删改查的操作
3.awk精确搜索 (二次处理)
简单来说,awk就是把文件逐行读入,以空格为默认分隔符将每行切片,然后可以对切开的部分进行各种处理。相对于grep的查找、匹配和sed的编辑,awk适合对文本进行较复杂的格式处理。
三剑客的对比:
grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多
sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed
awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk
正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符具有特殊的含义。具体如下
元字符 补充
grep
grep过滤工具
---格式:grep 【选项】 “正则表达式“ 文件
egrep 过滤工具
---格式:egrep 【选项】 “扩展正则表达式“ 文件
举例子:
head -5 /etc/passwd > user //准备素材
grep ^root user //找以root开头的行
grep bash$ user //找以bash结尾的行
grep ^$ user //找空行
grep -v ^$ user //显示除了空行的内容grep "[root]" user //找rot任意一个字符
grep "[rot]" user //效果同上
grep "[^rot]" user //显示r或o或t以外的内容
grep "[0123456789]" user //找所有数字
grep "[0-9]" user //效果同上
grep "[^0-9]" user //显示数字以外内容
grep "[a-z]" user //找所有小写字母
grep "[A-Z]" user //找所有大写字母
grep "[a-Z]" user //找所有字母
grep "[a-Z0-9]" user //找所有字母和数字
grep "[^a-Z0-9]" user //找特殊符号grep "." user //找任意单个字符,文档中每个字符都可以理解为任意字符
grep "r..t" user //找rt之间有2个任意字符的行
grep "r.t" user //找rt之间有1个任意字符的行,没有匹配内容,就无输出
grep "*" user //错误用法,*号是匹配前一个字符任意次,不能单独使用
grep "ro*t" user //找rt,中间的o有没有都行,有几次都行
grep ".*" user //找任意,包括空行 .与*的组合在正则中相当于通配符的效果grep "ro\{1,2\}t" user //找rt,中间的o可以有1~2个
grep "ro\{2,6\}t" user //找rt,中间的o可以有2~6个
grep "ro\{2,\}t" user //找rt,中间的o可以有2个以及2个以上
grep "ro\{1,\}t" user //找rt,中间的o可以有1个以及1个以上
grep "ro\{3,\}t" user //找rt,中间的o可以有3个以及3个以上
grep "ro\{2\}t" user //找rt,中间的o必须只有有2个
grep "ro\{1\}t" user //找rt,中间的o必须只有有1个
grep "ro\{3\}t" user //找rt,中间的o必须只有有3个grep "\(0:\)\{2\}" user //找连续的2个0: 小括号的作用是将字符组合为一个整体以上命令均可以加-E选项并且去掉所有\,改成扩展正则的用法,比如
grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user
或者
egrep "ro{1,}t" user grep "ro\{1,\}t" user //使用基本正则找o出现1次以及1次以上
egrep "ro{1,}t" user //使用扩展正则,效果同上,比较精简
egrep "ro+t" user //使用扩展正则,效果同上,最精简
grep "ro\{0,1\}t" user //使用基本正则找o出现0~1次
egrep "ro{0,1}t" user //使用扩展正则,效果同上,比较精简
egrep "ro?t" user //使用扩展正则,效果同上,最精简
egrep "root|^bin" user //找有root或者以bin开头的行
#此时的egrep与grep -E相同#单词边界
cat aa //素材文件,里面有一些"the"
the
there
the6
the_
123the
egrep "the\b" aa //在aa文件中找the,右边不允许出现数字、字母、下划线
egrep "\bthe\b" aa //找the,两边都不允许出现数字、字母、下划线
grep正则表达式练习
先在regular_express.txt写入内容.... 1,过滤包含 the 关键字 grep -n 'the' regular_express.txt 2,过滤不包含 the 关键字 grep -vn 'the' regular_express.txt 3,过滤不论大小写 the 关键字 grep -in 'the' regular_express.txt 4,过滤 test 或 taste 这两个单字 grep -n 't[ae]st' regular_express.txt 5,过滤有 oo 的字节 grep -n 'oo' regular_express.txt 6,过滤不想要 oo 前面有 g 的 grep -n '[^g]oo' regular_express.txt 7,过滤 oo 前面不想有小写字节 grep -n '[^a-z]oo' regular_express.txt. 8,过滤有数字的那一行 grep -n '[0-9]' regular_express.txt 9,过滤以 the 开头的 grep -n '^the' regular_express.txt 10,过滤以小写字母开头的 grep -n '^[a-z]' regular_express.txt 11,过滤开头不是英文字母 grep -n '^[^a-zA-Z]' regular_express.txt 12,过滤行尾结束为小数点.那一行 grep -n '\.$' regular_express.txt 13,过滤空白行 grep -n '^$' regular_express.txt 14,过滤出 g??d 的字串 grep -n 'g..d' regular_express.txt 15,过滤至少两个 o 以上的字串 grep -n 'ooo*' regular_express.txt 16,过滤 g 开头和 g 结尾但是两个 g 之间仅存在至少一个 o grep -n 'goo*g' regular_express.txt 17,过滤两个 o 的字串 grep -n 'o\{2\}' regular_express.txt 18,过滤 g 后面接 2 到 5 个 o,然后在接一个 g 的字串 grep -n 'go\{2,5\}g' regular_express.txt 19,过滤 g 后面接 2 个以上 o 的 grep -n 'go\{2,\}g' regular_express.txtgrep "bash$" /etc/passwd | sed 's/:.*//' //找到以bash结尾的用户 再用sed去掉用户后面:开始的所有内容,留下的就是用户名
sed
用法1:前置命令 | sed [选项] '条件指令'
用法2:sed [选项] '条件指令' 文件.. ..
选项: -n 屏蔽默认输出 -r 支持扩展正则 -i 修改源文件
指令: p 输出 d 删除 s替换 a行下追加 i行上添加 c替换整行
以下列子中的文件内容可以自己写入如
:head /etc/passwd > usersed -n 'p' user //输出所有行
sed -n '1p' user //输出第1行
sed -n '2p' user //输出第2行
sed -n '3p' user //输出第3行
sed -n '2,4p' user //输出2~4行
sed -n '2p;4p' user //输出第2行与第4行
sed -n '2,+1p' user //输出第2行以及后面1行
sed -n '/^root/p' user //输出以root开头的行
sed -n '/root/p' user //输出包含root的行
sed -nr '/^root|^bin/p' user
将以上语句中的p指令改为d指令可以实现对应行的删除效果
比如sed -n '2p' user 改成 sed '2d' user 是删除第2行
sed -n '2!p' user //输出除了第2行的内容,加!是取反效果
sed '3,+1!d' user //删除第3行、第4行以外的行
sed -n '=' user //显示行号,=号在sed中可以显示行号
sed -n '$=' user //查看文档最后一行的行号,相当于查看文档总行数sed -i '$d' user //删除文档的最后一行并保存sed 's/2017/6666/' test.txt //把所有行的第1个2017替换成6666
sed 's/2017/6666/2' test.txt //把所有行的第2个2017替换成6666
sed '1s/2017/6666/' test.txt //把第1行的第1个2017替换成6666
sed '3s/2017/6666/3' test.txt //把第3行的第3个2017替换成6666
sed '3s/2017//3' test.txt //把第3行的第3个2017替换成空,相当
于删除
sed '/2024/s/2017/6666/' test.txt //找到有2024的行,将2017替换
成6666尝试将user文档中/bin/bash替换成/sbin/sh
sed '1s//bin/bash//sbin/sh/' user //直接替换,报错
sed '1s/\/bin\/bash/\/sbin\/sh/' user //使用转义符号可以
成功,但不方便
sed '1s!/bin/bash!/sbin/sh!' user //最佳方案,更改s的替换符
sed '1s@/bin/bash@/sbin/sh@' user //替换符号可以用所有
数字键上的sed 's/[0-9]//g' nssw.txt
sed 's/.//2;s/.$echo abc > abc //创建素材
sed -r 's/(a)(b)(c)/\3\2\1/' abc //替换abc时复制每一个字符,后面替换的内容用\数字粘贴,可以任意调换位置
echo xyz >> xyz //追加内容
sed -r 's/(a)(b)(c)/\3\2\1/' abc //再用之前的方法无法替换第2行
sed -r 's/(.)(.)(.)/\3\2\1/' abc //将具体字符用 . 替代即可,然后,再将追加abcd时,上述方案失灵
sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc //再次升级,分别找到第1个字符和最后1个字符,中间可以是任意
sed -r 's/^(.)(.*)(.)$/\3\2\1/' nssw.txt //达成需求
//' test sed -r 's/([A-Z])/(\1)/g' nssw.txt //先找到任意大写字母,然后保留,最后替换成带括号的状态sed 'a 666' user //所有行的下面追加666
sed '1a 666' user //第1行的下面追加666
sed '/^bin/a 666' user //在以bin开头的行的下面追加666
sed 'i 666' user //所有行的上面添加666
sed '5i 666' user //第5行的上面添加666
sed '$i 666' user //最后1行的上面添加666
sed 'c 666' user //所有行都替换成666
sed '1c 666' user //替换第1行为666sed -n '/bash$/s/:.*//p' /etc/passwd //用sed找到以bash结尾的用户
然后去掉用户后面:开始的所有内容,最后加p的作用是仅仅显示被
替换的行
awk
格式1:前置指令 | awk [选项] '[条件]{指令}'
格式2:awk [选项] '[条件]{指令}' 文件
指令:
print 输出
选项:
-F 定义分隔符
内置变量:
$1第1列 $2第2列 $3 ... $0所有列 NR行号 NF列号 awk '{print $1}' test.txt //输出所有行的第1列
使用正则
~包含 !~不包含
使用数字或者字符串
== != >= > <= <
逻辑组合
&&并且 ||或者
运算
/ * % + - .......
awk执行额外任务
BEGIN{ } 执行1次,读取文档之前执行
逐行任务 执行n次 ,读取文档时执行
END{ } 执行1次,读取文档之后执行
简单的例子:
awk '{print $1}' test.txt //输出所有行的第1列
awk '{print $3}' test.txt //输出所有行的第3列
awk '/the/{print $3}' test.txt //输出有the的行的第3列
awk '/the/{print NR}' test.txt //输出有the的行的行号
awk '{print NR}' test.txt //输出所有行的行号
awk '{print NF}' test.txt //输出所有行的列号
awk '{print $0,NR}' test.txt //输出所有列然后空格输出行号
head -5 /etc/passwd > user
awk -F: '{print $1}' user //使用-F:修改分隔符为冒号,输出第1列
awk -F: '{print $1,$7}' user //使用-F:修改分隔符为冒号,输出第1列空格第7列
awk -F: '{print $1,"的解释器是",$7}' user //输出常量加引号ifconfig eth0 | awk '/RX p/{print "服务器eth0网卡的接收流量是"$5"字节"}'
ifconfig eth0 | awk '/TX p/{print "服务器eth0网卡的发送流量是"$5"字节"}'
df -h | awk '/\/$/{print "根分区剩余容量是"$4}'awk -F: '$6~/bin/{print}' user //找第6列包含bin的行
awk -F: '$6!~/bin/{print}' user //找第6列不包含bin的行awk -F: 'NR==1{print}' user //输出第1行
awk -F: 'NR!=3{print}' user //输出除了第3行以外的行
awk -F: 'NR<4{print}' user //输出1~3行
awk -F: '$1=="root"{print}' user //输出第1列等于root的行
awk -F: '$1~/root/{print}' user //输出第1列包含root的行wk -F: '$3<10&&$7~/bash/' /etc/passwd //输出第3列(UID)小于10并且
第7列包含bash的行,当给了条件输出一整行时{print}可以省略不写
awk -F: 'NR>=2&&NR<=6' /etc/passwd //输出2~6行
awk -F: '$1~/root/||$3<=5' /etc/passwd //输出第1列包含root或者UID小
于等于5的行awk 'NR%2==0' user //输出偶数行
awk 'BEGIN{ }{ }END{ }' //使用时基本框架
awk 'BEGIN{print "xyz"}{print "xyz"}END{print "xyz"}' user //输出1
个xyz之后再根据user文档的行数输出5个xyz,最后再输出一个xyzawk 'BEGIN{print "User\tUID\tHome"}' //输出表头信息
awk -F: '{print $1"\t"$3"\t"$6}' user //输出内容,用户名,uid,家目录
awk 'END{print "总计"NR"行"}' user //最后输出行数awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6}
END{print "总计"NR"行"}' userawk '{print $1}' /var/log/httpd/access_log //可以找出访问者的ip,但是效果不完美,可以用后面的数组方式解决
awk,for,if循环实现高级搜索
awk 中使用if单分支,如果满足条件,就执行指令,不满足就不执行任何指令
if(条件){指令}
awk -F: 'BEGIN{x=0}{if($7~/bash/){x++}}END{print x}' /etc/passwd
#####统计系统中,有多少用户使用了bash,首先定义变量x,然后使用if判断如果每找到一行的$7包含bash,就把x+1,所有逐行任务结束后,最终使用end任务输出x的值,也就是找系统中使用bash作为解释器的用户数量
双分支,如果满足条件就执行指令,不满足就执行else后面的指令 if(条件){指令}else{指令}
awk -F: 'BEGIN{x=0;y=0}{if($7=="/bin/bash"){x++}else{y++}}END{print x,y}' /etc/passwd
//统计系统中使用bash作为解释器的用户,和没有使用bash的用户数量,使用if判断如果每找到一行的$7是/bin/bash,就把x+1,否则y+1,最后使用end输出x与y的值
多分支 {if (条件){指令}else if (条件){指令}else{指令}}
awk -F: '{if($7=="/bin/bash"){x++}else
if($7=="/sbin/nologin"){y++}else{z++}}END{print x,y,z}' /etc/passwd //统计系统中使用bash作为解释器的用户,使用nologin的用户,还有其他用户的数量,变量如果作为运算使用,并且初始值是0的 ,可以省略定义过程
数组可以用来收集信息
for循环可以循环输出数组的下标
cat abc.txta[abc]=0 a[abc]++ a[abc]=1
a[xyz]=0 a[xyz]++ a[xyz]=1
a[abc]=1 a[abc]++ a[abc]=2
awk '{a[$1]++}END{print a["abc"],a["xyz"]}' abc.txt //根据上述结果,得到如果
使用{a[$1]++}走完所有行便可收集到a[xyz]=1和a[abc]=2的结果,所以
在最后使用END任务输出a[abc]和a[xyz]的值就是 2和 1awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc.txt //使用for循环,循环显示
数组a的下标,与值,其中for(i in a)里面的i是变量,代表下标,in是语法不
能变,a是数组名awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log //将上述
的abc.txt文件替换成网站的日志,就可以最终用来查看日志得到可以得到
哪个ip来访以及来访的次数awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' /var/log/httpd/access_log | sort -nr
查看日志中某个ip的出现次数,以及ip,然后按降序排列,出现次数最大的
显示在第一行,sort命令可以实现排序效果,-n是以数字排序,-r是降序awk '/Failed password for root/{ip[$11]++}END{for(i in ip){print ip[i],i}}' /var/log/secure
//查看哪个ip登录root账户时输入错了密码,先输出次数,再输出ip
linux三剑客及正则表达(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 使用 ...
- 三剑客grep sed awk
三剑客 正则(RE)表达式 应用场景 规则 注意事项 正则符号 基础正则 扩展正则 正则实例 正则 VS 通配符 三剑客 grep sed sed核心应用 awk awk执行过程 内置变量 awk 正 ...
- linux grep sed awk
linux 文本编辑命令grep sed awk(转) grep grep (global search regular expression(RE) and print out the li ...
- 正则表达式与扩展正则表达式(grep, sed, awk)
Linux中用来在文件中搜索字符串的命令,如grep, sed, awk等命令支持正则表达式与扩展正则表达式. 1. 基础正则表达式 符号 解释 示例 * 匹配0次或多次 b.*t . 匹配任意字符 ...
- 15分钟搞定Linux三剑客 grep sed awk
剑客grep 来者何人 grep是linux上的字符串搜索匹配命令.这个名字来自于linux编辑器vim的一个命令g/re/p,表示全局匹配某个正则表达式并打印出来,这也体现了grep自身的功能. 基 ...
- Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)
shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...
- 【Linux】 字符串和文本处理工具 grep sed awk
Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...
- Linux Shell重定向 管道命令 grep搜索 awk编程 sed文件操作高阶函数
在编程中如果能够熟悉shell高阶语法,将对我们进阶为高级程序员有很大的帮助,本文将从Shell重定向 管道命令 awk编程 sed等方面展开介绍. 作者:有勇气的牛排 文章目录 1 shell重定向 ...
- linux 文本编辑命令grep sed awk
grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
最新文章
- 不要只是为您的代码做些毛-用Prettier修复它
- 项目实践:SpringBoot三招组合拳,手把手教你打出优雅的后端接口
- python中常用库_常用的python库(不断更新)
- 自然语言处理python进阶(一)
- php调用linux摄像头,Linux_在Linux操作系统上使用摄像头,我的公家笔记本的摄像头一直 - phpStudy...
- 用GDB Server进行远程调试
- @ModelAttribute使用详解
- c/c++ 标准库 string
- PHP 7.3 比 PHP 7.0 快 22%,即将进入特性冻结阶段
- java amount_java.time.Period.plus(TemporalAmount amountToAdd)方法
- mongorepository查询条件_Java操作MongoDB采用MongoRepository仓库进行条件查询 | 学步园...
- 应该怎样学习新知识?
- mysql 内连接、自然连接、外连接的区别
- 使用cloudcompare测量平面之间的距离
- 祝萍:后疫情时代,医美运营既要走心也要反套路
- 物联网案例研究:确保格兰仕智能设备不易受黑客攻击
- 《学习笔记》面向对象(四)多态,instanceof关键字,抽象
- 【基于贪心的树型动态规划】【NOI2007】追捕盗贼
- 数字化转型具体包含哪些内容?
- 高通MDM9628芯片数据参考