标签:expression search regular 表达式 grep
一、前言
grep是功能强大的文本处理工具,全称:global search regular expression and print out the line,grep一行一行使用正则表达式匹配文本,之后对匹配到的文本整行显示(除非使用特定的选项取反,如 grep -v)。
二、grep用法
grep命令用法:
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
为了使用grep用法,我们不得不先简单学习下正则表达式
2.1、正则表达式用法
首先,我们要明白什么是正则表达式?所谓正则表达式就是使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。正则表达式由一些普通字符和元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。
2.1.1、基本正则表达式的元字符用法
a:字符匹配
. | 匹配任意单个字符 | 例如:grep ‘roo.‘ /etc/passwd | |||||||
[] | 匹配指定范围内的任意单个字符 | 例如:grep ‘[ro]‘ /etc/passwd | |||||||
[^] | 取反 | 例如:grep ‘[^ro]‘ /etc/passwd |
b:次数匹配
* | 匹配任意次数 | 例如: grep ‘roo*‘ /etc/passwd | |||||||
\? | 匹配其前面字符出现0或者1次 | 例如: grep ‘roo\?‘ /etc/passwd | |||||||
\{m\} | 匹配其前面字符出现m次 | 例如: grep ‘ro\{2\}‘ /etc/passwd | |||||||
\{m,\} | 匹配其前面字符最少出现m次 | 例如: grep ‘ro\{2,\}‘ /etc/passwd | |||||||
\{m,n\} | 匹配其前面字符最少出现m次,最多n次 | 例如: grep ‘ro\{2,3\}‘ /etc/passwd | |||||||
\{0,n\} | 匹配其前面字符最多n次 | 例如: grep ‘ro\{0,2\}‘ /etc/passwd |
c:位置锚定匹配
^ | 行首锚定符 | 例如:grep ‘^root‘ /etc/passwd |
$ | 行尾锚定符 | 例如:grep ‘shell$‘ /etc/passwd |
\< | 词首锚定符 | 例如:grep ‘\<root‘ /etc/passwd |
\> | 词尾锚定符 | 例如:grep ‘shell\>‘ /etc/passwd |
d:分组
\(\) | 分组,分组中模式匹配的内容可被引用 | 例如:grep ‘\(root\).*\1‘ /etc/passwd |
e:引用
\# | 引用分组中第#个内容(#为数字) | 例如:grep ‘\(root\).*\1‘ /etc/passwd |
2.1.2、扩展正则表达式的元字符用法
a:字符匹配
. | 匹配任意单个字符 | 例如:egrep ‘roo.‘ /etc/passwd |
[] | 匹配指定范围内的任意单个字符 | 例如:egrep ‘[ro]‘ /etc/passwd |
[^] | 取反 | 例如:egrep ‘[^ro]‘ /etc/passwd |
b:次数匹配
* | 匹配任意次数 | 例如: egrep ‘roo*‘ /etc/passwd |
+ | 匹配前面字符出现1次以上 | 例如: egrep ‘root‘ /etc/passwd |
? | 匹配其前面字符出现0或者1次 | 例如: egrep ‘roo?‘ /etc/passwd |
{m} | 匹配其前面字符出现m次 | 例如: egrep ‘ro{2}‘ /etc/passwd |
{m,} | 匹配其前面字符最少出现m次 | 例如: egrep ‘ro{2,}‘ /etc/passwd |
{m,n} | 匹配其前面字符最少出现m次,最多n次 | 例如: egrep ‘ro{2,3}‘ /etc/passwd |
{0,n} | 匹配其前面字符最多n次 | 例如: egrep ‘ro{0,2}‘ /etc/passwd |
c:位置锚定匹配
^ | 行首锚定符 | 例如:egrep ‘^root‘ /etc/passwd |
$ | 行尾锚定符 | 例如:egrep ‘shell$‘ /etc/passwd |
\< | 词首锚定符 | 例如:egrep ‘\<root‘ /etc/passwd |
\> | 词尾锚定符 | 例如:egrep ‘shell\>‘ /etc/passwd |
d:分组
( ) | 分组,分组中模式匹配的内容可被引用 | 例如:egrep ‘(root\).*\1‘ /etc/passwd |
e:或者
| | 或者 | 例如: egrep ‘bash|nologin‘ /etc/passwd |
f:引用
\number | 引用第几个匹配 | 例如 grep ‘(12).*\1‘ /etc/passwd |
2.3 grep常用的选项
-v | 反向选择 | 例如:grep -v ‘root‘ /etc/passwd |
-o | 仅显示匹配的字符串本身,而非所在行 | 例如:grep -o ‘root‘ /etc/passwd |
-i | 忽略大小写 | 例如:grep -i ‘root‘ /etc/passwd |
-E | 支持使用扩展正则表达式 | 例如:grep -E ‘(root).*\1‘ /etc/passwd |
-A | 后面n行 | 例如:grep -A 3 ‘root‘ /etc/passwd |
-B | 前面n行 | 例如:grep -B 3 ‘mysql‘ /etc/passwd |
-C | 前后各n行 | 例如:grep -C 3 ‘mysql‘ /etc/passwd |
三、例题
3.1、显示/etc/passwd文件中以bash结尾的行
grep ‘\<bash\>$‘ /etc/passwd root:x:0:0:root:/root:/bin/bash leon:x:500:4400::/home/leon:/bin/bash mandirva:x:2200:4400::/home/mandirva:/bin/bash ...... centos:x:2241:2241::/home/centos:/bin/bash user1:x:2242:2242::/home/user1:/bin/bash
3.2、显示/etc/passwd文件中的两位数或三位数
grep ‘\<[[:digit:]]\{2,3\}\>‘ /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin leon:x:500:4400::/home/leon:/bin/bash openstack:x:501:501:This‘s openstack:/home/openstack:/bin/bash
3.3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
netstat -tan | grep ‘LISTEN‘[[:space:]]* tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:25 :::* LISTEN
3.4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
grep ‘^\([[:alnum:]]*\):.*\1$‘ /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt nologin:x:2208:2208::/home/nologin:/sbin/nologin
3.5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
grep -E ‘^root|^centos|^user1‘ /etc/passwd | cut -d: -f1,3,7 root:0:/bin/bash centos:2241:/bin/bash user1:2242:/bin/bash
3.6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
grep -E ‘\<[[:alpha:]]+_?\(\)‘ /etc/rc.d/init.d/functions checkpid() { daemon() { killproc() { pidfileofproc() { pidofproc() { status() { success() { failure() { passed() { warning() { action() { strstr() { confirm() {
3.7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名
echo /etc/passwd | egrep -o ‘[[:alnum:]]+$‘ passwd echo /etc/passwd | egrep -o ‘^(/).*\1‘ /etc/
3.8、找出ifconfig命令执行结果中1-255之间的数字
ifconfig | grep -Eo ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>‘ | sort | uniq 1 2 6 8 27 41 56 64 75 101 106 127 128 168 192 255
本文出自 “leon91” 博客,请务必保留此出处http://leon91.blog.51cto.com/3639216/1690755
标签:expression search regular 表达式 grep
原文地址:http://leon91.blog.51cto.com/3639216/1690755