grep
程序员文章站
2024-02-23 23:21:48
...
grep的一般使用
格式:
grep [选项] PATTERN filename filename ...
过滤文件
# grep 'Tom' /etc/passwd
# grep 'bash shell' /etc/test
过滤标准输入或管道
grep 程序的输入可以来自标准输入或管道,而不仅仅是文件,例如:
# grep 'tom'
# ps aux |grep 'sshd'
# ll |grep '^d'
# grep 'alice' /etc/passwd
返回值
找到: grep返回的退出状态为0
没找到: grep返回的退出状态为1找不到指定文件: grep返回的退出状态为2
grep使用的元字符
grep : 使用基本元字符集 ^, $, ., *, [], [^], \< \>,\(\),\{\}
egrep(或grep -E): 使用扩展元字符集?, +, { }, |, ( )
注:grep也可以使用扩展集中的元字符,仅需要对这些元字符前置一个反斜线
\w 所有字母与数字,称为字符[a-zA-Z0-9] 'l[a-zA-Z0-9]*ve' 'l\w*ve'
\W 所有字母与数字之外的字符,称为非字符 'love[^a-zA-Z0-9]+' 'love\W+'
\b 词边界 '\blove\b' '\<love\>'
元字符
定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
shell元字符(也称为通配符) 由shell来解析,如rm -rf .pdf,元字符Shell将其解析为任意多个字符
正则表达式元字符 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk
a{n}括号前面的内容重复n次
grep -P 支持扩展的正则表达式
-
正则表达式元字符(基本正则表达式元字符):
字符 表示的含义 ^ 行首定位符 ^love $ 行尾定位符 love$ . 匹配单个字符 l…e * 匹配前导符0到多次 ab*love [] 匹配指定范围内的一个字符 [lL]ove
[ - ]
匹配指定范围内的一个字符 [a-z]ove
[^]
匹配不在指定组内的字符 [^a-z0-9]ove
\
用来转义元字符 love\.
\<
词首定位符 <love 开头必须为空 \>
词尾定位符 love> 结尾必须为空 \(..\)
匹配稍后将要使用的字符的标签 \(love\)able\1er :1,$ s/\(192.168.10\).20/\1.50/g
\d
数字 x\{m\}
字符x重复出现m次 o\{5\}
x\{m,\}
字符x重复出现m次以上 o\{5,\}
x\{m,n\}
字符x重复出现m到n次 o\{5,10\}
-
扩展正则表达式元字符
+ 匹配一个或多个前导字符 [a-z]+ove
? 匹配零个或一个前导字符 lo?ve
a b ()
组字符 love(able|rs) (ov)+
(..)(..)\1\2
标签匹配字符 (love)able\1er x{m}
字符x重复m次 o{5}
x{m,}
字符x重复至少m次 o{5,}
x{m,n}
字符x重复m到n次 o{5,10}
-
POSIX字符类:
表达式 含义 [:alnum:]
字母与数字字符 [[:alnum:]]+
[:alpha:]
字母字符(包括大小写字母) [[:alpha:]]{4}
[:blank:]
空格与制表符 [[:blank:]]*
[:digit:]
数字字母 [[:digit:]]?
[:lower:]
小写字母 [[:lower:]]{5,}
[:upper:]
大写字母 [[:upper:]]+
[:punct:]
标点符号 [[:punct:]]
[:space:]
包括换行符,回车等在内的所有空白 [[:space:]]+
grep 示例
查找的目标高亮显示
[[email protected] ~]# grep root --color /etc/passwd
从/etc目录下以passw开头的所有文件中查找root
[[email protected] ~]# grep 'root' /etc/passw*
查找以root开头的行
[[email protected] ~]# grep '^root' /etc/passwd
查找以‘4’结尾
[[email protected] ~]# grep '4$' abc
查找带空格的字段
正确:
[[email protected] ~]# grep "a user" test
错误: 以下的表达式表示从user、test文件中查找a字段
[[email protected] ~]# grep a user test
查找image开头但是最后一个字符确认
[[email protected] ~]# grep "image." test
搜索结果 image. images imagee
“.” 表示一个字符
以"i"或者"4"开头
[[email protected] ~]# grep -E "^[i4]" test
不以"i"或者"4"开头
[[email protected] ~]# grep -E "^[^i4]" test
查找imaa或者g
[[email protected] ~]# grep -E "imaa|g" test
[[email protected] ~]# grep -E "ima(a|g)" test 查找imaa或者imag
参数
-i, --ignore-case 忽略大小写
-l, --files-with-matches 只列出匹配行所在的文件名
-n, --line-number 在每一行前面加上它在文件中的相对行号
-c, --count 显示成功匹配的行数
-s, --no-messages 禁止显示文件不存在或文件不可读的错误信息
-q, --quiet, --silent 静默--quiet, --silent
-v, --invert-match 反向查找,只显示不匹配的行
-R, -r, --recursive 递归
--color 颜色
-o, --only-matching 只显示匹配的内容
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
常用实例
查询指定目录下包含root的文件
[[email protected] ~]# grep -r 'root' /etc/ # 显示文件名和具体内容
[[email protected] ~]# grep -rl /etc/ # 只显示文件名
查询连接22端口的非ESTABLISHED状态的会话
[[email protected] ~]# netstat -anlp | grep :22 | grep -v "ESTABLISHED"
上一篇: grep