【版权声明:转载请保留出处: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. HDU 2838 (树状数组求逆序数)

    题意: 给你N个排列不规则的数(1~N),任务是把它从小到大排好,每次仅仅能交换相邻两个数,交换一次的代价为两数之和.求最小代价 思路:对于当前数X.我们如果知道前面比它大的数有多少,如果为K,那么有 ...

  2. 石子合并(区间dp)

    石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程仅仅能每次将相邻 ...

  3. 【转】Core Bluetooth框架之二:后台处理

    原文网址:http://southpeak.github.io/blog/2014/07/31/core-bluetoothkuang-jia-zhi-er-:hou-tai-chu-li/ 在开发B ...

  4. 关于SqlBulkCopy的测试

    最近要做.net关于sql大量插入,找到了sqlbulkcopy(自己google下,应该很多说明了)这个好东西,于是测试下性能,用了三个方法对比: 1)直接用ado.net,for循环N次进行单条插 ...

  5. 【转】C# ABP WebApi与Swagger UI的集成

    以前在做WebAPI调用测试时,一直在使用Fiddler测试工具了,而且这个用起来比较繁琐,需要各种配置,并且不直观,还有一点是还得弄明白URL地址和要传递的参数,然后才能调用.  最近新入职,公司里 ...

  6. Oracle学习系类篇(三)

    1. 存储过程 CREATE  OR REPLACE PROCEDURE  SP_NAME( PM_NAME [IN/OUT/IN OUT] PM_TYPE...)            {AS}   ...

  7. learn cmake

    cmake简介 在cmake出现之前,在linuxiax下,大型软件系统一般使用make来控制编译过程,而在Windows下可能是用vs下一个project来构建.一个复杂的系统本身依赖关系就很麻烦, ...

  8. ZBrush中移动笔刷介绍

    移动笔刷是ZBrush®笔刷中举足轻重的一项,利用移动笔刷可以实现移动顶点的功能,还能改变模型的某一个点和某一位置.本文内容向大家介绍ZBrush®中移动笔刷以便大家熟悉它的用法和特性. 移动笔刷 可 ...

  9. zabbix_agent代理端监控FTP服务

    (FTP服务器) 监控agent的Linux主机我们在之前就已经做好了,现在直接安装ftp服务即可 (可以看上一遍文章如何搭建监控端agent)  这里不过多演示 [root@agent ~]# yu ...

  10. 字典树Trie Tree

    又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀 ...