grep命令.md
grep命令
简介
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
作用
文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式
由正则表达式的元字符及文本字符所编写出的过滤条件;
格式
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
选项
- -a --text #不要忽略二进制的数据。
- -A<显示行数> --after-context=<显示行数> #除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b --byte-offset #在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> --before-context=<显示行数> #除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c --count #计算符合样式的列数。
- -C<显示行数> --context=<显示行数>或-<显示行数> #除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> --directories=<动作> #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> --regexp=<范本样式> #指定字符串做为查找文件内容的样式。
- -E --extended-regexp #将样式为延伸的普通表示法来使用。
- -f<规则文件> --file=<规则文件> #指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F --fixed-regexp #将样式视为固定字符串的列表。
- -G --basic-regexp #将样式视为普通的表示法来使用。
- -h --no-filename #在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H --with-filename #在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i --ignore-case #忽略字符大小写的差别。
- -l --file-with-matches #列出文件内容符合指定的样式的文件名称。
- -L --files-without-match #列出文件内容不符合指定的样式的文件名称。
- -n --line-number #在显示符合样式的那一行之前,标示出该行的列数编号。
- -q --quiet或--silent #不显示任何信息。
- -r --recursive #此参数的效果和指定“-d recurse”参数相同。
- -s --no-messages #不显示错误信息。
- -v --revert-match #显示不包含匹配文本的所有行。
- -V --version #显示版本信息。
- -w --word-regexp #只显示全字符合的列。
- -x --line-regexp #只显示全列符合的列。
- -y #此参数的效果和指定“-i”参数相同。
- --color=auto:对匹配到的文本着色后高亮显示;
基本正则表达式
字符匹配
- . :匹配任意单个字符;
- []:匹配指定范围内的任意单个字符;
- [^]:匹配指定范围外的任意单个字符;
匹配次数
用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
- *:匹配其前面的字符任意次;0,1,多次;
- .*:匹配任意长度的任意字符
- \?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
- \+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;
- \{m\}:匹配其前面的字符m次;
- \{m,n\}:匹配其前面的字符至少m次,至多n次;
- \{0,n\}:至多n次
- \{m,\}:至少m次
位置锚定
- ^:行首锚定;用于模式的最左侧;
- $:行尾锚定;用于模式的最右侧;
- ^PATTERN$:用于PATTERN来匹配整行;
- ^$:空白行;
- ^[[:space:]]*$:空行或包含空白字符的行;
- \< 或 \b:词首锚定,用于单词模式的左侧;
- \> 或 \b:词尾锚定,用于单词模式的右侧;
- \<PATTERN\>:匹配完整单词;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
分组及引用
- \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
Note:分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
POSIX字符
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。
- [:alnum:] #文字数字字符
- [:alpha:] #文字字符
- [:digit:] #数字字符
- [:graph:] #非空字符(非空格、控制字符)
- [:lower:] #小写字符
- [:cntrl:] #控制字符
- [:print:] #非空字符(包括空格)
- [:punct:] #标点符号
- [:space:] #所有空白字符(新行,空格,制表符)
- [:upper:] #大写字符
- [:xdigit:] #十六进制数字(0-9,a-f,A-F)
egrep命令
egrep命令是支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E
就相当于egrep
,这里不区分两个命令只是需要将扩展正则表达式说明下。
扩展正则表达式的元字符
字符匹配
- .:任意单个字符
- []:指定范围内的任意单个字符
- [^]:指定范围外的任意单个字符
次数匹配
- *:任意次,0,1或多次;
- ?:0次或1次,其前的字符是可有可无的;
- +:其前字符至少1次;
- {m}:其前的字符m次;
- {m,n}:至少m次,至多n次;
- {0,n}
- {m,}
位置锚定
- ^:行首锚定;
- $:行尾锚定;
- \<, \b:词首锚定;
- \>, \b:词尾锚定;
分组及引用
- ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
或
- a|b:a或者b;
- C|cat:C或cat
- (c|C)at:cat或Cat
使用举例
显示/etc/passwd文件中不以/bin/bash结尾的行:
# grep -v "/bin/bash$" /etc/passwd
找出/etc/passwd文件中的两位数或三位数
# egrep "[0-9]\{2,3\}" /etc/passwd
找出/etc/rc.d/rc.sysinit和/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg /etc/rc.d/init.d/functions
找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
# netstat -tan | grep "LISTEN[[:space:]]*$"
找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;
# egrep "^[sS]" /proc/meminfo
# egrep "^(s|S)" /proc/meminfo
# grep -i "^s" /proc/meminfo
显示当前系统上root、centos或fedora用户的相关信息;
# egrep "^(root|centos|fedora)\>" /etc/passwd
找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
# egrep -o "\<.*\>\(\)" /etc/rc.d/init.d/functions
# grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
使用echo命令输出一绝对路径,使用egrep取出基名;
# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
找出ifconfig命令结果中的1-255之间的数值
# ifconfig |egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
找出ifconfig命令结果中的IP地址
# ifconfig |egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
# ifconfig |head -2 |tail -1|cut -d' ' -f 10
# ifconfig |head -2 |tail -1|awk '{print $2}'
# hostname -I |cut -d' ' -f1
找出/etc/passwd文件中用户名同shell名的行
# egrep "^([^:]+\>).*\1$" /etc/passwd