2.正则表达式
在计算机科学中,正则表达式是这样解释的:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式。
其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk 等,下面笔者就介绍一下这三种工具的使用方法。
【grep / egrep】
笔者在前面的内容中多次提到并用到grep命令,可见它的重要性。所以好好学习一下这个重要的命令吧。你要知道的是grep连同下面讲的sed, awk都是针对文本的行才操作的。
语法: grep [-cinvABC] ‘word’ filename
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
以下,笔者举几个小例子帮助你好好掌握这个grep工具的用法。
a. 过滤出带有某个关键词的行并输出行号
b. 过滤不带有某个关键词的行,并输出行号
c. 过滤出所有包含数字的行
在前面也提到过这个”[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。
这就表示筛选包含oo字符串,但是不包含r字符。
d. 过滤出文档中以某个字符开头或者以某个字符结尾的行
在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果。现在想一下,如何打印出不以英文字母开头的行呢?
e. 过滤任意一个字符与重复字符
“.”表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来。
“*”表示零个或多个前面的字符。
‘ooo*’ 表示oo, ooo, oooo … 或者更多的’o’。现在你是否想到了’.*’ 这个组合表示什么意义?
‘.*’表示零个或多个任意字符,空行也包含在内。
f. 指定要过滤字符出现的次数
这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即’oo’的行。注意,{ }左右都需要加上脱意字符’\’。另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘\{n1,n2\}’其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。
上面部分讲的grep,另外笔者常常用到egrep这个工具,简单点讲,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够可以胜任你的日常工作了。下面笔者介绍egrep不用于grep的几个用法。为了试验方便,笔者把test.txt 编辑成如下内容:
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a. 筛选一个或一个以上前面的字符
和grep 不同的是,egrep这里是使用’+’的。
b. 筛选零个或一个前面的字符
c. 筛选字符串1或者字符串2
中间有一个’|’表示或者的意思,笔者用这个用的很多,所以这个你最好记一下。
d. egrep中’( )’的应用
用’( )’表示一个整体,例如(oo)+就表示1个’oo’或者多个’oo’
【sed 工具的使用】
grep 工具的功能其实还不够强大,其实说白了,grep实现的只是查找功能,而它却不能实现把查找的内容替换掉。以前用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。
a. 打印某行 sed -n ‘n’p filename 单引号内的n是一个数字,表示第几行
b. 打印多行 打印整个文档用 -n ‘1,$’p
c. 打印包含某个字符串的行
上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用。
d. -e 可以实现多个行为
e. 删除某行或者多行
‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。
f. 替换字符或字符串
上例中的’s’就是替换的命令,’g’为本行中全局替换,如果不加’g’,只换该行中出现的第一个。
除了可以使用’/’外,还可以使用其他特殊字符例如’#’或者’@’都没有问题。
现在思考一下,如何删除文档中的所有数字或者字母?
有意思吧,[0-9]表示任意的数字。这里你也可以写成[a-zA-Z]甚至[0-9a-zA-Z]
g. 调换两个字符串的位置
这个就需要解释一下了,上例中用’()’把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符’\’,替换时则写成’\1’, ‘\2’, ‘\3’ 的形式。除了调换两个字符串的位置外,笔者还常常用到在某一行前或者后增加指定内容。
h. 直接修改文件的内容
sed -i ‘s/:/#/g’ test.txt ,这样就可以直接更改test.txt文件中的内容了。由于这个命令可以直接把文件修改,所以在修改前最好先复制一下文件以免改错。
sed常用到的也就上面这些了,只要你多加练习就能熟悉它了。为了能让你更加牢固的掌握sed的应用,笔者留几个练习题给你,希望你能认真完成。
1. 把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
2. 打印test.txt的3到10行;
3. 打印test.txt 中包含’root’的行;
4. 删除test.txt 的15行以及以后所有行;
5. 删除test.txt中包含’bash’的行;
6. 替换test.txt 中’root’为’toor’;
7. 替换test.txt中’/sbin/nologin’为’/bin/login’
8. 删除test.txt中5到10行中所有的数字;
9. 删除test.txt 中所有特殊字符(除了数字以及大小写字母);
10. 把test.txt中第一个单词和最后一个单词调换位置;
11. 把test.txt中出现的第一个数字和最后一个单词替换位置;
12. 把test.txt 中第一个数字移动到行末尾;
13. 在test.txt 20行到末行最前面加’aaa:’;
现在给出以上练习题的答案,你如果实在想不出如何操作,那你看看答案吧,请尽量多想一下。
1. /bin/cp /etc/passwd /root/test.txt ; sed -n '1,$'p test.txt
2. sed -n '3,10'p test.txt
3. sed -n '/root/'p test.txt
4. sed '15,$'d test.txt
5. sed '/bash/'d test.txt
6. sed 's/root/toor/g' test.txt
7. sed 's#sbin/nologin#bin/login#g' test.txt
8. sed '5,10s/[0-9]//g' test.txt
9. sed 's/[^0-9a-zA-Z]//g' test.txt
10. sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' test.txt
11. sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' test.txt
12. sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
13. sed '20,$s/^.*$/aaa:&/' test.txt
练习:查找/root/目录下是否存在该文件
答案一:
! /bin/bash
read -p "please input a file:" a
if [ -e $a ];then
echo "the file is exist!"
else
echo "the file is not exists!"
fi
答案二:
#! /bin/bahs
echo "enter a file name:"
read a
if test -e $a;then
echo "the file is exist!"
else
echo "the file is not exists"
fi
for循环的普通使用
答案一:
! /bin/bash
for i in `seq 1 10`
do
echo $i
done
答案二:
#! /bin/bash
for i in $(seq 1 10)
do
echo $i
done
本文参考了:正则表达式(http://www.92csz.com/study/linux/13.htm)
下一篇文章会详细说明grep的用法
转载于:https://blog.51cto.com/5609180/1850836
相关文章:
基于监督学习+自监督学习的智能抠图,精确到发丝 | CVPR 2020
来源 | AI算法与图像处理(ID:AI_study)华盛顿大学的研究者最近发表的论文在CVPR 2020提供了一个新的和简单的智能抠图方法。你可以在家里做这些日常设置,使用固定或手持相机。我们的方法也是最先进的,给出的输出可比专业的结果。在…

安装Jpype
1、下载JPype-0.5.4.2 2、 python setup.py install error: gcc -pthread -fno-strict-aliasing -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE2 -fexceptions -fstack-protector --paramssp-buffer-size4 -m64 -mtunegeneric -D_GNU_SOURCE -fPIC -fPIC -I/usr/lib/jvm…

SQL SERVER中带参数的返回
作者:网际浪子专栏(曾用名littlehb) http://blog.csdn.net/littlehb/ CREATE PROCEDURE LoginUser loginUN char(50) OUTPUT, loginPW char(40)ASif loginPW (select [password] from users where usernameloginUN) return 0;else ret…

Android Studio 编译单个module
前期自己要把gradle环境变量配置好 在Terminal中gradle命令行编译apk 输入gradle assembleRelease 会编译全部module编译单个modulecd ./xiruan //xiruan是module的名字 //意思是进入module目录gradle assembleRelease //编译出自己签名的apk //签名环境也要配置好gradle ass…

linux下文件字符集转化实战篇
linux下文件字符集转化实战篇------------------------------------------为什么转换编码,起因:分析应用程序日志,文件编码格式gb2312(含中文字符),通过linux shell脚本从日志中提取出需要的字段并生成有固…

如何得到数据库中所有表字段及字段中文描述
如何得到数据库中所有表字段及字段中文描述以下资料,通过csdn的一位师兄从SQL版主那得到:sql中SELECT (case when a.colorder1 then d.name else end) N表名, a.colorder N字段序号, a.name N字段名, (case when COLUMNPROPERTY( a.id,a.name,IsIdentity)1 then √else end)…
它估值25亿!被马云领投,是华为“老战友”,网友:也许股价能超茅台!
最近一条新闻被炒的沸沸扬扬:十年以来中国最大IPO,中芯国际将融资532亿元!何为IPO?翻译即为一家公司第一次向全社会公开售出它的股份。买的人越多,代表着社会对其信心越大。为什么2020年,能爆发这样1场最大…

改變人生的21種好習慣
當一個人生活枯燥的時候, 他忘了用心體會是一種習慣。 當一個人覺得人生乏味的時候, 他忘了培養幽默是一種習慣。 當一個人體力日差的時候, 他忘了運動建身是一種習慣。 當一個人工作疲憊的時候, 他忘了認真休息是一種習慣。 當一…
Python 编程语言的核心是什么?
作者 | Brett Cannon译者 | 弯月,责编 | 王晓曼头图 | CSDN下载自视觉中国出品 | CSDN(ID:CSDNnews)为什么要问这个问题?我想要用Python实现WebAssembly,这并不是什么秘密。这不仅可以让Python进入浏览器&a…

关闭页面不用提示的方法
Response.Write("<script>window.openernull;window.close();</script>") ;

VIM 必知必会12大类型操作
2019独角兽企业重金招聘Python工程师标准>>> VIM是在unix/linux系统下最常用的文本编辑器,呵呵……这就不用我再强调了,现在直接贴上vim的最常用的操作,方便日后温习及查阅! 1、插入 i 在光标前插入 I 在行首插入 a 在光标后插入 …

前后端分离的思考与实践(三)
Midway-ModelProxy — 轻量级的接口配置建模框架前言使用Node做前后端分离的开发模式带来了一些性能及开发流程上的优势(见《前后端分离的思考与实践 一》), 但同时也面临不少挑战。在淘宝复杂的业务及技术架构下,后端必须依赖Java搭建基础架构,同时提供…

替换HTML代码
将一些HTML替换掉 eg:strContentstrContent.Replace("&","&");strContentstrContent.Replace("","");strContentstrContent.Replace("<","<");strContentstrContent.Replace(">&quo…

什么是线程安全?
http://baike.baidu.com/view/1298606.htm 线程安全 目录 什么是线程安全?举例线程安全性线程安全程度不可变线程安全有条件的线程安全线程兼容线程对立什么是线程安全?举例线程安全性线程安全程度不可变线程安全有条件的线程安全线程兼容线程对立展开编…
中国开源大爆发进行时,你没掉队吧?
作者 | 陈利鑫头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从开源(Open Source)一词提出到如今,开源的概念越来越成熟,作为一种创造及协作模式,开源已经不仅仅局限于软件技术…

eclipse设置
2019独角兽企业重金招聘Python工程师标准>>> eclipse 下载 地址 http://www.eclipse.org/downloads/packages/release/Ganymede/SR2 设置 jdk 参数 jre definition vm arguments -Xms800m -Xmx800m -XX:MaxNewSize256m -XX:MaxPermSize256m -Dfile.encod…
吊打一切:YOLOv4的tricks汇总
来源 | AI算法与图像处理(ID:AI_study)即使是目标检测在过去几年开始成熟,竞争仍然很激烈。如下所示,YOLOv4声称拥有最先进的精度,同时保持高处理帧速率。它在 MS COCO数据集上,使用Tesla V100以接近65 FPS…

如何播放RM文件?
<EMBED SRC"MY_LIFE.RPM" WIDTH300 HEIGHT134 >Tip:SRC是可以省略的,当mime Type 参数如下时:<EMBED ...,TYPE"audio/x-pn-realaudio-plugin",...>,这样做会产生不可预料的结果,因此强烈推荐你包…

mongodb地理位置索引实现原理
地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B Tree,如何将地理位置转化为可建立BTree的形式,下文将为你描述。 首先假设我们将需要索引的…

NSMakeRange基础函数应用
NSRange NSMakeRange (NSUInteger loc,NSUInteger len );这是官方得接口描述。loc 为location缩写,len 表示长度。作用:在loc指定得位置开始往后获取len长度个得元素。示例程序使用这个函数来为指定数组得某个位置向后指定长度得元素集合。如NSRange NSM…

上传图片,要求图片200100象素,大小小于2M
作者:网际浪子专栏(曾用名littlehb) http://blog.csdn.net/littlehb/上传图片,要求图片200100象素,大小小于2M,如果图片不符合要求,不能上传,否则上传图片,上传以后对图…
炸裂!这些大厂跪求的人才太牛了!
今年所有的互联网公司都在ALL in AI,百度、腾讯、阿里巴巴、京东等互联网巨头都在四处挖掘AI人才。AI的岗位需求很多,几乎每天都有数百个JD放出。而亿欧智库发布的《2020全球人工智能人才培养研究报告》提到,近4年AI人才的需求量以每年74%的速…

新春祝福必杀计之发送短信攻略
新的一年就要到了,陆陆续续的收到很多同事们的短信祝福,哎,不能欠人家的人情债啊,但是我实在是个懒人啊,这个祝福短信还是要回复的啊,我的手机里有超过百位联系人,全是和工作有关的,…
centos6.5环境DNS-本地DNS主从服务器bind的搭建
centos6.5环境DNS-本地DNS主从服务器bind的搭建在上一篇博客中我已经搭建好了一个本地DNS服务器,能够实现正向反向解析,那么我们只需要加入一台从DNS服务器即可完成,我们来开始配置主从服务器:一.主DNS服务器上面的额外…
再见,Python!
结合我最近这些年的 Python 学习、开发经验,发现近90%的程序员在学 Python 时都会遇到下面这3个问题:1.想学Python,但不知从何学起,应用方向太多了也不知道该选择什么方向...2.基础入门看似简单,但是进阶实战就举步维艰…

如何更新父窗体
Response.Write("<script languagejavascript>window.opener.locationwindow.opener.location.href;</script>") 第一种方案是:file a.htm function OpenDialog(url,param){return window.open(url,param, "DialogWidth:450px;DialogH…

文件体积单位的换算
单位转换(参考): 1bit(这个比特表示一个二进制数字) 1Byte(这个单词音译过来也叫“比特”但是表示一个十六进制的数字) 1B1Byte8bit 1 kB 1024 B (kB - kilobyte) 千 1 MB 1024 kB (MB - mega…

防止盗链下载问题
经常在网络上四处载东西,有时碰到直接拷贝一个类似 http://193.100.100.56/TestWebSolution/WebApplication1/test.rar地址准备下载test.rar文件时,却被告知没有登录或者直接跳转到其他页面的情况,然后等登录后直接下载该文件。要实现上面情况…
中国人工智能市场破 50 亿!你还不了解 AI 云服务吗?
作者 | 马超责编 | 伍杏玲出品 | CSDN(ID:CSDNnews)从AI的发展趋势来看,最新的人工智能模型对于算力的要求往往较高,如谷歌的T5,其整个模型的参数数量达到了惊人的 110 亿,谷歌科学家更在T5的论…

Java中数据存储方式
2019独角兽企业重金招聘Python工程师标准>>> 1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你…