QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码
查看: 223|回复: 0

[学习笔记] 正则表达式--grep的进阶练习

[复制链接]
最佳答案
0 
累计签到:87 天
连续签到:5 天
发表于 2017-8-30 20:29:36 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 Zbrel 于 2017-8-30 20:55 编辑

grep的进阶选项
grep [-A] [-B] [--color=auto] ‘搜寻字符串’ filename
-A        后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来;
-B        后面可加数字,为before的意思,除了列出该行外,前面的n行业列出来;
--color=auto        可将正确的那个撷取数据列出颜色
例如:用dmesg列出核心讯息,再以grep找出内含eth的行:dmesg|grep ‘eth’
将上例中捕捉到的关键词显色,且加上行号来表示:dmesg|grep -n --color=auto ‘eth’
将上题中关键词所在行的前两行和后三行一起显示:
dmesg|grep -n -A3 -B2 --color=auto ‘eth’

基础正则表达式练习
1.搜寻指定字符串
① 从档案1.txt中取得the这个字符串并显示行号:grep -n ‘the’1.txt
② 反向选择,显示没有the的行:grep -vn ‘the’1.txt
③ 取得不论大小写的the的行:grep -in ‘the’1.txt

2.利用中括号[]来搜寻集合字符
① 如果想要搜寻test或taste这两个字符串时,可以发现,它们有共同的‘t?st’,因此可以这样来搜寻:grep -n ‘t[ae]st’ 1.txt        ,[]里面不论有几个字符,它都仅代表一个字符。
② 搜寻有oo的字符,但不想要oo前面有g,可以利用反向选择^来达成:
grep -n ‘[^g]oo’ 1.txt
③ oo前面不想要有小写字符:
grep -n ‘[^a-z]oo’ 1.txt 或grep -n ‘[^[:lower:]]oo’ 1.txt
④ 取有数字的那一行:grep -n ‘[0-9]’ 1.txt或grep -n ‘[[:digit:]]’ 1.txt

3.行首与行尾字符^$
①        只想要出现在行首的the:grep -n ‘^the’ 1.txt
②        想要列出开头是小写字符的行:
grep -n ‘^[a-z]’ 1.txt或grep -n ‘^[[:lower:]]’ 1.txt
③        不想要开头是英文字母:
grep -n ‘^[^a-zA-Z]’ 1.txt或grep -n ‘^[^[:alpha:]]’ 1.txt       
注意哦,^符合在字符集结符合[]之内与之外是不同的,在[]内表示反向选择,在[]之外表示定位在行首。
④        想要找出行尾结束为小数点(.)的那一行:grep -n ‘\.$’ 1.txt
因为小数点具有其他意义,所以必须要使用跳脱字符(\)来解除其特殊意义
⑤        想要找出空白行,即该行没有输入任何数据:grep -n ‘^$’ 1.txt
因为只有行首和行尾,所以这样就找出空白行了。
⑥        不想要空白行与开头为#的批注行:grep -v ‘^&’ 1.txt|grep -v ‘^#’
-v ‘^&’表示不要空白行;-v ‘^#’表示不要开头是#的行。

4.任意一个字符.与重复字符*
小数点(.)表示一定有一个任意字符;
星号(*)表示重复前面字符0次到无穷多次,为组合形态
① 需要找出4个字符,开头是g而结束是d的字符串:grep -n ‘g..d’ 1.txt
② o*表示拥有空字符或一个 o 以上的字符,因为允许空字符,因为将会把所有的数据都打印到屏幕上;oo*即凡是含o都可以被列出来;ooo*表示至少两个o以上的字符串才会被列出来;想要字符串开头与结尾都是g,但是两个g之间仅能存在至少一个o:
grep -n ‘goo*g’1.txt
③ 想要找出g开头与g结尾的字符串,当中的字符可有可无:grep -n ‘g.*g’1.txt
因为 * 可以是 0或多个重复前面的字符,而 . 是任意字符,所以 .* 就代表零个或多个任意字符。
④ 想要找出任意数字的行:
grep -n ‘[0-9][0-9]*’ 1.txt或grep -n ‘[0-9]’ 1.txt

5.限定连续RE(Regular Expression的简称,即正则表达式)字符范围{}
可以利用 . 与 RE 字符及 * 来设定 0 个到无限多个重复字符,但是如果只需要找出2-5个o的连续字符串呢?这是就可以使用限定范围的字符{}了。由于{与}在shell具有特殊意义,因此必须使用跳脱字符\来让它失去特殊意义才行。
① 找到两个o的字符串:grep -n ‘o\{2\}’ 1.txt
② 找出g后面接2-5个o,然后再接一个g的字符串:grep -n ‘go\{2,5\}g’ 1.txt
③ 找到至少两个o的字符串:grep -n ‘o\{2,\}’ 1.txt

评分

参与人数 1鱼币 +2 收起 理由
小甲鱼 + 2

查看全部评分

本帖被以下淘专辑推荐:

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /3 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-19 12:54

快速回复 返回顶部 返回列表