1 概念:
grep ---> global reserch by expression
根据模式搜索文本,并将符合模式的文本行显示出来。
2 特点:
做部分匹配的,显示的是符合条件的整行数据,重点展示的是匹配到的那个字段。
3 写法:
grep [options] PATTERN [FILE...] -i: 忽略大小写 --color 匹配到的带颜色展示 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串
匹配次数(贪婪模式):
匹配其前面的字符任意次 ----> 一定要记住,*表示匹配的是前面的字符 比如 a*b表示匹配 前面字符a为任意多次的单词 eg: [root@chinadaas109 zhoumingtest]# cat test ab aab abb acb [root@chinadaas109 zhoumingtest]# grep --color -o 'a*b' test 表示查找b前面出现字符a为0或者多次的单词,并将符合条件的单词打印出来 ab aab ab b b
4 Pattern介绍, 正则表达式:
正则表达式:REGular EXPression, REGEXP 正则里面有一些元字符,这些元字符本身没有含义,
只是表示一些统配的含义。
元字符:
.: 匹配任意单个字符 []: 匹配指定范围内的任意单个字符 [^]:匹配指定范围外的任意单个字符 字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:] .*: 任意长度的任意字符 \?: 匹配其前面的字符1次或0次, eg: # grep --color -o 'a\?b' test \{m,n\}:匹配其前面的字符至少m次,至多n次 \{1,\}: 至少一次 \{0,3\}: 至少0次,最多3次
位置锚定:
位置锚定: ^: 锚定行首,此字符后面的任意内容必须出现在行首 $: 锚定行尾,此字符前面的任意内容必须出现在行尾 ^$: 空白行 应用: 查询inittab文件内的空白行 # grep '^$' /etc/inittab | wc -l 0 查询inittab文件内末尾为数字的行 # grep '[[:digit:]]$' /etc/inittab # 5 - X11 \<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现 \>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现 eg: \<root\> 表示匹配整行中只有root这个单词的行 查询以root为行尾的行 # cat test ab aab abb acb rooter the user is root # grep 'root\>' test the user is root
分组:
分组: \(\) \(ab\)* ---> 分组的目的主要是为了让后面能在继续用到前面的内容 后向引用(前面出现什么,后面就能引用到什么) \1: 引用第一个左括号以及与之对应的右括号所包括的所有内容 \2: 引用第二个左括号以及与之对应的右括号所包括的所有内容 \3: 引用第三个左括号以及与之对应的右括号所包括的所有内容 # cat test he love his lover she like her lover he like his liker she love her liker # grep '\(l..e\).*\1' test ---> 反向引用的案例 he love his lover he like his liker
案例:
1 判断当前系统上是否有用户的默认shell为bash; 如果有,就显示有多少个这类用户;否则,就显示没有这类用户; total = `grep "\<bash$" /etc/passwd &> /dev/null | wc -l` if [ $total -eq 0 ]; then echo "no such bash user" else echo "the bash users num is $total" 2 给定一个文件,比如/etc/inittab 判断这个文件中是否有空白行; 如果有,则显示其空白行数;否则,显示没有空白行。 #!/bin/bash A=`grep '^$' /etc/inittab | wc -l` if [ $A -gt 0 ]; then echo "$A" else echo "no blank" fi