文本处理三剑客-grep及正则表达式初

什么是正则表达式

基本正则表达式的元字符

扩展正则表达式

grep的基本理解

grep的基本选项

grep的应用实例

什么是正则表达式

 

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regexregexpRE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式的文本。(摘自百度百科)

个人理解:正则表达式是由一些特殊字符及文本所标写的一种模式,通过搭配文本处理工具来搜索文本并将匹配数据打印出来。

  正则表达式分类

基本的正则表达式(Basic Regular Expression 又叫vfr Basic RegEx  简称 BRE

扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 ERE

引擎:采用不同算法,检查处理正则表达式的软件模块



基本正则表达式的元字符

字符匹配

.        单个字符
[]       匹配任意字符以内范围
[^]      匹配任意字符以外的的范围(取反)
[:digit:]匹配任意数字
[:lower:]匹配任意小写字母
[:upper:]匹配任意大写字母
[:alpha:]匹配任意大小写字母
[:space:]匹配任意空白或空格
[:punct:]匹配所有标点符号
[:alnum:]匹配所有字母和数字

 次数匹配

*匹配前一个字符的0到任意次
.*任意字符的任意长度
\?匹配前面的字符0-1次
\+匹配前面字符的1次以上包括1次
\{n\}匹配前面字符n次
\{m,n\}匹配前面字符最少m,最多n次
\{,m\}最少m次
\{m,\}最多m次

 

位置锚定  

^行首
$行尾
^$空行
\<词首锚定   \>词尾锚定
\b词首锚定   \b词尾锚定
\<匹配整个单词\>

 

分组  

  将一个或多个字符绑定在一起作为一个整体处理

\(\)

例如:\(root\) 匹配一行中所有为root字符的组

例如:ab*c

 表示的是b的任意次而不是说是ab的任意次,要实现这一功能,就可以使用分组\(ab\)*c

 

分组括号中的模式匹配到的内容会被正则表达式引擎自动记录在内部变量中,这些变量为:

\1:模式从左侧开始,第一个左侧括号以及与之匹配的右括号之间的模式所匹配到的字符

\2:模式从左侧开始,第二个左侧括号以及与之匹配的右括号之间的模式所匹配到的字符

括号可以内嵌但不能交叉

 



扩展正则表达式

扩展正则表达式的用法

erep -Eegrep

 

扩展正则表达式的元字符

字符匹配

.任意单个字符
[]指定范围内的字符
[]不在范围内的字符,取反

 

次数匹配

*匹配前面字符的任意次
?匹配前面自0次或1次
+匹配前面字符至少1次以上包括1次
{n}匹配n次
{n,m}匹配至少n次最多m次

 

位置锚定

^行首
$行尾
^$空行
\<,\b:句首
\>,\b:句尾
 或者使用|
A|b:A或b

 



grep的基本理解

文本搜索工具,通过正则表达式及文本字符编写的过滤条件进行搭配来对文本进行匹配检查,打印匹配并输出结果。



grep基本选项

grep -i 不区分大小写
grep -v 取反
grep -n 显示行号
grep -c 显示匹配的有多少行
grep -o 只显示匹配的字符或其他
grep -q 静默模式 就是不显示匹配的结果,什么都不显示
用echo %?得出上一条命令的结果
0为正确输出
非0位错误的命令输出
grep -A {number}匹配结果行后几行
grep -B {number}匹配结果前几行
grep -C {number}匹配结果的前后几行
grep -e 关键字 -e 关键字 多个关键字作为匹配条件(不限制说一定要匹配前后,匹配前后其中一个)
grep -w 匹配整个单词不包含包括

grep的应用实例

1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)

[root@localhost ~]# grep -i "^s" /proc/meminfo 
SwapCached:           64 kB
SwapTotal:       2097148 kB
SwapFree:        2091288 kB
Shmem:              6016 kB
Slab:             228152 kB
SReclaimable:     153116 kB
SUnreclaim:        75036 kB
[root@localhost ~]# grep -e "^S" -e "^s" /proc/meminfo 
SwapCached:           64 kB
SwapTotal:       2097148 kB
SwapFree:        2091288 kB
Shmem:              6016 kB
Slab:             228152 kB
SReclaimable:     153116 kB
SUnreclaim:        75036 kB

2、显示/etc/passwd文件中不以/bin/bash结尾的行

[root@localhost ~]# grep -v "/bin/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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

3、显示用户rpc默认的shell程序

[root@localhost ~]# grep "\brpc\b" /etc/passwd |cut -d: -f7
/sbin/nologin

4、找出/etc/passwd中的两位或三位数

[root@localhost ~]# grep "\b[[:digit:]]\{2,3\}\b" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin

5、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

[root@localhost ~]# grep "^[[:space:]]\+[^[:space:]].*" /etc/grub2.cfg 
  load_env
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
   set default="${saved_entry}"
  menuentry_id_option="--id"
  menuentry_id_option=""
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
  if [ -z "${boot_once}" ];

6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行

[root@localhost ~]# netstat -tan |grep "LISTEN[[:space:]]*$"
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 ::1:6010                :::*                    LISTEN

7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行

[root@localhost testdir]# grep "^\(\<.*\>\).*/\1$"  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
bash:x:1001:1001::/home/bash:/bin/bash
nologin:x:1004:1004::/home/nologin:/sbin/nologin

原创文章,作者:snowbamboo,如若转载,请注明出处:http://www.178linux.com/29854

(0)
snowbamboosnowbamboo
上一篇 2016-08-07
下一篇 2016-08-07

相关推荐

  • linux命令速记技巧

    linux命令速记技巧 linux命令有一定的命名规则,一个正常的coder在编码的过程中都会考虑命名的语义化,开发者对函数的命名一定也尽量遵循这个规律.了解目录所对应的英文全称有助于自己的记忆,理解记忆获得知识的留存率要远大于死记硬背.如果英文基础太差,小编建议先学好英文基本功再来学习这些命令. 命令的中文对照 命令 英文全称 中文释义 ls list 列…

    Linux干货 2017-03-25
  • Linux系统中快捷键和man手册讲解

    1、Linux中的man手册   man这个单词的翻译是男人的意思,但在Linux中是我们对于命令的帮助查找,我们知道在Linux中命令有很多,简直浩瀚如海,我们不可能都能理解每个命令的意思。所以,Linux的帮助文件大大解决了我们对于命令的理解性。通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 2、语法格式…

    Linux干货 2016-10-17
  • SDCC 2017互联网运维开发实战峰会上海站

    3月17日-19日,由CSDN重磅打造的互联网运维开发实战峰会、数据库核心技术与应用实战峰会和互联网应用 架构实战峰会将在上海举行。 作为SDCC 2017(中国软件开发者大会)系列技术峰会的一部分,秉承干货实料(案例)的内容原则。 这三场峰会将邀请业内顶尖的架构师和技术专家,共同探讨运维工具研发与实践、运维自动化系统的构建、大数据与运维…

    Linux干货 2017-02-11
  • 软链接与硬链接的区别

      这两牵扯到链接,那么先介绍以下链接。   在文件系统中,有一种可以把不同的文件相连接到一起的机制,这个机制叫做链接。通俗的话来说就是打开两个不同的文件夹,其实进去的是同一个。它可以把一个文件用不同的名字和路径来表示出来。系统通过inode(索引节点,文件唯一标识)来识别是否为同一个文件,无论系统上有有多少个链接,在磁盘上只有一个唯一的…

    2017-05-25
  • N25-第六周博客作业

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; [root@han ~]# cp /etc/rc.d/rc.sysinit /tmp [root@han ~]#&n…

    Linux干货 2017-02-16
  • NFS服务器设置

    一、NFS的相关概念     NFS(Network File System)即网络文件系统的缩写,由Sun公司研发,其目的是为了解决网络文件共享的问题。用户可以实现像挂载本地文件系统一样挂载NFS服务器的共享目录;其具有配置简单、使用高效的特点,但只能在Linux系统使用,不能跨平台使用。 &nb…

    Linux干货 2015-06-25