grep命令使用方法
在linux中,我们可以使用grep去筛选我们所需要的列。 linux中可以分为基本正则表达式grep,拓展正则表达式egrep,不支持正则表达式fgrep。虽然fgrep不支持正则表达式,但是他的处理文本的速度是最快的。
grep的使用
grep [option] 'pattern' FILE
option:
--color=auto 符合条件的字符串用高亮红色显示
export GREP_COLOR='01;34' 前景色;背景色
grep匹配出来的颜色会变
-v: 反向选取,只显示不符合模式的行
-o:只显示被模式匹配到的字串,而不是整个行
-i:匹配时,不区分字符大小写
-E:使用扩展的正则表达式
-A #:显示匹配到的行时,顺带显示其后面的#个行
-A 2
-B #:显示匹配到的行时,顺带显示其前面的#个行
-C #:显示匹配到的行时,顺带显示其前后的#个行
-r 递归搜索
pattern: 如果使用变量,则用双引号;不加引号,则全部当成字符处理
示例:
1.查看1.txt中空白行 grep '^$' 1.txt
2.筛选rc.sysinit中出非空白行 grep -v "^$" /etc/rc.d/rc.sysinit
3.显示/proc/meminfo文件夹下不区分大小写s开头的行
[root@node1 ~]# grep "^[sS].*" /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 84372 kB
Slab: 198192 kB
SReclaimable: 139628 kB
SUnreclaim: 58564 kB
4.显示/etc/passwd中国以nologin结尾的行
[root@node1 ~]# grep "nologin$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
4.1取出默认shell为sbin/nologin的用户列表
[root@node1 ~]# grep "sbin/nologin$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4.2取出默认shell为bash,且用户ID号最小的用户的用户名
[root@node1 ~]# grep "/bin/bash" /etc/passwd | cut -d ":" -f 1 | head -1
root
5.显示/etc/inittab中以#开头,且后面跟着一个或多个空白字符,而后面又跟着任意非空白字符的行
[root@node1 ~]# grep "^#\s\{1,\}\S\{1,\}" /etc/inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To view current default target, run:
# systemctl get-default
# To set a default target, run:
# systemctl set-default TARGET.target
或者
[[:space:]]\{1,\}[^[:space:]]\{1,\}
4.显示/etc/inittab中包含:一个数字:的行 grep ":\d:" /etc/inittab
5.显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行 grep "^\s\{1,\}" /boot/grub/grub.conf
6.显示/etc/inittab文件中以一个数字开头并以一个与开头数字相投的数字结尾的行 [root@node1 ~]# grep "^\([0-9]\).*\1$" /etc/inittab
7.找出某文件中的1位数,或2位数
grep "\<[0-9]\{1,2\}\>" /etc/inittab 或者
grep -w "[[:digit:]]\{1,2\}" /etc/inittab
8.找出ifconfig命令结果中的1-255之间的整数
ifconfig | grep "[1-2]\?[0-9]\{0,2\}"
[root@node1 ~]# ifconfig | grep "[1-2]\?[0-9]\{0,2\}" -o
33
41
63
150
0
10
0
0
128
255
255
9.查找当前系统上名称为student(必须出现在行首)的用户的账号的相关信息,文件为/etc/passwd
grep "^student:" /etc/passwd
grep "^\<student\>" /etc/passwd
linux中基本正则表达式
跟我们在其他语言中的正则表达式有一点区别 比如:
- 问号,分组的左右小括号,匹配数量的大括号,锚定词尾和词首的尖括号都要要用\转义。
- 可以用\1代表匹配前面第一个括号中的内容
^string 锚定行首符合条件的内容
string$ 锚定行尾符合条件的行
.:匹配任意单个字符
*:匹配紧挨着其前面的任意次
[]:匹配指定范围内的任意单个字符
[a-z],[0-9],[:lower:],[:upper:],[:digit:],[:alpha:],[:alnum:],[:space:],[:punct:],
[^]:匹配指定范围外的任意字符
\?:匹配紧挨在其前面的字符0次或1次 写法 a\?b
\{m,n\}:匹配其前面的字符至少m次,至多n次
匹配至多3次 \{0,3\}
匹配至少3次 \{3,\}
匹配3次 \{3\}
\<: 锚定词首 \<pattern
\b: \bpattern
\>: 锚定词尾 pattern\>
\b: pattern\b
\<pattern\>:锚定词首
\bpattern\b:锚定词尾
\(\): 分组 \(pattern\)
\(ab\)\{1,3\}: 可以匹配多个ab组合
\(a.b\).*\1 : 可以引用,\1引用第一个括号内容,\2引用第二个括号内容
示例:
1.匹配第2和4个单词相等的行
He like his liker;
He love his liker;
She love her lover;
She like her lover;
使用\(\l..e\).*\1r 正则表达式,即可匹配第一行和第三行。
扩展正则表达式
使用grep -e 或egrep,不需要反斜线转义?
+:匹配其前面的字符至少1次
?:匹配其前面的字符0次或1次
{m,n}:至少m次,至多n次
(): 分组,支持引用\1,\2
a|b: 匹配a或者匹配b
词首词尾锚定,必须要\转义
\<: 锚定词首
\>: 锚定词尾
^: 匹配开头
$: 匹配结尾
示例
1.查找以s或S开头的行
grep -E "^(s|S)"
egrep "^(s|S)"
注意!!! egrep "c|Cat" /root/test.txt 匹配的是c和Cat,如果想匹配cat或Cat: egrep "(c|C)at" /root/test.txt
|