Linux_Shell脚本学习第四章-让文本飞(上)

一、使用正则表达式

1.1 正则表达式的规则

1.1.1 位置标记

**位置标记锚点(position marker anchor)是标识字符串位置的正则表达式。**默认情况下,正
则表达式所匹配的字符可以出现在字符串中任何位置,如下图。
在这里插入图片描述

1.1.2 标识符

标识符是正则表达式的基础组成部分。它定义了那些为了匹配正则表达式,必须存在(或不
存在)的字符,如下图。
在这里插入图片描述

1.1.3 数量修饰符

一个标识符可以出现一次、多次或是不出现。数量修饰符定义了模式可以出现的次数,如下图。
在这里插入图片描述

1.1.4 其他一些特殊字符可以调整正则表达式的匹配方式

在这里插入图片描述

1.2 正则表达式的例子

1.2.1 能够匹配任意单词的正则表达式
( +[a-zA-Z]+ +)

开头的+表示需要匹配一个或多个空格。字符组[a-zA-Z]用于匹配所有的大小写字母。随后的+
表示至少要匹配一个字母,多者不限。最后的+表示需要匹配一个或多个空格来终结单词
这个正则表达式无法匹配句子末尾的单词。

1.2.2 匹配句尾或是逗号前的单词
( +[a-zA-Z]+[?,.]? +)

[?,.]?表示仅需要匹配问号、逗号或点号中的一个。

1.2.3 匹配ip地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

[0-9]表示匹配数字。{1,3}表示至少一位数字,至多三位数字:
或者也可以使用[[:digit:]]表示数字:

[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}

1.3 处理特殊字符

正则表达式用$、^、.、*、+、{以及}等作为特殊字符。但是如果我们希望将这些字符作
为普通字符使用,应该怎么做呢?来看一个正则表达式:a.txt。
该正则表达式能够匹配字符a,然后是任意字符(由.负责匹配),接着是字符串txt。但是我们希望.能够匹配字面意义上的.,而非任意字符。因此需要在.之前加上一个反斜线\(这叫作“字符转义”)。这表明正则表达式希望匹配的是字面含义,而不是它所代表的特殊含义。因此,最终的正则表达式就变成了a.txt。

二、使用grep 在文件中搜索文本

2.1 在stdin中搜索匹配特定模式的文本行

$ echo -e "this is a word\nnext line" | grep word
this is a word

2.2 在文件中搜索匹配特定模式的文本行

$ grep pattern filename
this is the line containing pattern

或者

$ grep "pattern" filename
this is the line containing patter

2.3 在多个文件中搜索匹配特定模式的文本行

$ grep "match_text" file1 file2 file3 ...

2.4 选项–color可以在输出行中着重标记出匹配到的模式。

尽管该选项在命令行中的放置位置没有强制要求,不过惯常作为第一个选项出现。

$ grep --color=auto word filename
this is the line containing word

2.5 grep命令默认使用基础正则表达式

这是先前描述的正则表达式的一个子集。选项-E可以使grep使用扩展正则表达式。也可以使用默认启用扩展正则表达式的egrep命令

$ grep -E "[a-z]+" filename

或者

$ egrep "[a-z]+" filename

2.6 选项-o可以只输出匹配到的文本

$ echo this is a line. | egrep -o "[a-z]+\."
line

2.7 选项-v可以打印出不匹配match_pattern的所有行

$ grep -v match_pattern file

2.8 选项-c能够统计出匹配模式的文本行数

$ grep -c "text" filename
10

需要注意的是-c只是统计匹配行的数量,并不是匹配的次数。例如:

$ echo -e "1 2 3 4\nhello\n5 6" | egrep -c "[0-9]"
2

尽管有6个匹配项,但egrep命令只输出2,这是因为只有两个匹配行。在单行中出现的
多次匹配只被计为一次。

2.9 统计文件中匹配项的数量

$ echo -e "1 2 3 4\nhello\n5 6" | egrep -o "[0-9]" | wc -l
6

2.10 选项-n可以打印出匹配字符串所在行的行号

$ cat sample1.txt
gnu is not unix
linux is fun
bash is art
$ cat sample2.txt
planetlinux
$ grep linux -n sample1.txt
2:linux is fun

或者

$ cat sample1.txt | grep linux -n

如果涉及多个文件,该选项也会随输出结果打印出文件名

$ grep linux -n sample1.txt sample2.txt
sample1.txt:2:linux is fun
sample2.txt:2:planetlinux

2.11 选项-b可以打印出匹配出现在行中的偏移

配合选项-o可以打印出匹配所在的字符或字节偏移。

$ echo gnu is not unix | grep -b -o "not"
7:not

字符在行中的偏移是从0开始计数,不是1。

2.12 选项-l可以列出匹配模式所在的文件

$ grep -l linux sample1.txt sample2.txt
sample1.txt
sample2.txt

和-l效果相反的选项是-L,它会返回一个不匹配的文件列表。

2.13 递归搜索多个文件

如果需要在多级目录中对文本进行递归搜索,可以使用下列命令

$ grep "text" . -R -n

命令中的.指定了当前目录。例如:

$ cd src_dir
$ grep "test_function()" . -R -n
./miscutils/test.c:16:test_function();

等价于

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值