grep与正则表达式
grep
使用语法:grep [-abcEFGhHilLnqrsvVwxy][-C<显示列数>][-e<范本样式>][-f<范本文件>][范本样式][文件或目录...]
功能说明:查找指定文件或标准输入里符合条件的字符串
常用选项
-a 或–text 不要忽略二进制的数据。
-A<显示列数>或–after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。
-b 或–byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
1.[root - gwx-st ~/test]#>grep -A1 -B1 -b "^bin" passwd
2.0-root:x:0:0:root:/root:/bin/bash
3.32:bin:x:1:1:bin:/bin:/sbin/nologin
4.65-daemon:x:2:2:daemon:/sbin:/sbin/nologin-B<显示列数>或–before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。
1.[root - gwx-st ~/test]#>head -3 passwd
2.root:x:0:0:root:/root:/bin/bash
3.bin:x:1:1:bin:/bin:/sbin/nologin
4.daemon:x:2:2:daemon:/sbin:/sbin/nologin
5.[root - gwx-st ~/test]#>grep -A1 -B1 "^bin" passwd
6.root:x:0:0:root:/root:/bin/bash
7.bin:x:1:1:bin:/bin:/sbin/nologin
8.daemon:x:2:2:daemon:/sbin:/sbin/nologin-c 或–count 计算符合范本样式的列数。
1.[root - gwx-st ~/test]#>grep -c "^bin" passwd
2.1
3.[root - gwx-st ~/test]#>grep "^bin" passwd
4.bin:x:1:1:bin:/bin:/sbin/nologin-C<显示列数>或–context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
1.[root - gwx-st ~/test]#>grep -C1 "^bin" passwd
2.root:x:0:0:root:/root:/bin/bash
3.bin:x:1:1:bin:/bin:/sbin/nologin
4.daemon:x:2:2:daemon:/sbin:/sbin/nologin-d<进行动作>或–directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。
-e<范本样式>或–regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。
-E 或–extended-regexp 将范本样式为扩展正则表达式来使用。
1.[root - gwx-st ~/test]#>grep "^ro+t" passwd
2.[root - gwx-st ~/test]#>grep -E "^ro+t" passwd
3.root:x:0:0:root:/root:/bin/bash
4.[root - gwx-st ~/test]#>grep "^ro\+t" passwd
5.root:x:0:0:root:/root:/bin/bash-f<范本文件>或–file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep 查找符合范本条件的文件内容,格式为每列一个范本样式。
1.[root - gwx-st ~/test]#>cat username.list
2.root
3.gwx
4.test
5.[root - gwx-st ~/test]#>grep -f username.list passwd
6.root:x:0:0:root:/root:/bin/bash
7.operator:x:11:0:operator:/root:/sbin/nologin
8.gwx:x:1000:1000:gwx:/home/gwx:/bin/bash
9.test1:x:1012:1012::/home/test1:/bin/bash
10.test2:x:1013:1013::/home/test2:/bin/bash-F 或–fixed-regexp 将范本样式视为固定字符串的列表。即不适用正则表达式。
1.[root - gwx-st ~/test]#>grep "^bin" passwd
2.bin:x:1:1:bin:/bin:/sbin/nologin
3.[root - gwx-st ~/test]#>grep -F "^bin" passwd
4.[root - gwx-st ~/test]#>-G 或–basic-regexp 将范本样式视为正则表达式来使用。默认使用的基本正则表达式。
-h 或–no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。默认选项。
-H 或–with-filename 在显示符合范本样式的那一列之前,标示该列所属的文件名称。
1.[root - gwx-st ~/test]#>grep -H "^gwx" passwd
2.passwd:gwx:x:1000:1000:gwx:/home/gwx:/bin/bash-i 或–ignore-case 忽略字符大小写的差别。
1.[root - gwx-st ~/test]#>grep -i "^GWX" passwd
2.gwx:x:1000:1000:gwx:/home/gwx:/bin/bash-l 或–file-with-matches 列出文件内容符合指定的范本样式的文件名称。
1.[root - gwx-st /]#>grep -r -l "root.*" ~/test/
2./root/test/passwd
3./root/test/username.list-L 或–files-without-match 列出文件内容不符合指定的范本样式的文件名称。
1.[root - gwx-st /]#>grep -r -L "root.*" ~/test/
2./root/test/test1
3./root/test/test2-n 或–line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
1.[root - gwx-st ~/test]#>grep -n "^gwx" passwd
2.22:gwx:x:1000:1000:gwx:/home/gwx:/bin/bash-q 或–quiet 或–silent 不显示任何信息。
-r 或–recursive 此参数的效果和指定“-d recurse”参数相同。
1.[root - gwx-st /]#>grep -r "root.*" ~/test/
2./root/test/passwd:root:x:0:0:root:/root:/bin/bash
3./root/test/passwd:operator:x:11:0:operator:/root:/sbin/nologin
4./root/test/username.list:root-s 或–no-messages 不显示错误信息。
1.[root - gwx-st /]#>grep -L "root.*" ~/test/
2.grep: /root/test/: Is a directory
3./root/test/
4.[root - gwx-st /]#>grep -L -s "root.*" ~/test/
5./root/test/-v 或–revert-match 反转查找。
1.[root - gwx-st ~/test]#>cat test2
2.ad
3.ag
4.ga
5.[root - gwx-st ~/test]#>grep -v "^a" test2
6.ga-V 或–version 显示版本信息。
-w 或–word-regexp 只显示全字符合的列。
-x 或–line-regexp 只显示全列符合的列。
-y 此参数的效果和指定“-i”参数相同。
-o 只显示与范本样式匹配的字符串
1.[root - gwx-st ~/test]#>grep -o "^a" test2
2.a
3.a
4.[root - gwx-st ~/test]#>grep "^a" test2
5.ad
6.ag
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。此处的*为通配符。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
下面我们来看一下正则表达式所支持的常用元字符
字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(“。 ^ 匹配输入字符串的开始位置。 $ 匹配输入字符串的结束位置。 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 {n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。 . 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。 (pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,如需引用则使用 \1…。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。 (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符(|)来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 (?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。 [xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。 [a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。 [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。 \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 \< 匹配一个单词的词首 > 匹配一个单词的词尾 \B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 好了,接下来让我们实践一下吧~~
显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
1.[root - gwx-st ~/test]#>ls /var |grep -E "^l.*[[:digit:]]+.*[[:lower:]]$"
2.l1b
3.ll2a2iii3d显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
1.[root - gwx-st ~/test]#>ls /etc/ |grep "^[0-9].*[^0-9]$"
2.1agasga21dad显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
1.[root - gwx-st ~/test]#>ls /etc/ |grep -E "^[^[:alpha:]][[:alpha:]]+.*"
2.1agasga21dad复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
1.[root - gwx-st ~/test]#>cp -rf /etc/p*[^0-9] /tmp/mytest1
复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
1.[root - gwx-st ~/test]#>cp -rf /etc/*.d /tmp/mytest2
复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。
1.[root - gwx-st ~/test]#>cp -rf /etc/[lmn]*.conf /tmp/mytest3
原创文章,作者:N24-wenxuan,如若转载,请注明出处:http://www.178linux.com/57632
评论列表(1条)
赞,grep 总结的比较详细~~排版也比较好~继续加油~