【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】

Linux系统中有非常多文件,比方配置文件、日志文件、用户文件等。文件里都包括了大量的信息,我们能够使用cat等命令轻松将其输出到屏幕,但假设要从文件里分析或提取数据,还须要其它工具来实现。而linux正好提供了这些工具:grep、awk、sed等。把这些工具使用好,能够极大地提高你的工作效率,对系统管理员分析数据有极大帮助,而对linux开发者来说也能够在开发測试中以及平时使用中节省不少时间。本系列文中将介绍这些工具来实现文本过滤分析。

经常使用的grep选项有:

-c  仅仅输出匹配行的计数。

-i  不区分大写和小写(仅仅适用于单字符) 。

-h  查询多文件时不显示文件名称。

-l  查询多文件时仅仅输出包括匹配字符的文件名称。

-n  显示匹配行及行号。

-s  不显示不存在或无匹配文本的错误信息。

-v  显示不包括匹配文本的全部行。

    本节文章大数演示样例均使用文件/etc/passwd来作为过滤对象。

一、匹配行

最简单(也是最经常使用)的使用方法是在一个文件(或多个文件)中查找某一字符串,比方在文件/etc/passwd中查找包括字符串”user”的行:

# grep "user" /etc/passwd
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin
#

一般我们将要查找的字符串用双引號包括起来,一是以防被误解为 s h e l l命令,二是能够用来查找多个单词组成的字符串。

使用-c选项输出匹配行数:

# grep -c "user" /etc/passwd
8
#

使用-n选项输出匹配行及行号:

# grep -n "user" /etc/passwd
18:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
19:oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
22:qemu:x:107:107:qemu user:/:/sbin/nologin
25:radvd:x:75:75:radvd user:/:/sbin/nologin
27:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
30:saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin
34:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
38:nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin
#

当中第一列输出行号,后面输出行内容。

我们发现上面匹配“user”的行有的返回的是包括“rpcuser”和“trousers“的行,假设我们要精确地抽取“user”的行,能够这样用:

# grep -n "\<user\>" /etc/passwd
18:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
19:oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
22:qemu:x:107:107:qemu user:/:/sbin/nologin
25:radvd:x:75:75:radvd user:/:/sbin/nologin
30:saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin
38:nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin
#

瞬间少了27和34行。

假设要忽略大写和小写的话能够使用-i选项,例如以下:

[root@localhost shell_text_filter]# grep -ni "\<user\>" /etc/passwd
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
17:polkitd:x:999:999:User for polkitd:/:/sbin/nologin
18:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
19:oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
20:colord:x:998:998:User for colord:/var/lib/colord:/sbin/nologin
22:qemu:x:107:107:qemu user:/:/sbin/nologin
25:radvd:x:75:75:radvd user:/:/sbin/nologin
30:saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin
34:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
35:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
38:nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin

瞬间多了几行。

使用选项-v能够过滤不含指定字符串的行:

# grep -v "a" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:999:User for polkitd:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
unbound:x:997:997:Unbound DNS resolver:/etc/unbound:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
openvpn:x:996:995:OpenVPN:/etc/openvpn:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
#

上面列出的行都不包括”a”。

结合使用ps命令能够查找当前系统是否正在执行我们须要的程序,命令例如以下:

# ps x | grep vsftpd
1020 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
10264 pts/1 S+ 0:00 grep --color=auto vsftpd
#

可是发现打印结果包括当前shell进程,我们能够通过使用-v选项来过滤输出结果,例如以下:

# ps x | grep "vsftpd" | grep -v "grep"
1020 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
#

该方法相当经常使用。

二、结合使用正則表達式

事实上grep过滤能够和正則表達式联合起来用,使匹配增加一些规则,这种使用更为灵活。使用正則表達式时最好用单引號括起来,这样能够防止 g r e p中使用的专有模式与一些shell命令的特殊方式相混淆。

这里我们先讲一下正則表達式,以下是正則表達式基本元字符集及其含义:

^ 仅仅仅仅匹配行首

$ 仅仅仅仅匹配行尾

* 仅仅一个单字符后紧跟*,匹配0个或多个此单字符

[ ] 仅仅匹配[ ] 内字符。能够是一个单字符,也能够是字符序列。能够使用 -表示[ ]内字符序列范围,如用 [ 1 - 5 ]取代[ 1 2 3 4 5 ]

\ 仅仅用来屏蔽一个元字符的特殊含义。由于有时在 s h e l l中一些元字符有

特殊含义。\能够使其失去应有意义

. 仅仅匹配随意单字符

p a t t e r n \ { n \ } 仅仅用来匹配前面 p a t t e r n出现次数。n为次数

p a t t e r n \ { n,\ } m 仅仅含义同上,但次数最少为 n

p a t t e r n \ { n,m \ } 仅仅含义同上,但 p a t t e r n出现次数在n与m之间。

句点“.”能够匹配随意单字符。“.”同意匹配A S C I I集中随意字符,或为字母,或为数字。

比方:

# grep '.mm..' /etc/passwd
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
#
# grep 'm..l' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
#

在行首以^匹配字符串或字符序列,^仅仅同意在一行的開始匹配字符或单词。

比方匹配以ma开头的行:

# grep '^ma' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
#

正則表達式能够将各种模式混合使用:

# grep '^ma....ll' /etc/passwd
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
#

^在正則表達式中使用频繁,由于大量的抽取操作通常在行首。

在行尾以$匹配字符串或字符, $与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。比方匹配以bash结尾的行:

# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
allen:x:1000:1000:allen:/home/allen:/bin/bash
aln:x:1001:1001::/home/aln:/bin/bash
#

假设要匹配全部空行,运行下面操作:

^ $

详细分析为匹配行首,又匹配行尾,中间没有不论什么模式,因此为空行。

假设仅仅返回包括一个字符的行,操作例如以下:

^ . $

不像空白行,在行首与行尾之间有一个模式,代表随意单字符。

使用*匹配字符串中的单字符或其反复序列,使用此特殊字符匹配随意字符或字符串的反复多次表达式。

使用[]匹配一个范围或集合,能够用逗号将括弧内要匹配的不同字符串分开,使用“ - ”表示一个字符串范围,表明字符串范围从“ -”左边字符開始,到“ - ”右边字符结束。

比方要匹配包括aln或all的行,能够例如以下写:

# grep 'al[l,n]' /etc/passwd
allen:x:1000:1000:allen:/home/allen:/bin/bash
aln:x:1001:1001::/home/aln:/bin/bash
#

忽略大写和小写的也能够由第二种方式:

# grep 'System' /etc/passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
pulse:x:995:994:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@localhost shell_text_filter]# grep '[Ss]ystem' /etc/passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-journal-gateway:x:191:191:Journal Gateway:/var/log/journal:/usr/sbin/nologin
pulse:x:995:994:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
#

使用\{\}匹配模式结果出现的次数,使用*可匹配全部匹配结果随意次,但假设仅仅要指定次数,就应使用 \ { \ } ,此模式有三种形式,即:

pattern\{n\}  匹配模式出现n次。

pattern\{n,\}  匹配模式出现最少 n次。

pattern\{n,m}  匹配模式出现n到m次之间,n , m为0 - 2 5 5中随意整数。

过滤字符m至少出现2次的行:

# grep 'm\{2,\}' /etc/passwd
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
#

过滤9出现2次,并以4结尾的行:

# grep '9\{2,\}4' /etc/passwd
pulse:x:995:994:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin
#

grep命令加-E參数,这一扩展同意使用扩展模式匹配。比方要获取包括allen或aln的行,能够这样用。

# grep -E 'allen|aln' /etc/passwd
allen:x:1000:1000:allen:/home/allen:/bin/bash
aln:x:1001:1001::/home/aln:/bin/bash
#

shell文本过滤编程(一):grep和正則表達式的更多相关文章

  1. linux系统之shell编程-正則表達式

    shell编程正則表達式: 1:元字符   [ ]  .   *  ? + ( )  |  {  }  ^  $ 2 : [a-z0-9]  表示匹配随意数字和字母的一个 3 :  [^a-z]    ...

  2. grep 和 sed:linux经常使用工具 &amp; 基本正則表達式

    grep 见链接:http://www.cyberciti.biz/faq/grep-regular-expressions/ sed參考文章:http://www.thegeekstuff.com ...

  3. shell脚本学习笔记 (正則表達式)

    正則表達式一般有三个部分组成,他们各自是:字符类,数量限定符,位置限定符. 规定一些特殊语法表示字符类.数 量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正則表達式(Regu ...

  4. 鸟书shell 学习笔记(二) shell中正則表達式相关

    通配符与正則表達式的差别 通配符是bash原生支持的语法,正則表達式是处理字符串的一种表示方式, 正則表達式须要支持的工具支持才干够 语系设置 : export LANG=C grep alias 设 ...

  5. Linux正則表達式-反复出现的字符

    星号(*)元字符表示它前面的正則表達式能够出现零次或多次.也就是说,假设它改动了单个字符.那么该字符能够在那里也能够不在那里,而且假设它在那里,那可能会不止出现一个.能够使用星号元字符匹配出如今引號中 ...

  6. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

  7. 轻松学习之Linux教程六 正則表達式具体解释

    本系列文章由@超人爱因斯坦出品.转载请注明出处. 作者:超人爱因斯坦    个人站点:http://www.hpw123.net          文章链接:http://hpw123.net/a/L ...

  8. js中 正則表達式

    正則表達式使用具体解释 简单介绍 简单的说,正則表達式是一种能够用于模式匹配和替换的强有力的工具.其作用例如以下: 測试字符串的某个模式.比如,能够对一个输入字符串进行測试,看在该字符串是否存在一个电 ...

  9. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

随机推荐

  1. pandas深入理解

    Pandas是一个Python库,旨在通过“标记”和“关系”数据以完成数据整理工作,库中有两个主要的数据结构Series和DataFrame In [1]: import numpy as np In ...

  2. elcipse 编译cocos2d-x android

    http://blog.csdn.net/eyu8874521/article/details/22605695 最開始学习cocos2dx.大多数人可能是被复杂的环境配置过程搞死的,尤其是和Andr ...

  3. LightOJ--1094-- Farthest Nodes in a Tree(树的直径裸题)

    Farthest Nodes in a Tree Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu S ...

  4. webservice为什么不能用List参数,而只能用数组代替,我想是否因为List没有具体的类型信息,但用泛型的List(如:List<customer>)为什么也不行。如果用作参数的类中含有List<T>字段该如何处理?webservice参数是否支持

    转自:https://social.microsoft.com/Forums/zh-CN/aded4301-b5f1-4aa6-aa46-16c46a60d05e/webservice20026201 ...

  5. POJ 3260 DP

    只需要对John的付款数做一次多重背包,对shopkeeper的找零钱数做一次完全背包即可. 最重要的是上界的处理.可以注意到,John的付款数最多为maxv*maxv+m,也就是24400元.同理, ...

  6. 关于Angular官网《英雄指南》教程几点问题修正(此问题在2018年4月份有效,以后可能就订正了)

    1.官网中在导入“of”关键字时的引用为: import { Observable, of } from 'rxjs'; 应该改为: import { Observable } from 'rxjs/ ...

  7. (转载)解决切换Fragment时布局重新实例化

    解决切换Fragment时布局重新实例化 作者 instanceof 关注 2015.12.30 17:25* 字数 628 阅读 7616评论 17喜欢 23 关于Fragment 在这简单说一下F ...

  8. solarwinds之监控路由器

    配置路由器开启SNMP功能 1.         开启路由器的SNMP功能,并指定两个共同体名   网络扫描 1.         添加一个新扫描      2.         默认下一步     ...

  9. Unity 烘焙的2种方式

    游戏场景通常有许多光源,使用实时渲染会非常消耗性能,解决办法是烘焙,烘焙有2种方式. 1, 在3dmax等模型制作软件中对场景进行烘焙.将烘焙好的模型以及贴图导入到unity3d. 相对复杂但效果好 ...

  10. CorelDRAW X6最新注册激活机制

    最近购买CorelDRAW X6的小伙伴可能对如何注册激活软件存在疑惑,下面小编一步步教您如何快速激活CorelDRAW X6. CorelDRAW X6最新注册机制如下: 1.关注“Corel服务中 ...