Chinaunix首页 | 论坛 | 认证专区 | 博客

ChinaUnix博客

暂无签名

  • 博客访问: 211180
  • 博文数量: 250
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2687
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
  • 认证徽章:
文章分类

全部博文(250)

文章存档

2018年(22)

2017年(160)

2016年(68)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

分类: LINUX

【版权声明:转载请保留出处: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”的行:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep "user" /etc/passwd  
  2. usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin  
  3. oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin  
  4. qemu:x:107:107:qemu user:/:/sbin/nologin  
  5. radvd:x:75:75:radvd user:/:/sbin/nologin  
  6. tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin  
  7. saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin  
  8. rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin  
  9. nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin  
  10. #  
一般我们将要查找的字符串用双引号包含起来,一是以防被误解为 s h e l l命令,二是可以用来查找多个单词组成的字符串。
使用-c选项输出匹配行数:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep -c "user" /etc/passwd  
  2. 8  
  3. #  
使用-n选项输出匹配行及行号:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep -n "user" /etc/passwd  
  2. 18:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin  
  3. 19:oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin  
  4. 22:qemu:x:107:107:qemu user:/:/sbin/nologin  
  5. 25:radvd:x:75:75:radvd user:/:/sbin/nologin  
  6. 27:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin  
  7. 30:saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin  
  8. 34:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin  
  9. 38:nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin  
  10. #  
其中第一列输出行号,后面输出行内容。
我们发现上面匹配“user”的行有的返回的是包含“rpcuser”和“trousers“的行,如果我们要精确地抽取“user”的行,可以这样用:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep -n "\<user\>" /etc/passwd  
  2. 18:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin  
  3. 19:oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin  
  4. 22:qemu:x:107:107:qemu user:/:/sbin/nologin  
  5. 25:radvd:x:75:75:radvd user:/:/sbin/nologin  
  6. 30:saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin  
  7. 38:nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin  
  8. #  
瞬间少了27和34行。
如果要忽略大小写的话可以使用-i选项,如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. [root@localhost shell_text_filter]# grep -ni "\<user\>" /etc/passwd  
  2. 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin  
  3. 17:polkitd:x:999:999:User for polkitd:/:/sbin/nologin  
  4. 18:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin  
  5. 19:oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin  
  6. 20:colord:x:998:998:User for colord:/var/lib/colord:/sbin/nologin  
  7. 22:qemu:x:107:107:qemu user:/:/sbin/nologin  
  8. 25:radvd:x:75:75:radvd user:/:/sbin/nologin  
  9. 30:saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin  
  10. 34:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin  
  11. 35:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin  
  12. 38:nm-openconnect:x:992:991:NetworkManager user for OpenConnect:/:/sbin/nologin  
  13.    
瞬间多了几行。
使用选项-v可以过滤不含指定字符串的行:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep -v "a" /etc/passwd    
  2. bin:x:1:1:bin:/bin:/sbin/nologin  
  3. sync:x:5:0:sync:/sbin:/bin/sync  
  4. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown  
  5. nobody:x:99:99:Nobody:/:/sbin/nologin  
  6. polkitd:x:999:999:User for polkitd:/:/sbin/nologin  
  7. usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin  
  8. unbound:x:997:997:Unbound DNS resolver:/etc/unbound:/sbin/nologin  
  9. qemu:x:107:107:qemu user:/:/sbin/nologin  
  10. openvpn:x:996:995:OpenVPN:/etc/openvpn:/sbin/nologin  
  11. tcpdump:x:72:72::/:/sbin/nologin  
  12. #  
上面列出的行都不包含”a”。
结合使用ps命令可以查找当前系统是否正在运行我们需要的程序,命令如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # ps x | grep vsftpd  
  2. 1020 ?      Ss    0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf  
  3. 10264 pts/1    S+    0:00 grep --color=auto vsftpd  
  4. #  
但是发现打印结果包含当前shell进程,我们可以通过使用-v选项来过滤输出结果,如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # ps x | grep "vsftpd" | grep -v "grep"  
  2. 1020 ?      Ss    0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf  
  3. #  
该方法相当常用。
二、结合使用正则表达式
其实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集中任意字符,或为字母,或为数字。
比如:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep '.mm..' /etc/passwd  
  2. smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin  
  3. #  
  4. # grep 'm..l' /etc/passwd  
  5. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin  
  6. mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin  
  7. #  
在行首以^匹配字符串或字符序列,^只允许在一行的开始匹配字符或单词。
比如匹配以ma开头的行:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep '^ma' /etc/passwd     
  2. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin  
  3. mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin  
  4. #  
正则表达式可以将各种模式混合使用:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep '^ma....ll' /etc/passwd  
  2. mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin  
  3. #  
^在正则表达式中使用频繁,因为大量的抽取操作通常在行首。
在行尾以$匹配字符串或字符, $与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。比如匹配以bash结尾的行:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep 'bash$' /etc/passwd  
  2. root:x:0:0:root:/root:/bin/bash  
  3. allen:x:1000:1000:allen:/home/allen:/bin/bash  
  4. aln:x:1001:1001::/home/aln:/bin/bash  
  5. #  
如果要匹配所有空行,执行以下操作:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. ^ $  
具体分析为匹配行首,又匹配行尾,中间没有任何模式,因此为空行。
如果只返回包含一个字符的行,操作如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. ^ . $  
不像空白行,在行首与行尾之间有一个模式,代表任意单字符。
使用*匹配字符串中的单字符或其重复序列,使用此特殊字符匹配任意字符或字符串的重复多次表达式。
使用[]匹配一个范围或集合,可以用逗号将括弧内要匹配的不同字符串分开,使用“ - ”表示一个字符串范围,表明字符串范围从“ -”左边字符开始,到“ - ”右边字符结束。
比如要匹配包含aln或all的行,可以如下写:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep 'al[l,n]' /etc/passwd  
  2. allen:x:1000:1000:allen:/home/allen:/bin/bash  
  3. aln:x:1001:1001::/home/aln:/bin/bash  
  4. #  
忽略大小写的也可以由另外一种方式:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep 'System' /etc/passwd  
  2. dbus:x:81:81:System message bus:/:/sbin/nologin  
  3. pulse:x:995:994:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin  
  4. [root@localhost shell_text_filter]# grep '[Ss]ystem' /etc/passwd  
  5. dbus:x:81:81:System message bus:/:/sbin/nologin  
  6. systemd-journal-gateway:x:191:191:Journal Gateway:/var/log/journal:/usr/sbin/nologin  
  7. pulse:x:995:994:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin  
  8. #  
使用\{\}匹配模式结果出现的次数,使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用 \ { \ } ,此模式有三种形式,即:
pattern\{n\}  匹配模式出现n次。
pattern\{n,\}  匹配模式出现最少 n次。
pattern\{n,m}  匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。
过滤字符m至少出现2次的行:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep 'm\{2,\}' /etc/passwd  
  2. smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin  
  3. #  
过滤9出现2次,并以4结尾的行:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep '9\{2,\}4' /etc/passwd  
  2. pulse:x:995:994:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin  
  3. saslauth:x:994:76:"Saslauthd user":/run/saslauthd:/sbin/nologin  
  4. #  
grep命令加-E参数,这一扩展允许使用扩展模式匹配。比如要获取包含allen或aln的行,可以这样用。
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. # grep -E 'allen|aln' /etc/passwd    
  2. allen:x:1000:1000:allen:/home/allen:/bin/bash  
  3. aln:x:1001:1001::/home/aln:/bin/bash  

阅读(345) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册