grep:通过一个指定的模式匹配指定的行
常用选项:
--color=auto:对匹配到的串做高亮显示;
-v:显示模式匹配不到行;
-i:忽略字符大小写;
-o:仅显示能够被模式匹配到的串本行;
-q:静默模式;
-E:使用扩展的正则表达式;
-o: 只获取匹配到的内容;
-Anum : 匹配到搜索到的行以及该行下面的num行;
-Bnum : 匹配到搜索到的行以及该行上面的num行;
-Cnum : 匹配到搜索到的行以及上下各num行;
-n: 显示文件的行数;
-r : 递归目录搜索指定内容的文件;
基本正则表达式的元字符:
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围内的任意单个字符;
[:lower:]匹配小写字母
[:upper:]匹配大写字母
[:alpha]匹配所有字母
[:digit:]匹配所有数字
[:alnum:]匹配所有数字字母 [:alpha:]和[:alpha:]和二为一
[:space]代表空格字符 例如:tab,换行,空格之类的
[:punct:]代表标点符号 例如:'! "# $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ' { | }
次数匹配:用于要指定其次数的字符的后面;
*:任意次;
\?:0或1次;
\+:1或多次;
\{m\}:精确限制为m次;
\{m,n\}:至少m次,至多n次,[m,n];
\{0,n\}:至多n次;
\{m,\}:至少m次;
.*:匹配任意长度的任意字符;
位置锚定:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
\<,\b: 词首锚定;用于表示单词的模式的左侧;
\>,\b:词尾锚定;用于表示单词的模式的右侧;
^$:空白行;
分组:\(\)
分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量中;这些变量分别是\1, \2, ...
\1:从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容;
后向引用:使用变量引用前面的分组括号中的模式所匹配到的字符;
扩展正则表达式的元字符:
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围内的任意单个字符;
[:lower:]匹配小写字母
[:upper:]匹配大写字母
[:alpha]匹配所有字母
[:digit:]匹配所有数字
[:alnum:]匹配所有数字字母 [:alpha:]和[:alpha:]和二为一
[:space]代表空格字符 例如:tab,换行,空格之类的
[:punct:]代表标点符号 例如:'! "# $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ' { | }
次数匹配:
*:0次或多次
?:0次或1次;
+:1次以上;
{m}:精确匹配m次;
{m,n}:至少m次,至多n次;
锚定:
^:锚定行首
$:锚定行尾
\<,\b: 词首锚定;用于表示单词的模式的左侧;
\>,\b:词尾锚定;用于表示单词的模式的右侧;
分组:()
后向引用:\1, \2,...
支持或的概念
a|b:匹配a或者b:
练习:
1、显示/etc/passwd文件中以bash结尾的行;
答:grep “bash$” /etc/passwd
2、显示/etc/passwd文件中的两位数或三位数;
答: grep "\b[[:digit:]]\{2,3\}\b" /etc/passwd
grep -E "\b[[:digit:]]{2,3}\b"/etc/passwd
3、显示'netstat -tan'命令结果中以‘LISTEN’后跟0个、1个或多个空白字符结尾的行;
答: netstat-tan|grep 'LISTEN[[:space:]]*$'
4、添加用户bash,testbash,basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
答:1.useraddbash
2.useraddtestbash
3.useradd basher
4.useradd-s /sbin/nologin nologin
5.grep '^\([[:alnum:]]\+\):.*\1$' /etc/passwd
5、显示当前系统上root、centos或user1用户的默认的shell和UID;
答: egrep'^(root|centos|user1)' /etc/passwd|awk -F":" '{print $1,$3,$7}'
6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行;
答: egrep '^([[:alpha:]]+).+\b\(\)'/etc/rc.d/init.d/functions
7、使用echo输出一个路径,而后egrep找出其路径基名;进一步地:使用egrep取出其目录名;
答: 路径基名命令:echo/usr/local/nginx/conf/nginx.conf | egrep -o '([^/]*)$'
路径目录名命令:echo/usr/local/nginx/conf/nginx.conf | egrep -o '^(.*)/'
8、找出ifconfig命令执行结果中1-255之间的数字;
答: ifconfig|egrep '\b([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\b'