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 命令实践: [iyunv@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 10.0.0.131 Mon Apr 15 02:20 - 03:33 (01:13) root pts/1 10.0.0.131 Mon Apr 15 02:08 - 02:08 (00:00) root pts/1 10.0.0.131 Mon Apr 15 02:00 - 02:07 (00:07) root pts/0 10.0.0.131 Mon Apr 15 01:56 - crash (17:08) root pts/0 10.0.0.131 Mon Apr 15 01:49 - 01:56 (00:07) root pts/0 10.0.0.131 Mon Apr 15 01:44 - 01:49 (00:04) 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) [iyunv@yubing ~]# last | grep -v 'root' -v反向提取,将不含root的行过滤出来 yubing pts/0 10.0.0.131 Tue Apr 16 00:36 still logged in reboot system boot 2.6.18-194.el5 Tue Apr 16 00:33 (00:04) yubing pts/0 10.0.0.131 Mon Apr 15 19:05 - crash (05:28) reboot system boot 2.6.18-194.el5 Mon Apr 15 19:05 (05:33) yubing pts/1 10.0.0.131 Mon Apr 15 03:43 - 03:50 (00:07) yubing pts/1 10.0.0.131 Mon Apr 15 03:34 - 03:43 (00:08) reboot system boot 2.6.18-194.el5 Mon Apr 15 01:36 (23:01) reboot system boot 2.6.18-194.el5 Mon Apr 15 01:35 (23:03) reboot system boot 2.6.18-194.el5 Sat Apr 13 22:57 (2+01:41) reboot system boot 2.6.18-194.el5 Sat Apr 13 18:50 (2+05:48) wtmp begins Sat Apr 13 18:50:02 2013 [iyunv@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 10.0.0.131 Mon Apr 15 02:20 - 03:33 (01:13) root pts/1 10.0.0.131 Mon Apr 15 02:08 - 02:08 (00:00) root pts/1 10.0.0.131 Mon Apr 15 02:00 - 02:07 (00:07) root pts/0 10.0.0.131 Mon Apr 15 01:56 - crash (17:08) root pts/0 10.0.0.131 Mon Apr 15 01:49 - 01:56 (00:07) root pts/0 10.0.0.131 Mon Apr 15 01:44 - 01:49 (00:04) 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) [iyunv@yubing ~]# last | grep 'root' | cut -d ' ' -f1 加了空格才过滤了 root root root root root root root root root root root [iyunv@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 [iyunv@yubing ~]# [iyunv@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 [iyunv@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 [iyunv@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 [iyunv@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个以上
|