grep
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
命令说明:
将符合样式的该行列出
语法:grep [options]
参数:
-A NUM :除了列出符合行之外,并且列出后NUM行
-a :可将二进制档案视为文本文件搜寻
-B NUM :与-A NUM行对,但此参数是显示符合行之外并显示在它之前的NUM行
-C [NUM],-NUM :列出符合行之外并列出上下各NUM行,默认是2
-b :列出样式之前的内文总共有多少byte
-c :不显示符合样式行,只显示符合的总行数
-d ACTION :若输入的档案是一个资料夹,使用ACTION去处理这个资料夹
预设ACTION是read(读取),此资料夹会被视为一般的档案
若ACTION是skip(略过),资料夹会被grep略过
若ACTION是recurse(递归),grep会去读取资料夹下所有的档案相当于-r
-E :采用规则表示式去解释样式
-e PATIERN :把样式作为一个partern,通常用在避免partern用-开始
-f FILE :事先将要搜寻的样式写入到一个档案,一行一个样式,然后采用档案搜寻
空的档案表示没有要搜寻的样式,因此也就不会有任何符合
-G :将样式视为基本的规则表示式解释(此为预设)
-H :在每个符合样式行前加上符合的文件名称,若有路径会显示路径
-h :与-H参数相类似,但在输出时不显示路径
-I :grep会强制认为此二进制档案没有包含任何搜寻样式
-i :忽略大小写,包含要搜寻的样式及被搜寻的档案
-L :不显示平常一般的输出结果,反而显示出没有符合的文件名称
-l :不显示平常一般的输出结果,只显示符合的文件名称
-n :在显示行前面,标上行号
-q :不显示任何的一般输出
-R :递归的,读取每个资料夹下的所有档案
-s :不显示关于不存在或无法读取的错误讯息
-v :显示除搜寻样式行之外的全部
-x :将搜寻样式视为一行去搜寻,完全符合该“行”的行才会被列出
主要参数:
[options]主要参数:
-c:只输出匹配行的计数。计算找到‘查找字符串’的次数
-i:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
patern正则表达式主要参数:
\ :忽略正则表达式中特殊字符的原有含义
^ :匹配正则表达式的开始行
$ :匹配正则表达式的结束行
\< :从匹配正则表达式的行开始
\> :到匹配正则表达式的行结束
[ ] :单个字符,如[A]即A符合要求
[ - ] :范围,如[A-Z]即A到Z都符合要求
.:所有的单个字符
* :有字符,长度可以为0
命令实践:
[root@yubing ~]# last | grep 'root' 将含有root字符串的行显示出来
root tty1 Tue Apr 16 00:35 still logged in
root tty1 Mon Apr 15 19:05 - crash (05:28)
root pts/1
root pts/1
root pts/1
root pts/0
root pts/0
root pts/0
root tty1 Mon Apr 15 01:38 - crash (17:26)
root tty1 Sat Apr 13 22:57 - crash (1+02:37)
root tty1 Sat Apr 13 18:57 - crash (03:59)
[root@yubing ~]# last | grep -v 'root' -v反向提取,将不含root的行过滤出来
yubing pts/0
reboot system boot
yubing pts/0
reboot system boot
yubing pts/1
yubing pts/1
reboot system boot
reboot system boot
reboot system boot
reboot system boot
wtmp begins Sat Apr 13 18:50:02 2013
[root@yubing ~]# last | grep 'root' | cut -d '' -f1 ‘’中间没加空格,所以没显示
root tty1 Tue Apr 16 00:35 still logged in
root tty1 Mon Apr 15 19:05 - crash (05:28)
root pts/1
root pts/1
root pts/1
root pts/0
root pts/0
root pts/0
root tty1 Mon Apr 15 01:38 - crash (17:26)
root tty1 Sat Apr 13 22:57 - crash (1+02:37)
root tty1 Sat Apr 13 18:57 - crash (03:59)
[root@yubing ~]# last | grep 'root' | cut -d ' ' -f1 加了空格才过滤了
root
root
root
root
root
root
root
root
root
root
root
[root@yubing ~]# grep 'MANPATH' /etc/man.config 取出/etc/man.config内含MANPATH的那
# when MANPATH contains an empty substring), to find out where the cat
# MANPATH manpath_element [corresponding_catdir]
# MANPATH_MAP path_element manpath_element
# Every automatically generated MANPATH includes these fields
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man
# MANPATH /opt/*/man
# MANPATH /usr/lib/*/man
# MANPATH /usr/share/*/man
# MANPATH /usr/kerberos/man
# Set up PATH to MANPATH mapping
MANPATH_MAP /bin /usr/share/man
MANPATH_MAP /sbin /usr/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /usr/sbin /usr/share/man
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /usr/local/sbin /usr/local/share/man
MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
MANPATH_MAP /usr/bin/mh /usr/share/man
[root@yubing ~]#
[root@yubing ~]# dmesg | grep 'eth' 列出内核,找出内含eth的那几行
e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
eth0: no IPv6 routers present
[root@yubing ~]# dmesg | grep -n --color=auto 'eth' 加上行号并显色
547:e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
571:e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
575:eth0: no IPv6 routers present
[root@yubing ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth' 前两行与后三行也显示出来
545-PCI: Setting latency timer of device 0000:02:01.0 to 64
546-e1000: 0000:02:01.0: e1000_probe: (PCI:66MHz:32-bit) 00:0c:29:aa:91:8c
547:e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
548-input: PC Speaker as /class/input/input4
549-piix4_smbus 0000:00:07.3: Found 0000:00:07.3 device
550-piix4_smbus 0000:00:07.3: Host SMBus controller not enabled!
--
569-EXT3-fs: mounted filesystem with ordered data mode.
570-Adding 1052248k swap on /dev/sda2. Priority:-1 extents:1 across:1052248k
571:e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
572-NET: Registered protocol family 10
573-lo: Disabled Privacy Extensions
574-IPv6 over IPv4 tunneling driver
575:eth0: no IPv6 routers present
[root@yubing ~]#
grep -n ‘t[ae]st’ regular.txt
要查找的是tast或test两个字符
grep -n ‘oo’ regular.txt
查找有oo的字符,只要含有oo都会显示
grep -n ‘[^g]oo’ regula.txt
[^]集合字符的反向选择,不想要oo前面有g的
grep -n ‘[^a-z]oo’ regular.txt
oo前面不要有小写字符
grep -n ‘[0-9]’ regular.txt
查找有数字的那一行
grep -n ‘^the’ regular.txt
以the开头
grep -n ‘^[a-z]’ regular.txt
开头是小写字符的那一行
grep -n ‘^[a-zA-Z]’ regular.txt
不要开头是英文字母
grep -n ‘\.$’ regular,txt
行尾结束为小数点的那一行
小数点是有其他意义,必须要使用转义字符 \ 来加以解除其特殊意义
grep -n ‘^$’ regular.txt
找出哪一行是空白行
grep -v ‘^$’ /etc/svslog.conf | grep -v “^#”
不要空白行,也不要开头是#的那一行
^符号在[ ]内代表反向选择,在[ ]外则代表定位在行首的意思
.(小数点):代表一定有一个任意字符的意思
*(星号):代表重复前一个0到无穷多次的意思,为组合形态
grep -n ‘g..d’ regular.txt
grep -n ‘o*’ regular.txt
*代表的是重复0个或多个前面的RE字符的意义,因此“o*”代表的是具有空字符或一个o以上的字符
grep -n ‘ooo*’ regular.txt
需要至少两个o以上的字符串时,就需要ooo*
grep -n ‘goo*g’ regular.txt
因为{与}的字符在shell是有特殊意义的,必须使用转义字符来让它失去特殊意义
grep -n ‘o\{2\}’ regular.txt 找到两个o的字符串
grep -n ‘go\{2,5\}g’ regular.txt 2-5个o
grep -n ‘go\{2,\}g’ regular.txt 2个以上