grep命令详解

grep介绍

  • 正则就是一串有规律的字符串
  • 掌握好正则对于编写shell脚本有很大帮助
  • 各种编程语言中都有正则,原理是一样的
  • 本章将要学习grep/egrep、sed、awk

grep/egrep命令

  • grep命令:过滤出指定关键字的行;
  • 格式:grep [参数] ‘字符’ filename
  • grep -n 显示符号要求的行,并显示行号
  • grep -c 打印符合要求的行数
  • grep -v 打印不符合要求的行,取反的意思
  • grep -r 会把目录下的所有文件全部遍历;-r针对的是目录,如果不加-r只能针对文件
  • grep -i 忽略大小写
  • grep -A2 打印符合要求的行以及下面两行
  • grep -B2 打印符合要求的行以及上面两行
  • grep -C2 打印符合要求的行以及上下两行
  • grep -w 匹配一个完整的单词
  • grep -E 特殊符号脱意==egrep
  • centos7中自带 --color显示颜色 ;
  • grep 跟特殊符号的话,要用单引号
  • grep --include 包含
  • grep -l 只打印出含有匹配字符串的文件名,不输出具体匹配行的数据
  • 过滤出包含root字符的行。
[root@yong-02 grep]# grep 'root' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • grep –n 过滤出包含root的行,并显示行号;
[root@yong-02 grep]# grep -n 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
  • grep -c打印符合要求的行数  passwd中包含root字符的一共有几行。
[root@yong-02 grep]# grep -c 'root' passwd
2
  • grep -v  取反   过滤出不包含nologin的行;
[root@yong-02 grep]# grep -v 'nologin' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash
user4:x:1011:1011::/home/user4:/bin/bash
user5:x:1012:1012::/home/user5:/bin/bash
user7:x:1014:1014::/home/user7:/bin/bash
  • grep –i 不区分大小写
[root@yong-02 grep]# grep -i 'sbin' passwd
bin:x:1:1:bin:/bin:/sBin/nologin #sBin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sBin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sBin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbIN/nologin #sbIN
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • grep –A2 打印符合要求的行以及下面两行;
[root@yong-02 grep]# grep -nA2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sBin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbIN/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  • grep –B2 打印符合要求的行以及上面两行;
[root@yong-02 grep]# grep -nB2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
--
8-halt:x:7:0:halt:/sBin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbIN/nologin
  • grep –C2 打印符合要求的行以及这行上下各两行;
[root@yong-02 grep]# grep -nC2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sBin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
8-halt:x:7:0:halt:/sBin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbIN/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

grep/egrep示例1:

  • grep -n 'root' test.txt
  • grep -nv 'nologin' test.txt
  • grep '[0-9]'/etc/inittab
  • grep -v '[0-9]'/etc/inittab
  • grep -v '^#' /etc/inittab
  • grep -v '^#' /etc/inittab|grep -v '^$'
  • grep '^[^a-zA-Z]' test.txt
  • [0-9]:这里的方括号,表示方括号里面的任意一个字符;只要有一个数字,不管是几,就算符合要求。

练习

  • 过滤出包含数字的行 ; grep -n '[0-9]' passwd
[root@yong-02 grep]# grep -n '[0-9]' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sBin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sBin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:12231
10:11aafadsfa11
11:halt:x:7:0:halt:/sBin:/sbin/halt
  • 过滤出所有不包含数字的行; grep -nv '[0-9]' test.txt
[root@yong-02 grep]# grep -nv '[0-9]' passwd
9:adfabaf
12:afdb
13:dfas
  • 过滤出不以#开头的行,方便查看某个文件的配置
[root@yong-02 grep]# grep -nv '^#' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sBin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:sync:x:5:0:sync:/sBin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:12231
9:adfabaf
10:11aafadsfa11
11:halt:x:7:0:halt:/sBin:/sbin/halt
  • 过滤出不以#或者开头的行不包括空行
[root@yong-02 grep]# grep -nv '^#' passwd |grep -v '^$'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sBin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:sync:x:5:0:sync:/sBin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:12231
9:adfabaf
10:11aafadsfa11
11:halt:x:7:0:halt:/sBin:/sbin/halt
  • 过滤出不以字母开头的行
[root@yong-02 grep]# grep -n '^[^a-zA-Z]' passwd
3:#daemon:x:2:2:daemon:/sbin:/sbin/nologin
5:#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8:12231
10:11aafadsfa11
  • 过滤出不包含特殊符号的行
[root@yong-02 grep]# grep -nv '^[^a-zA-Z0-9]' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sBin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:sync:x:5:0:sync:/sBin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:12231
9:adfabaf
10:11aafadsfa11
11:halt:x:7:0:halt:/sBin:/sbin/halt

grep/egrep示例2:

  • grep 'r.o' test.txt
  • grep 'oo*' test.txt
  • grep '.*' test.txt
  • grep 'o{2}' /etc/passwd
  • egrep 'o{2}' /etc/passwd
  • egrep 'o+' /etc/passwd
  • egrep 'oo?' /etc/passwd
  • egrep 'root|nologin' /etc/passwd
  • egrep '(oo){2}' /etc/passwd

正则里面的特殊符号

  •  . 表示 任意一个字符
  •  * 表示 零个或多个前面的字符
  •  .* 表示零个或多个任意字符,空行也包含在内;以r开头o结尾。
  •  ? 表示0个或者1个前面的字符,使用的时候要\ 脱意一下
  •  + 表示一个或者多个+前面的字符
  •  | 在正则表达式里面表示或者,可以写多个,是特殊符号,要使用脱意 或者-E 或者 egrep
  •  () 括号表示一个整体,{1,3}大括号表示一个范围 ? +(){} |都是特殊符号,要使用必须脱意或者-E 或者egrep

 练习

  • . 这个点表示任意一个字符 grep -n 'r.o' passwd
  • *表示零个或多个前面的字符 grep -n 'r*o'  passwd

  • .*表示零个或多个任意字符,空行也包含在内;以r开头o结尾。 grep -n 'r.*o' passwd

  • ?表示零个或者一个前面的字符;使用的时候要\ 或者-E,egrep脱意一下 head -10 1.txt|egrep 'r?o'

  • 表示一个或者多个+前面的字符,使用的时候要\ 或者-E,egrep脱意一下 

egep 'r+o' passwd , grep -E 'r+o' passwd , grep 'r\+o' passwd

  • | 在正则表达式里面表示或者,可以写多个,是特殊符号,要使用脱意 或者-E 或者 egrep 'root|nologin' passwd

  • 想要表示并且的话 要过滤两次 egrep 'root' 1.txt |egrep 'nologin'

  • ()括号表示一个整体,{1,3}大括号表示一个范围 ? +(){} |都是特殊符号,要使用必须脱意或者-E 或者egrep   例子:egrep '(oo){2}' passwd

扩展

http://www.cnblogs.com/end/archive/2012/02/21/2360965.html

猜你喜欢

转载自my.oschina.net/u/3791387/blog/1800840