GNU/Linux中常用的文本处理工具有三种:

grep、egrep、fgrep:文本搜索工具;

sed:流编辑器、文本编辑工具;

awk:文本报告生成器;

今天主要来说一下grep和正则表达式;

一、概述

grep(Global search REgular expression and Print out the line.),是一个文本搜索工具;根据指定“pattern(过滤条件)”对目标文本逐行进行匹配检查并打印出符合条件的行;

什么是正则表达式?

正则表达式:由一类特殊字符及文本字符所编写的模式,有些字符不表示其字面意义,而是用于表示控制或通配的功能;

而正则表达式又分为两类:

基本正则表达式:BRE

扩展正则表达式:ERE

正则表达式引擎:利用正则表达式模式分析所给定的文本的程序。

grep家族:

grep:支持使用基本正则表达式,(也可以使用一个选项“-E”支持扩展的正则表达式;到下面再说);

egrep:支持使用扩展

正则表达式;

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

grep命令grep [选项] [模式] [FILE...]


常用选项示例

-i:忽略字符大小写;

[root@localhost~]#cattest.txt
Helovehislover.
helikehislover.
helovehisliker.
Helikehisliker.
[root@localhost~]#grep-i"he"test.txt
Helovehislover.
helikehislover.
helovehisliker.
Helikehisliker.

-n:显示行号;

[root@localhost~]#grep-ni"he"test.txt
1:Helovehislover.
2:helikehislover.
3:helovehisliker.
4:Helikehisliker.

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

[root@localhost~]#grep"bash$"/etc/passwd
root:x:0:0:root:/root:/bin/bash
mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash
gentoo:x:3003:3003::/home/gentoo:/bin/bash
ubuntu:x:3004:4004::/home/ubuntu:/bin/bash
mint:x:3100:3100::/home/mint:/bin/bash
hadoop:x:3102:3102::/home/hadoop:/bin/bash
hive:x:991:986::/home/hive:/bin/bash
linxuejing:x:3103:3103::/home/linxuejing:/bin/bash
[root@localhost~]#grep-o"bash$"/etc/passwd
bash
bash
bash
bash
bash
bash
bash
bash
注:这里首先是显示以bash结尾的行,然后加“-o”选项只显示匹配到字符串本身;

-v:--invert-match:取反,反相匹配;

[root@localhost~]#grep-v"bash$"/etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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
......
注:显示不是以“bash”结尾的行;


--color=auto:对匹配到的文本着色后高亮显示(这里指的是CentOS 7);

#alias
aliascp='cp-i'
aliasegrep='egrep--color=auto'
aliasfgrep='fgrep--color=auto'
aliasgrep='grep--color=auto'
aliasl.='ls-d.*--color=auto'
aliasll='ls-l--color=auto'
aliasls='ls--color=auto'
aliasmv='mv-i'
aliasrm='rm-i'
aliaswhich='alias|/usr/bin/which--tty-only--read-alias--show-dot--show-tilde'
注:CentOS5,6的话需要以aliasgrep='grep--color=auto'手动来定义;

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

root@localhost~]#grep-q"root"/etc/passwd
[root@localhost~]#echo$?
0
可使用“$?”来显示上条命令的执行状态结果,“0”表示成功,有匹配到字符串;

-e PATTERN:多模式匹配;

[root@localhost~]#grep-e"r..t"-e"b..h"/etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin
mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash
gentoo:x:3003:3003::/home/gentoo:/bin/bash
ubuntu:x:3004:4004::/home/ubuntu:/bin/bash
mint:x:3100:3100::/home/mint:/bin/bash
hadoop:x:3102:3102::/home/hadoop:/bin/bash
hive:x:991:986::/home/hive:/bin/bash
linxuejing:x:3103:3103::/home/linxuejing:/bin/bash

-f FILE:FILE为每行包含了一个pattern的文本文件,及grep script;

[root@localhost~]#vimgrep.txt
root
bash

wKioL1bj6DiiMLKzAABNy2_4lRI446.png

-A num:显示匹配到的行的后n行;

[root@localhost~]#grep-A1"hadoop"/etc/passwd
hadoop:x:3102:3102::/home/hadoop:/bin/bash
hive:x:991:986::/home/hive:/bin/bash

-B num:显示匹配到的行的前n行;

[root@localhost~]#grep-B1"hadoop"/etc/passwd
fedora:x:3101:3101::/home/fedora:/bin/csh
hadoop:x:3102:3102::/home/hadoop:/bin/bash

-C num:显示匹配到行的前后n行;

[root@localhost~]#grep-C2"hadoop"/etc/passwd
mint:x:3100:3100::/home/mint:/bin/bash
fedora:x:3101:3101::/home/fedora:/bin/csh
hadoop:x:3102:3102::/home/hadoop:/bin/bash
hive:x:991:986::/home/hive:/bin/bash
linxuejing:x:3103:3103::/home/linxuejing:/bin/bash

-E:相当于“egrep”,表示支持扩展的正则表达式(下面会说);

-F:支持使用固定字符串,不支持正则表达式,相当于fgrep;

基本正则表达式元字符:

(1)字符匹配

.:匹配任意单个字符;

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

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

[a-z]:所有小写字母;

[A-Z]:所有大写字母;

[0-9]:所有数字;

[:digit:]:所有的数字;

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

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

[:alpha:]:任意字母(包括大小写);

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

[:space:]:空白字符;

[:punct:]:标点符号;

[:blank:]:空格和Tab键;

[:cntrl:]:所有的控制符(Ctrl+#);

[:print:]:所有可打印字符;

可使用man 7 glob查看;

示例:

.:查找/etc/passwd文件中以“r”开头“t”结尾中间跟了两个任意单个字符的行;

[root@localhost~]#grep"r..t"/etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin

[]:查找/tmp/meminfo文件中以S或s开头的行;

[root@localhost~]#grep"^[Ss]"/tmp/meminfo
SwapCached:0kB
SwapTotal:2098172kB
SwapFree:2098172kB
Shmem:13128kB
Slab:234936kB
SReclaimable:193688kB
SUnreclaim:41248kB
swap

[a-z]:表示“i”后面根两个字符不区分大小写的行;

[root@localhost~]#ifconfig|grep-i"i[a-z][a-z]"
eno16777736:flags=4163<UP,broADCAST,RUNNING,MULTICAST>mtu1500
inet192.168.254.130netmask255.255.255.0broadcast192.168.254.255
inet6fe80::20c:29ff:fe8e:eb7cprefixlen64scopeid0x20<link>
TXerrors0dropped0overruns0carrier0collisions0
lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536
inet127.0.0.1netmask255.0.0.0
inet6::1prefixlen128scopeid0x10<host>
TXerrors0dropped0overruns0carrier0collisions0

[[:alpha:]]:查找文件中以任意字母开头的行;

[root@localhost~]#grep"^[[:alpha:]]"/tmp/grub2.cfg
setpager=1
LH
if[-s$prefix/grubenv];then
fi
if["${next_entry}"];then
else
fi
if[x"${feature_menuentry_id}"=xy];then
else
fi
........

(2)次数匹配:

*:匹配其前面的字符任意次(包括0次);

[root@localhost~]#grep"x*y"test2.txt
abcy
yabcd
xxxyabc
abgdsfy
asdy

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

[root@localhost~]#grep"x\+y"test2.txt
xxxyabc


.*:任意长度的任意字符;

[root@localhost~]#grep"x.*y"test2.txt
xxxyabc
xjgbdfg,n,gnjgy9

\?:匹配前面的字符0次或1次(最多一次),前面的可有可无;

[root@localhost~]#grep"x\?y"test2.txt
abcy
yabcd
xxxyabc
abgdsfy
asdy
xjgbdfg,gnjgy


\{m\}:前面的字符精确出现m次,m为非负数整数;

root@localhost~]#grep"x\{2\}"test2.txt
xxxyabc


\{m,n\}:前面的字符出现至少m次,至多n次;

\{0,n\}:至多n次;

[root@localhost~]#grep"x\{1,3\}y"test2.txt
xxxyabc
[root@localhost~]#grep"x\{3,\}y"test2.txt
xxxyabc
#显示“i”后面出现3个字符;
[root@localhost~]#ifconfig|grep"i[[:alpha:]]\{3\}"
inet192.168.254.130netmask255.255.255.0broadcast192.168.254.255
inet6fe80::20c:29ff:fe8e:eb7cprefixlen64scopeid0x20<link>
TXerrors0dropped0overruns0carrier0collisions0
inet127.0.0.1netmask255.0.0.0
inet6::1prefixlen128scopeid0x10<host>
TXerrors0dropped0overruns0carrier0collisions0

(3)位置锚定

限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;

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

[root@localhost~]#grep"^root"/etc/passwd
root:x:0:0:root:/root:/bin/bash
#显示以root字符串开头的行;

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

^PATTERN$:整行匹配;

^$:空行;也不能有空白字符及Tab键;

^[[:space:]]*$:查找只有空白字符的行;并统计有多少行;

[root@localhost~]#grep"^[[:space:]]*$"/etc/grub2.cfg|wc-l
17

单词锚定:\<PATTERN\>

单词:由非特殊字符组成的连续字符都称为单词;

[root@localhost~]#cattest3.txt
root
rootls
rootnkll
openroot
[root@localhost~]#grep"\<root\>"test3.txt
root

\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN,\bPATTERN ;

[root@localhost~]#grep"\<root"/etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>,PATTERN\b ;

[root@localhost~]#grep"bash\>"/etc/passwd
root:x:0:0:root:/root:/bin/bash
mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash
gentoo:x:3003:3003::/home/gentoo:/bin/bash
ubuntu:x:3004:4004::/home/ubuntu:/bin/bash
mint:x:3100:3100::/home/mint:/bin/bash
hadoop:x:3102:3102::/home/hadoop:/bin/bash
hive:x:991:986::/home/hive:/bin/bash
linxuejing:x:3103:3103::/home/linxuejing:/bin/bash


练习:

  • 查找“netstat -tan”命令的结果中,以“LISTEN”后跟0个或多个空白字符结尾的行;

wKioL1bj1lehmHCHAAArLOBzEaA760.png

  • 查找“ldd /usr/bin/ls”命令的结果中文件路径;

wKioL1bj2iKxERpCAAAr9cJ3fgY293.png

  • 查找/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;

    wKioL1bj21HyPvd4AABpq3vtvUw664.png

    (4)分组与引用

    \(PATTERN\):将次PATTERN匹配到的字符当做一个整体进行处理;

    注意:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1,\2,\3,....

    \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的结果;


    后向引用:引用前面括号中的模式所匹配到的字符串;

    • \1表示引用前面模式匹配到的结果后面加一个“r”的行;

    wKiom1bj4iihn8J3AAAkG6cOrrY931.png

    二、扩展正则表达式
    egrep:支持使用扩展正则表达式,相当于“grep -E”


    扩展正则表达式的元字符:多数和上面一样,这里知举例说明不同之处;

    字符匹配:

    .:任意单个字符;

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

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

    次数匹配

    *:任意次;

    ?:0次或一次;

    root@localhost~]#egrep"x?y"test2.txt
    abcy
    yabcd
    xxxxxxxxyabc
    abgdsfy
    asdy
    xjgbdfg,SimKai;">+:匹配其前面的字符1次或多次; 
    
    [root@localhost~]#egrep"x+y"test2.txt
    xxxxxxxxyabc

    {m}:精确匹配m次;

    [root@localhost~]#egrep"x{5}y"test2.txt
    xxxxxxxxyabc
    #精确匹配前面的字符5次;

    {m,n}:至少m次,至多n次;

    [root@localhost~]#egrep"x{3,6}y"test2.txt
    xxxxxxxxyabc
    #匹配前面的字符至少3次,至多6次;

    位置锚定:

    ^:行首

    $:行尾

    \<,\b:词首

    \>,\b:词尾

    分组及引用

    (pattern):分组,括号中的模式匹配到的字符会被记录与正则表达式引擎内部的变量中;

    wKiom1bj72DhWTbEAAAl7WTWcq0774.png

    或者:表示C或者cat; ls或者LS;

    wKioL1bj8SmhUNz4AAAw_R6ygzs286.png


    第一次写博客,写的不是很好,请多多指教。

    j_0057.gif

Linun文本搜索之grep及正则表达式的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  4. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  5. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  6. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  7. macos – 运行brew命令充满了’同意Xcode / iOS许可证需要管理员权限,请通过sudo以root身份重新运行.’

    所以我跑了:如果滚动到底部,可以输入“同意”,然后就可以了.

  8. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  9. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  10. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部