shell中的正则表达式、编程-grep、编程-SED、以及编程-AWK

正则表达式RE

用来处理文本

正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间;
例如/l[oO]ve/就是由正斜杠界定的正则表达式, 它将匹配被查找的行中任何位置出现的相同模式. 在正则表达式中,元 字符是最重要的概念
元字符使正则表达式具有处理能力。所谓元字符就是指ß那些在正则表达式中具有特殊意义的专用字符,可以用来规定 其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

正则表达式基本元字符

基本正则表达式元字符
元字符
示例                                 功能
^                                      行首定位符
^love(匹配以love开头)

$                                      行尾定位符
love$(匹配以love结尾)

.                                       匹配单个字符
l..e  (匹配以中间为任何字符且l开头e结尾)

*                                       匹配前导符0到多次       全部匹配    grep "o*" /etc/passwd
ab*love(匹配ab开头love结尾)

.*                                      匹配任意多个字符  (贪婪匹配

[ ]                                      匹配方括号中任意一个字符
[lL]ove(匹配love或Love)

[ - ]                                    匹配指定范围内的一个字符
[a-z0-9]ove            

[^]                                     匹配不在指定组里的字符
[^a-z0-9]ove

\                                       用来转义元字符
love\.                  

\<                                      词首定位符 #由数字或字母组成的
\<love
​        
\>                                      词尾定位符
love\>

正则表达式拓展元字符

= 等于 != 不等于  =~  匹配
扩展正则表达式元字符
+                                        匹配一个或多个前导字符
[a-z]+ove

?                                        匹配零个或一个前导字符
lo?ve
"r.*t"                                  贪婪匹配
-P "r.*?"                            非贪婪匹配

a|b                                     匹配a或b
love|hate

()                                        组字符loveable|rs
love(able|rs) ov+ ov+ (ov)+
(oo)+                                  两个oo出现一次或者多个

(..)(..)\1\2                            标签匹配字符  #
(love)able\1er

x{m}                                   字符x重复m次
o{5}
o{,3}                                   字符最多出现3次
x{m,}                                  字符x重复至少m次
o{5,}                                   字符最少出现5次

x{m,n}                                字符x重复m到n次
o{5,10}                               字符o重复5到10次

shell 编程-grep

常见参数
egrep 支持正则表达式的拓展元字符 (或grep  -E)
grep -v  除它

配合正则练习

例:
编辑文件lianxi.txt内容如下
Two roads diverged in a yellow wood,

And sorry I could not travel both

And be one traveler, long I stood

And looked down one as far as I could

To where it bent in the undergrowth;

Then took the other, as just as fair,

And having perhaps the better claim,

Because it was grassy and wanted wear;

Though as for that the passing there

Had worn them really about the same,

And both that morning equally lay

In leaves no step had trodden black.

Oh, I kept the first for another day!

Yet knowing how way leads on to way,

I doubted if I should ever come back.

I shall be telling this with a sigh

Somewhere ages and ages hence:

Two roads diverged in a wood,and I—

I took the one less traveled by,

And that has made all the difference.

1、从文本中查找包含字符串"yellow"的行
grep  "yellow" lianxi.txt

2、从文本中查找包含字符串"travel"或"traveler"的行
egrep  'travel|traveler'   lianxi.txt

3、从文本中查找以字母"T"开头的行
grep "^T" lianxi.txt

4、从文本中查找以字母";"结尾的行
grep ";$" lianxi.txt

5、从文本中查找包含单词"fair"的行
grep   "<fair"   lianxi.txt

6、从文本中查找以字母"i"和字母'e'结尾的行
grep "[ie]$" lianxi.txt

7、从文本中查找包含两个字母"o"的行
egrep  "o{2}"  lianxi.txt

8、从文本中查找包含三个或更多连续字母"o"的行
egrep   "o{3,}"   lianxi.txt

9、从文本中查找以大写字母开头的单词的行
grep  "^[A-Z]" lianxi.txt

10、从文本中查找以小写字母开头的单词,但不包含大写字母的单词的行

egrep "^[a-z]" lianxi.txt | egrep -v [A-Z]

11、从文本中查找至少包含一个数字的行
grep "[0-9]" lianxi.txt

12、从文本中查找所有"n"的前导字符不是"i"和"k"的所有内容
egrep "[^ki]n" lianxi.txt

shell 编程-SED(流文本编辑器)


非交互式编辑器,一次处理一行内容。


sed "参数"  '模式'

常用参数  
-f 指定一个规则文件
-n 阻止输入行输出
-r 扩展正则

常用模式
s 替换  
g 整行(也可以是数字,替换第几个)
d 删除
p 打印
a 追加
i 是插入
#sed 's/新值/旧值/' 文件名

使用多重指令时用;隔开:
# sed 's/新值/旧值/; s/新值/旧值/' 文件名

使用脚本文件:
脚本:namestate
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
$ sed -f namestate 文件名
保存输出:
$ sed -f namestate 文件名 > 对文件脚本后生成的新文件名
阻止输入行自动显示:
$ sed -n 's/MA/Massachusetts/p' file1.txt

sed流编辑器用法及解析

sed: stream editor(流编辑器)的缩写. 它们最常见的用法是进行文本的替换.
实用案例:

删除文件的第1行
#sed '1d'  文件名

删除文件的第1到2行
#sed '1,2d'   文件名

删除第2行到最后一行
#sed '2,$d'   文件名

匹配到root,删除此行
#sed '/root/d' 文件名

匹配到root行,到某一行
#sed '/root/,2d' 文件名

删除奇数行
#sed '1~2d'  文件名

删除偶数行
#sed '0~2d' 文件名

运用正则配合练习

拷贝/etc/passwd 文件到/opt下练习
cat -n /etc/passwd >> /opt/passwd
cd /opt/

1. 显示passwd文件的3-9行:
   sed -n "3,9p" passwd

2. 显示包含oo字符串的行到包含gin字符串的行:
sed '/oo/,/gin/p' passwd

3. 在文件第一行添加haha,文件结尾添加yesyes:
    sed -i '1i\haha' passwd
    sed -i '$a\yesyes' passwd

4. 用hahaha替换oo,打印前20行:
    sed -i 's/oo/hahaha/g' passwd
   sed -n '1,20p' passwd

5. 删除空行和以#开头的行:
 sed -i '/^$/d;/^#/d' passwd

6. 取出一个文件路径的目录名称:
    echo $( cd $( dirname $0 ) ; pwd)

7. 在第8行下面插入hahaha第10行上面插入lalala:
    sed -i '8a\hahaha;' passwd
    sed -i '10i\lalala' passwd

8. 删除10到20行最后一个字符:
    sed -i '10,20s/.$//g' passwd
9. 文件中出现所有sbin都被替换成hahaha,只有发生变化的行才被打印:
    sed -i "s/sbin/hahaha/gp" passwd

10. 解除文件注释,并删除4-6行:
    sed -i 's/^#//g' passwd
    sed -i '4,6d' passwd
11. 删除1-3行并用root替换sbin:
    sed -i '1,3d' passwd
    sed -i 's/sbin/root/g' passwd

12. 删除1-8行并打印1-20行:
    sed -i '1,8d' passwd -e sed -n '1,20p' passwd

13. 删除所有包含var的行:
    sed -i '/var/d' passwd

14. 把10行以后的末尾加上cloud:
    sed -i '10,$ s/$/cloud/g' passwd
15. 打印第1到10行,删除5行后面所有的行:
    sed -n '1,10p' passwd && sed -i '5,$d' passwd 
16. 将字符串/var替换成/hahaha,打印10,20行:
    sed -i 's/var/hahaha/g' passwd && sed -n "10p;20p" passwd

shell 编程-AWK

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

awk处理过程: 依次对每一行进行处理,然后输出 默认分隔符是空格或者tab键

awk 参数 'BEGIN{处理之前要做的} {处理内容} END{处理之后的内容}
BEGIN{}
行处理前
{处理内容}
END{}
行处理 行处理后

awk工作原理
awk -F":" '{print $1,$3}' /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束

(2)然后,行被:分解成字段,每个字段存储在已编号的变量中,从$1开始

(3)awk如何知道空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符,初始时,FS赋为空格或者是tab

(4)awk打印字段时,将以设置的方法,使用print函数打印,awk在打印的字段间加上空格,因为$1,$3间有一个,逗号。逗 号比较特殊,映射为另一个变量,成为输出字段分隔符OFS,OFS默认为空格

(5)awk打印字段时,将从文件中获取每一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程持续到处理文件结束。

默认分隔符是空格或者tab键


awk中的特殊变量:
常用:
- NR: 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号
- NF: 表示字段数量, 当awk将行为记录时, 该变量相当于当前列号

难理解:
FS(输入字段分隔符)   # 以什么符号去分割
OFS(输出字段分隔符)  # 以什么分隔符显示
NR(Number of record)行数  
FNR按不同的文件分开
RS(输入记录分隔符)
ORS(输出记录分隔符)
NF 字段个数

AWK实用理解案例

拷贝/etc/passwd 文件到/opt下练习
cat -n /etc/passwd >> /opt/passwd
cd /opt/

1. 打印文件中的第2列和第3列

awk '{ print $2, $3}' passwd

2. 打印3行指定列的第7列字符

 awk -F":" 'NR==3{ print $7 }'  passwd

3. 统计文件的行数

 awk '{ print NR}' passwd

4. 在脚本中, 传递变量到awk中
var=1000
echo | awk -v VARIABLE=$var '{ print VARIABLE }'

5.  指定字段分隔符-F或在BEGIN{ FS=":" }
$ awk -F: '{ print $2, $3 }' passwd
$ awk 'BEGIN{ FS=":" }{ print $2, $3 }' passwd

6.  在awk中使用for循环 (了解)
每行打印两次

# awk -F: '{for(i=1;i<=2;i++) {print $0}}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

分别打印每行每列
# awk -F: '{ for(i=1;i<=NF;i++) {print $i}}' passwd

7.  在awk中使用if条件判断 (了解)
显示管理员用户名
awk -F: '{if($3==0) {print $1 " is administrator."}}'passwd

统计系统用户
awk -F":" '{if($3>0 && $3<1000){i++}} END{print i}' /passwd

感谢观看!希望能够帮助到大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 如何 配置端口号

结论 server:port: 8088演示 [Ref] 快速构建SpringBoot项目

是时候扔掉cmder, 换上Windows Terminal

作为一个Windows的长期用户&#xff0c;一直没有给款好用的终端&#xff0c;知道遇到了 cmder&#xff0c;它拯救一个习惯用Windows敲shell命令的人。 不用跟我安利macOS真香&#xff01;公司上班一直用macOS&#xff0c;一方面确实更加习惯windows下面学习, 另一方面是上课需要…

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展&#xff0c;web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求&#xff0c;许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西&#xff0c;…

Python将Labelme文件的真实框和预测框绘制到图片上

Python将Labelme文件的真实框和预测框绘制到图片上 前言前提条件相关介绍实验环境Python将Labelme文件的标注信息绘制到图片上代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专…

深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

为什么要看源码&#xff1a; 1、提升技术功底&#xff1a; 学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底 2、深度掌握技术框架&#xff1a; 源码看多了&#xff0c;对于一个新技术…

猫头虎分享已解决Bug || Error: ImagePullBackOff (K8s)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

快速幂算法总结

知识概览 快速幂可以在O(logk)的时间复杂度之内求出来的结果。 例题展示 快速幂 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/877/ 代码 #inc…

电子学会2023年12月青少年软件编程(图形化)等级考试试卷(一级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(一级) 分数:100 题数:37 一、单选题(共25题,共50分) 1. 观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?( )

Python武器库开发-武器库篇之端口扫描器开发(四十四)

Python武器库开发-武器库篇之端口扫描器开发(四十四) 端口是计算机网络中用于区分不同应用程序或服务的逻辑概念。计算机通过端口号来识别数据包应该发送给哪个应用程序或服务。在互联网协议&#xff08;IP&#xff09;中&#xff0c;端口号是16位的数字&#xff0c;范围从0到…

计算机毕业设计 基于javaweb的学生交流培养管理平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

软件测试|测试平台开发-Flask 入门:URL组成部分详解

简介 Flask 是一款流行的 Python Web 框架&#xff0c;它简单轻量而灵活&#xff0c;适用于构建各种规模的 Web 应用程序。在 Flask 中&#xff0c;URL&#xff08;Uniform Resource Locator&#xff09;是指定 Web 应用程序中资源的唯一标识符。URL 组成部分是构成一个完整 U…

IDEA卡在”正在解析Maven依赖项“的解决方法

修改Maven镜像&#xff0c;修改Maven镜像为阿里云镜像 1.文件路径 C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\plugins 2.因为我使用的是InteliJ idea 自带的Maven&#xff0c;所以直接去idea 插件安装目录&#xff0c;找到Maven插件&#xff0c;找到setting.xml 文…

数据库系统-甘晴void学习笔记

数据库系统笔记 计科210X 甘晴void 202108010XXX 教材&#xff1a;《数据库系统概论》第6版 &#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文章目录 数据库系统<br>笔记第一篇 基础篇1 绪论1.1数据库系统概述1.2数据模型1.3数据库系统的结构(三级模式结构…

【代码随想录算法训练营-第七天】【哈希表】454,383,15,18

454. 四数相加 II 第一遍 思路 想不出来&#xff0c;除了暴力解法&#xff0c;完全想不出来其他解法&#xff0c;看答案思路了…学习了两个新的方法&#xff1a; getOrDefault&#xff1a;返回指定键对应的值&#xff0c;如果不存在&#xff0c;则返回默认值containsKey&…

LiveGBS流媒体平台GB/T28181功能-国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选

LiveGBS功能国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选 1、国标级联2、只看已选3、只看未选4、搭建GB28181视频直播平台 1、国标级联 LiveGBS可以作为下级平台&#xff0c;级联到第三方国标平台&#xff0c;详见&#xff1a; LiveGBS国标GB/T28181流…

支持API文档生成,API管理工具:Apipost

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间沟通和数据交换的关键。而在API开发和管理过程中&#xff0c;API文档、调试、Mock和测试的协作显得尤为重要。Apipost正是这样一款一体化协作平台&#xff0c;旨在解决这些问题&#xf…

Java网络爬虫--概述与原理

目录标题 基本概念与原理爬虫与搜索系统的关系爬虫运行原理爬虫步骤DNS域名解析 爬虫开发本质网络爬虫的分类通用网络爬虫聚集网络爬虫增量式网络爬虫Deep Web爬虫 参考文献 基本概念与原理 爬虫又叫网络蜘蛛&#xff0c;一种运行在互联网上用来获取数据的自动程序。 互联网的…

可狱可囚的爬虫系列课程 10:在网站中寻找 API 接口

上一篇文章我们讲述了爬虫中一个比较重要的知识点&#xff0c;如何从 API 接口中获取数据&#xff0c;本篇文章我们继续讲述&#xff0c;如何在网站中寻找 API 接口&#xff0c;我们以“今日头条”网站 https://www.toutiao.com/ 为例。 如上图所示&#xff0c;如果要获取页面…

洗地机哪种牌子好?智能洗地机排行

选择一款性能稳定、使用方便的洗地机&#xff0c;对于家庭清洁至关重要。近年来&#xff0c;随着懒人经济的兴起&#xff0c;智能家电不断涌现。特别是在家居清洁领域&#xff0c;人们追求更加轻松便捷的清洁体验。洗地机行业近年来迎来了快速增长&#xff0c;各大厂商竞相推出…

C#,数值计算,矩阵相乘的源代码与数据可视化

俺玩数学&#xff0c;你玩技巧&#xff0c;俺不如你&#xff0c;佩服佩服&#xff01; 一、矩阵乘法的基本概念 定义&#xff1a;矩阵 A ∈ Rmn 和B ∈ Rnp 的乘积为矩阵C∈ Rmp 。 限制&#xff1a;矩阵A的列数应该与矩阵B的行数相等。 算法&#xff1a;矩阵A的第一行每个元…