shell基础-05 grep与正则(文件内容查询、正则应用、逻辑否、逻辑和、逻辑或)
文章目录
前言:
本文仅限于grep的正则应用。
标准正则、扩展正则等见文档 《正则》
1. 简单应用
1.1 语法
grep [选项] “查找内容” 文件1 文件2
返回值:
0
,找到。1
,没找到。2
,找不到指定文件。
1.2 选项
-i
:忽略大小写
-n
:在每一行前面加上它在文件中的相对行号
-c
:显示成功匹配的行数
-s
:禁止显示文件不存在或文件不可读的错误信息
-q
:静默
-v
:只显示不匹配的行
-R
,-r
:递归
--color
: 颜色
-o
:只显示匹配的内容
-B3
:显示匹配行和前面3行的内容(注意不空格)
-A3
:显示匹配行和后面3行的内容
-C3
:显示匹配行和前后3行的内容
1.3 示例
已有文件及内容如下:
# cd /tmp/test
# cat 1.txt
abc
#cat 2.txt
ABC
#cat 3.txt
123
abc
123
#cat a/a1.txt
abc
- 列出指定目录下包含abc的文件名
# grep abc /tmp/test/*
/tmp/test/1.txt:abc
/tmp/test/3.txt:abc
grep: /tmp/test/a: 是一个目录
- 列出指定目录及子目录下包含123的文件名
# grep -r abc /tmp/test/*
/tmp/test/1.txt:abc
/tmp/test/3.txt:abc
/tmp/test/a/a1.txt:abc
- 列出abc所在行的序号
# grep -n abc /tmp/test/*
/tmp/test/1.txt:1:abc
/tmp/test/3.txt:2:abc
grep: /tmp/test/a: 是一个目录
- 列出passwd中root用户及后边3行内容
# grep -A3 ^root --color /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
2. 正则应用
- grep支持的元字符
^, $, ., *, [], [^], < >,(),{}
- 扩展元字符
语法:# egrep
或 # grep -E
元字符集: ?, +, { }, |, ( )
注:grep也可以使用扩展集中的元字符,仅需要对这些元字符前置一个反斜线
- 其他
\w
所有字母与数字
\W
非字符(所有字母与数字之外的字符) ‘love[^a-zA-Z0-9]+’ ‘love\W+’
\b
词边界 ‘\blove\b’ 等同于’<love>'</love>
【示例】列出所有包含数字和字母的文件名
# grep "\w" /tmp/test/*.txt
/tmp/test/1.txt:abc
/tmp/test/2.txt:ABC
/tmp/test/3.txt:123
/tmp/test/3.txt:abc
/tmp/test/3.txt:123
说明:
\w
必须加引号
3. 逻辑应用
grep 的 and、or、not
3.1 逻辑否(not)
- 语法
# grep -v
3.2 逻辑和(and)
- 两个层grep
# cat 1.txt |grep AAA | grep BBB
- 用正则匹配
3.3 逻辑或(or)
3.3.1 利用符号|
不推荐,感觉写起来比较乱
- grep直接执行
# grep '1\|3' 1.txt
说明:引号必须(单双没有区别)、
|
必须有、\
必须有
- grep -E 或 egrep
# grep -E '1|3' 1.txt
说明:和前例区别就是不用加反斜杠
3.3.2 grep -e
# grep -e 1 -e 3 1.txt
3.3.3 利用数组
- 使用数组
不建议,会被打碎为单个字符
# grep "[ac]" *
1.txt:abc
3.txt:abc
说明:
[ ] 里的内容会被认为是一个个分开的字符
里边的符号也被当做字符处理(除 -之外),这一点是和shell数组的区别。
- 连续区间
# grep "[a-c]" *
1.txt:abc
3.txt:abc