Linux文本处理三剑客之grep

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文本处理三剑客之grep相关的知识,希望对你有一定的参考价值。

一、Linux文本处理三剑客

linux上主要处理文件的工具主要有grep家族(grep,egrep,fgrep)、awk、sed

        grep:文本搜索工具;根据给定的”pattern“对文本进行搜索

        sed:主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作

        awk:是一个强大的文本分析工具


二、文本查找工具grep

grep:(Globally search a Regular Expression and Print);

            作用:文本搜索工具,根据用户所指定的pattern(过滤条件)对目标文本逐行进行匹配查;                打印出符合条件的行;grep支持正则表达式,正则表达式一般趋向于最大长度匹配,也就是                所谓的贪婪模式。


正则表达式:Regular Expression

        正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,可以让用户轻易达     到查找、删除、替换某特定字符串的处理程序


分类:

        基本正则表达式:BRE Basic Regular Expression   

        扩展正则表达式:ERE  Expand Regular Expression


grep家族:

        grep:  支持使用基本正则表达式

        egrep:支持使用扩展正则表达式

        fgrep:不支持使用正则表达式



二grep命令的主要参数:

    grep  [OPTIONS]  PATTERN  [FILE...]

PATTERN是过滤的条件,可以理解为我们想要找到的内容。


常用选项:

--color=auto:对匹配到的文本着色后高亮显示

[[email protected] ~]# alias
alias cp=‘cp -i‘
alias egrep=‘egrep --color=auto‘
alias fgrep=‘fgrep --color=auto‘
alias grep=‘grep --color=auto‘

    # alias是查看系统中的有哪些命令被替换了;如果不需要命令替换可以使用unalias NAME 删除替换。


-i:忽略字符大小写

[[email protected] ~]# grep "oot" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin


     # 可以看出只要包含pattern,也就是oot的行都会被匹配到,这一特性就是正则表达式的贪婪模式。


-o:仅显示匹配 到的文本自身

[[email protected] ~]# grep -o "oot" /etc/passwd
oot
oot
oot
oot
oot
oot


    # -o选项列出所有匹配pattern中的内容,而不是行!


-v, --invert-match:反向匹配

[[email protected] ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[[email protected] ~]# grep -v "E" /etc/default/useradd 
# useradd defaults file
GROUP=100

    

-E:支持扩展的正则表达式

    # grep -e=egrep

-q, --quiet, --silient:静默模式,不输出任何信息

[[email protected] ~]# grep -q "O" /etc/default/useradd 
[[email protected] ~]# echo $?
0
[[email protected] ~]# grep -q "OOO" /etc/default/useradd 
[[email protected] ~]# echo $?
1

 # grep 静默模式不会有信息打印到屏幕上,但是我们可以通过执行结果得知grep是否匹配到。通过echo "$?" 显示出上个命令执行结果,0表示上条命令执行成功,1表示失败。


-P  支持使用prel正则表达式

 

-e  PATTERN 进行多模式匹配

[[email protected] ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

grep -e "HO" -e "RO" /etc/default/useradd 
GROUP=100
HOME=/home

   


匹配上下文:

-A NUM 连同后面#行显示 #为非负整数

[[email protected] ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[[email protected] ~]# grep -A 2 "IN" /etc/default/useradd 
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash


-B NUM 连同前面#行显示 #为非负整数

[[email protected] ~]# grep -B 2 "IN" /etc/default/useradd 
GROUP=100
HOME=/home
INACTIVE=-1



-C NUM 连同前后#行一起显示 #为非负整数

[[email protected] ~]# grep -C 2 "IN" /etc/default/useradd 
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash


三、基本正则表达式 :

①字符匹配:

.:匹配任意单个字符

[[email protected] ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[[email protected] ~]# grep "M" /etc/default/useradd 
HOME=/home
CREATE_MAIL_SPOOL=yes

[[email protected] ~]# grep "M..L" /etc/default/useradd 
CREATE_MAIL_SPOOL=yes


[ ]:匹配范围内的任意单个字符

[[email protected] ~]# grep "[MS]" /etc/default/useradd 
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes


 ^ :匹配范围外的任意单个字符

[[email protected] ~]# grep "^[MS]" /etc/default/useradd 
SHELL=/bin/bash
SKEL=/etc/skel

[:digit:]:所有数字

[[email protected] ~]# grep "[[:digit:]]" /etc/default/useradd 
GROUP=100
INACTIVE=-1

[:lower:]:所有小写字母

[[email protected] ~]# grep "[[:lower:]]" /etc/default/useradd 
# useradd defaults file
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[:upper:]:所有大写字母

[[email protected] ~]# grep "[[:upper:]]" /etc/default/useradd 
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[:alpha:]:所有字母

[[email protected] mnt]# cat test
innode innode table innode table 
superblock  ext2 exr3
83 82 5400 7200

[[email protected] mnt]# grep "[[:alpha:]]" /mnt/test 
innode innode table innode table 
superblock  ext2 ext3

[:alnum:]:所有字母和数字

[[email protected] mnt]# grep "[[:alnum:]]" /mnt/test 
innode innode table innode table 
superblock  ext2 exr3
83 82 5400 7200

[:space:]:空白

[:blank:]:空格和TAB

[:punct:]:所有标点符号


②匹配次数: 非负整数

用限制其前面的字符要出现的次数;默认工作于贪婪模式(只要找到符合的内容整行显示出来);

*:匹配前面的字符任意N次  

[[email protected] mnt]# cat test3
c
abcd
acccd
bccca

[[email protected] mnt]# cat test3
c
abcd
acccd
bccca


  #前面的字符可以0次,1次....N次


\+:匹配前面的字符至少1次

[[email protected] mnt]# grep "d\+" /mnt/test3
abcd
acccd


\?:匹配前面的0次或1次

[[email protected] mnt]# grep "d\?" /mnt/test3
c
abcd
acccd
bccca

\{m\}:其前面的字符出现m次

[[email protected] mnt]# grep "c\{3\}" /mnt/test3
acccd
bccca

\{m,n\}:其前面的字符出现m-n次 [m,n]

[[email protected]ocalhost mnt]# grep "c\{1,3\}" /mnt/test3
c
abcd
acccd
bccca

\{0,n\}:出现0-n次

[[email protected] mnt]# grep "c\{0\}d" /mnt/test3
abcd
acccd

\{m,\}:至少出现m次

[[email protected] mnt]# grep "c\{3,\}d" /mnt/test3
acccd


③位置锚定

用来限制所匹配到的文本所出现在目标文本的位置。

^:行首锚定;用于模式的最左侧,^PATTERN

[[email protected] mnt]# tail -6  /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
tom:x:1000:1000:mageedu:/home/mageedu:/bin/bash

[[email protected] mnt]# tail -6  /etc/passwd | grep "^n"
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin


$:行尾锚定;用于模式的最右侧,PATTERN$

[[email protected] mnt]# tail -6  /etc/passwd | grep "n$"
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin


^PATTERN$:要让PATTERN完全匹配一整行

[[email protected] mnt]# cat  test4
root 
root 123
root1234

[[email protected] mnt]# grep "^root1234$" test4
root1234

^$:空行

[[email protected] mnt]# cat /etc/issue 
\S
Kernel \r on an \m 

Welcome

[[email protected] mnt]# grep -v "^$" /etc/issue 
\S
Kernel \r on an \m 
Welcome

    # -v用来匹配pattern以外的内容 用来显示出空行 ,配合wc可以计算空白行的数量


^[[:space:]]*$ 用于使用^$查找不到空白行的情况  

[[email protected] mnt]# cat  test4
root
 
root 123
                                     
root1234

[[email protected] mnt]# grep "^$"  /mnt/test4 |wc -l
0

[[email protected] mnt]# grep "^[[:space:]]*$"  /mnt/test4 |wc -l
2

\<或\b:词首锚定,用于限制匹配单词左侧,\<PATTERN, \bPATTERN

[[email protected] mnt]# grep "\<c" /etc/passwd
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin

\>或\b:词尾锚定,用于限制匹配单词右侧,PATTERN\>, PATTERN\b

[[email protected] mnt]# grep "S\>" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

\<PATTERN\>:单词锚定,精确匹配整个单词

[[email protected] mnt]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

④分组与引用:

\(PATTERN\):将此PATTERN匹配到的字符当作一个整体,分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中

可以理解为一个括号对应一个变量,变量为$1,$2,$3.....


pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)

\1: \(pat2\)pat3\(pat4\(pat5\)pat6\)匹配到的结果

\2:\(pat4\(pat5\)pat6\)匹配到的结果

....

[[email protected] mnt]# grep "^\([[:alnum:]]\{1,\}\)\>.*\1$" /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


四、文本查找工具egrep :

支持使用扩展正则表达式的grep命令,相当于grep -E;使用的方法和grep基本上没什么不同,\除了词首锚定和词尾锚定都可以去除。

egrep [OPTIONS] PATTERN [FILE...]


①字符匹配:

.:匹配任意单个字符

[ ]:匹配范围内的任意单个字符

[^ ]:匹配范围外的任意单个字符


[:digit:]:数字

[:lower:]:所有小写字母

[:upper:]:所有大写字母

[:alpha:]:所有字母

[:alnum:]:所有字母和数字

[:space:]:空白

[:blank:]:空格和TAB

[:punct:]:所有标点符号


②匹配次数:

用限制其前面的字符要出现的次数;默认工作于贪婪模式(只要找到符合的内容整行显示出来)

 

*:匹配前面的字符任意次(0+∞)

 

+:匹配前面的字符至少1

 

?:匹配前面的0次或1

 

{m}:其前面的字符出现m次,m为非负整数

 

{m,}:其前面的字符出现m次,m为非负整数[m,n]

 

③位置锚定

用来限制模式所匹配到的文本只能出现于目标文本的位置

 

^:行首锚定;用于模式的最左侧,^PATTERN


$:行尾锚定;用于模式的最右侧,PATTERN$


^PATTERN$:要让PATTERN完全匹配一整行


^$:空行


^[[:space:]]*$

 

\<\b:词首锚定,用于限定单词的左侧,\<PATTERN, \bPATTERN

 

\>\b:词尾锚定,用于限定单词的右侧,PATTERN\>, PATTERN\b

 

\<PATTERN\>:单词锚定,精确匹配整个单词

 

④分组与引用:

(PATTERN):将此PATTERN匹配到的字符当作一个整体,分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中

可以理解为一个括号对应一个变量,变量为$1$2$3.....



a|b:a或者b

C|cat:表示C或cat

(C|c)at:表示Cat或cat


这里就用之前grep的例子作为比较

1.分组中\可以去掉

[[email protected] mnt]# egrep "^([[:alnum:]]{1,})\>.*\1$" /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

2.词首词尾的锚定\不能去掉

[[email protected] mnt]# egrep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3.查找UID大于1000的数字

[[email protected] mnt]# egrep -v "\<([0-9]|[1-9][0-9]|[1-9][0-9][0-9])\>" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin



以上是关于Linux文本处理三剑客之grep的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理工具三剑客之grep

Linux入门——文本处理三剑客之grep

Linux 文本处理三剑客之grep

linux文本处理三剑客之grep命令详解

linux文本处理三剑客之 grep

Linux文本处理三剑客之grep一族与正则表达式