Linux之grep和egrep命令总结

grep / egrep

语法: grep  [-cinvABC]  'word'  filename

-c :打印符合要求的行数

-i :忽略大小写

-n :在输出符合要求的行的同时连同行号一起输出

-v :打印不符合要求的行

-A :后跟一个数字(有无空格都可以),例如 A2则表示打印符合要求的行以及下面两行

-B :后跟一个数字,例如 B2 则表示打印符合要求的行以及上面两行

-C :后跟一个数字,例如 C2 则表示打印符合要求的行以及上下各两行

把包含 ‘halt’ 的行以及这行下面的两行都打印出。

[root@localhost ~]# grep -A2 'halt' /etc/passwd

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

把包含 ‘halt’ 的行以及这行上面的两行都打印出。

[root@localhost ~]# grep -B2 'halt' /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

把包含 ‘halt’ 的行以及这行上面和下面的各两行都打印出。

[root@localhost ~]# grep -C2 'halt' /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

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

过滤出带有某个关键词的行并输出行号 

[root@localhost ~]# grep -n 'root' /etc/passwd

1:root:x:0:0:root:/root:/bin/bash

11:operator:x:11:0:operator:/root:/sbin/nologin

过滤不带有某个关键词的行,并输出行号 

[root@localhost ~]# grep -nv 'nologin' /etc/passwd

1:root:x:0:0:root:/root:/bin/bash

6:sync:x:5:0:sync:/sbin:/bin/sync

7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8:halt:x:7:0:halt:/sbin:/sbin/halt

26:test:x:511:511::/home/test:/bin/bash

27:test1:x:512:511::/home/test1:/bin/bash

过滤出所有包含数字的行 

[root@localhost ~]# grep '[0-9]' /etc/inittab

# upstart works, see init(5), init(8), and initctl(8).

#   0 - halt (Do NOT set initdefault to this)

#   1 - Single user mode

#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)

#   3 - Full multiuser mode

#   4 - unused

#   5 - X11

#   6 - reboot (Do NOT set initdefault to this)

id:3:initdefault:

过滤出所有不包含数字的行 

[root@localhost ~]# grep -v '[0-9]' /etc/inittab

# inittab is only used by upstart for the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by /etc/init/rcS.conf

#

# Individual runlevels are started by /etc/init/rc.conf

#

# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf

#

# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

# with configuration in /etc/sysconfig/init.

#

# For information on how to write upstart event handlers, or how

#

# Default runlevel. The runlevels used are:

#

把所有以 ‘#’ 开头的行去除 

[root@localhost ~]# grep -v '^#' /etc/inittab

id:3:initdefault:

去除所有空行和以 ‘#’ 开头的行 

[root@localhost ~]# grep -v '^#' /etc/crontab |grep -v '^$'

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

在正则表达式中, “^” 表示行的开始, “$” 表示行的结尾,那么空行则可以用 “^$” 表示,如何打印出不以英文字母开头的行呢?

[root@localhost ~]# vim test.txt

[root@localhost ~]# cat test.txt

123

abc

456

abc2323

#laksdjf

Alllllllll

先在test.txt中写几行字符串,用来做实验。

[root@localhost ~]# grep '^[^a-zA-Z]' test.txt

123

456

#laksdjf

[root@localhost ~]# grep '[^a-zA-Z]' test.txt

123

456

abc2323

#laksdjf

如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。

过滤任意一个字符与重复字符 

[root@localhost ~]# grep 'r..o' /etc/passwd

operator:x:11:0:operator:/root:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

. 表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来, * 表示零个或多个前面的字符。

[root@localhost ~]# grep 'ooo*' /etc/passwd

root:x:0:0:root:/root:/bin/bash

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

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

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

‘ooo*’ 表示oo, ooo, oooo ... 或者更多的 ‘o’ 现在你是否想到了 ‘.*’ 这个组合表示什么意义?

[root@localhost ~]# grep '.*' /etc/passwd |wc -l

27

[root@localhost ~]# wc -l /etc/passwd

27 /etc/passwd

‘.*’ 表示零个或多个任意字符,空行也包含在内。

指定要过滤字符出现的次数 

[root@localhost ~]# grep 'o\{2\}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

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

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

也可以不用脱意符\  加上-E

grep -E  'o{2}' /etc/passwd

这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即 ‘oo’ 的行。注意,{ }左右都需要加上脱意字符 ‘\’, 另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’ 其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。

上面部分讲的grep,另外常常用到egrep这个工具,简单点讲,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够可以胜任你的日常工作了。下面介绍egrep不用于grep的几个用法。为了试验方便,把test.txt 编辑成如下内容:

rot:x:0:0:/rot:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

筛选一个或一个以上前面的字符 

[root@localhost ~]# egrep 'o+' test.txt

rot:x:0:0:/rot:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

[root@localhost ~]# egrep 'oo+' test.txt

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

[root@localhost ~]# egrep 'ooo+' test.txt

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

筛选零个或一个前面的字符 

[root@localhost ~]# egrep 'o?' test.txt

rot:x:0:0:/rot:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

[root@localhost ~]# egrep 'ooo?' test.txt

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

[root@localhost ~]# egrep 'oooo?' test.txt

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

筛选字符串1或者字符串2 

[root@localhost ~]# egrep 'aaa|111|ooo' test.txt

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

1111111111111111111111111111111

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

egrep中( )的应用 

[root@localhost ~]# egrep 'r(oo)|(at)o' test.txt

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

用( )表示一个整体,例如(oo)+就表示1个 ‘oo’ 或者多个 ‘oo’

[root@localhost ~]# egrep '(oo)+' test.txt

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/rooot:/sbin/nologin

roooot:x:0:0:/rooooot:/bin/bash

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

linux网络编程之posix 线程(二):线程的属性和 线程特定数据 Thread-specific Data

一、posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性。主要包括如下属性:...

23800
来自专栏SnailTyan

Linux下Caffe、Docker、Tensorflow、PyTorch环境搭建(CentOS 7)

注:模型的训练、测试、部署都可以通过Docker环境完成,环境问题会更少。 1. CUDA 8.0安装 ? Config env variables # CUD...

63000
来自专栏开发与安全

linux网络编程之POSIX 共享内存和 系列函数

在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数。 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数...

26100
来自专栏开发与安全

linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

一、posix 信号量 信号量的概念参见这里。前面也讲过system v 信号量,现在来说说posix 信号量。 system v 信号量只能用于进程间同步,...

27400
来自专栏SnailTyan

Linux的find命令

Linux的find命令主要用来查找系统中的文件。命令格式如下: find命令的格式: find [-path ..] -options [-print -e...

22400
来自专栏开发与安全

linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题

一、posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成...

24000
来自专栏开发与安全

Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为...

33900
来自专栏SnailTyan

Linux中“Argument list too long”解决方法

1. 背景 Linux下使用cp,mv,rm等命令时经常会碰到“Argument list too long”错误,这主要是因为这些命令的参数太长,即文件个数过...

23200
来自专栏开发与安全

linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

一、线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型。 (一)、N:1用户线程模型 “线...

68300
来自专栏开发与安全

时间系统、进程的调度与切换

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

36700

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励