文本处理三剑客之grep

文本处理三剑客之grep


  • 正则表达式(regex)
  • 文本处理工具
  • grep
  • egrep


试验环境:CentOS 7.2

正则表达式

Linux的哲学之一“一切皆文件”,学习Linux应得掌握其基本的文本处理工具,这些工具主要包括:

文件内容:less和cat 文件截取:head和tail
文件抽取:cut
关键字搜索:grep

正则表达式是计算机科学中的一个概念,又称作regexRE, 正则表达式诞生于对神经网络研究的需要,随着技术发展,正则表达式已经广泛应用于各个领域,其主要应用对象是文本。正则就是常规,正规的意思,由一些普通字符与元字符(metacharacters)组成,普通字符包括大小写字母和数字,而元字符则具有其特殊的含义,表示控制或通配的功能。

在Linux中,支持正则表达式的程序有:grep, vim, less, nginx等,有两种类型:

基本正则表达式:BRE扩展正则表达式:ERE

元字符分类:字符匹配、匹配次数,位置锚定、分组

元字符简介表

元字符 定义
\ 字符标识符,后向引用,转义符
^ 匹配字符串的开始位置
$ 匹配字符串的结束位置
. 匹配任意单个字符
* 贪婪模式,尽可能长的匹配,匹配前面的子表达式任意次
.* 匹配任意长度的任意单个字符
+ 匹配前面的子表达式1次或多次(大于等于1)
? 匹配前面的子表达式0次或1次
{n} 匹配确定的n次
{n,} 至少匹配n次
{n,m} 至少匹配n次,最多匹配m次
? 非贪婪模式,尽可以少地匹配所搜索到的字符串
(pattern) 匹配并获取pattern
[xyz] 字符集合,匹配所包含的任意字符
[^xyz] 负值字符集合,匹配未包含的任意字符
[a-z] 字符范围集合,匹配指定范围内的任意字符
[^a-z] 负值字符范围集合,匹配任何不在范围内的任意字符
\b 位置匹配,匹配一个单词边界,指单词与空格间的位置
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
\s 匹配任何一个不可见字符,包括空格,制表符等,等价于[\f\n\r\t\v]
\S 匹配任何可见字符,等价于[^\f\n\r\t\v]
\w 匹配下划线在内的任何单词字符,“单词”使用Unicode字符集
\W 匹配任何非单词字符
\num 引用匹配,num为一个正整数,如‘(.)\1‘匹配两个连续的相同字符
< > 匹配词的开始和结束
( ) 将括号内的表达式定义为组(group),并且被正则表达式记录在内部的 变量中,可以被\1到\9的符号来引用
+ 匹配1个或多个恰好在它前面的那个字符
{i}{i,j} 匹配指定数目的字符,这些字符是在它前面的表达式定义的

另外,| 表示一个逻辑或运算!

元字符 定义
[:alpha:] 所有字母,包括大小写
[:alnum:] 所有字母和数字
[:upper:] 所有大写字母
[:lower:] 所有小写字母
[:digit:] 所有数字
[:punct:] 所有标点符号
[: space:] 空格和Tab

文本查看命令:cat, tac, rev

cat - concatenate files and print on the standard outputcat [OPTION]... [FILE]...

tac - concatenate and print files in reversetac [OPTION]... [FILE]...

rev - reverse lines of a file or filesrev [options] [file ...]

cat

  1. -E: 显示行结束符$
  2. -n: 对显示出的每一行进行编号
  3. -A: 显示所有控制符
  4. -b: 非空行编号
  5. -s: 压缩连续的空行成一行

哈哈,简洁点!

分页查看文件内容:more, less

more [options] file [...]

-d: 显示翻页及退出标致

less: 一页一页地查看文件或STDIN输出
    查看时有用的命令包括:
        /文本     表示搜索文本
        ?文本     表示搜索文本        
        n/N 跳到下一个或上一个匹配
        
        less命令是man命令使用的分页器

显示文本前或后行的内容:head, tail

head

head - output the first part of fileshead [OPTION]... [FILE]...

-c #: 指定获取前#字节
-n #: 指定获取前n行
-#: 指定行数

tail

tail - output the last part of files
tail [OPTION]... [FILE]...

-c #: 指定获取后#字节
-n #: 指定获取后n行;
-n +K: 表示从第K行开始输出
-#: 指定行数
-f: 跟踪显示文件新追加的内容,常用日志监控

上述命令就不单独举例了 

按列抽取文件cut与合并文件paste

cut

主要用途

显示或删除文本中的指定字段

cut命令可以显示和删除文本中的指定字段或部分,将得到的内容输出到标准输出上,注意,cut有一个重要的特性,就是按列截取与显示;另外,cut还有连接两个和多个文件的作用,如cut f1 f2 > f3 将把文件f1和f2的内容合并起来,然后通过重定向符 > 的作用将它们放入到文件f3中。

常用参数

  1. -b: --bytes=LIST, 仅显示行中指定范围内的内容
  2. -c: --characters=LIST, 仅显示行中指定范围内的字符
  3. -d: --delimiter=DELIM, 指定字段的分隔符,默认的分隔符为‘TAB‘
  4. -n: 与-b连用,不分割多字节字符
  5. --output-delimiter=STRING: 指定输出分割符
  6. -f: --fields=LIST,显示指定字段的内容
    #: 第#个字段
         #,#[,#]: 离散的多个字段,如1,3,7
         #-#:连续的多个字段
         混合使用:如1-3,7

使用示例

[[email protected] ~]# cat file1
num char
1    a 
2    b
3    c
[[email protected] ~]# cat file2
Name       Gen
liansir    man  
xiaolei    girl
[[email protected] ~]# 
[[email protected] ~]# cut -c1-3 file2  # 打印第1到第3个字符Nam
lia
xia
[[email protected] ~]# cut -b1-2 file1 # 打印批1到第2个字节 
nu
1 
2 
3 
[[email protected] ~]

其它参数会在后面的grep中给出示例。

paste

主要用途

合并两个文件同行号的列到一行

paste - merge lines of files
paste [OPTION]... [FILE]...

常用参数

  1. -d: --delimiters=LIST, 指定分隔符,默认用TAB.
  2. -s: 所有行合成一行显示
    paste f1 f2
    paste -s f1 f2

使用示例

[[email protected] ~]# paste file1 file2  # 合并两个文件同行号的列到一行
num char        Name       Gen
1    a  liansir    man  
2    b  xiaolei    girl
3    c
[[email protected] ~]# paste -s file1 file2  # 合成一行显示
num char        1    a  2    b  3    c
Name       Gen  liansir    man          xiaolei    girl
[[email protected] ~]#

分析文本的工具:wc, diff, patch, sort, uniq

wc

主要用途

文本数据统计

wc - print newline, word, and byte counts for each filewc [OPTION]... [FILE]...

wc命令用来文本的数据统计,可以计算文本的Byte数、字数和列数。

常用参数

  1. -c: --bytes, --chars,字节总数
  2. -m: --chars,字符总数
  3. -l: --lines,行数
  4. -w: --words,单词总数

使用示例

[[email protected] ~]# cat file1
num char
1    a 
2    b
3    c
[[email protected] ~]# wc file1
 4  8 31 file1
[[email protected] ~]# wc -l file1
4 file1
[[email protected] ~]# wc -c file1
31 file1
[[email protected] ~]# wc -m file1
31 file1
[[email protected] ~]# wc -w file1
8 file1
[[email protected] ~]#

diff

主要用途

比较文本

diff - compare files line by line
diff [OPTION]... FILES

diff一般就是用来比较两个给定的文本的异同,且以逐行的方式(line by line) 进行扫描;如果该命令是用来比较目录,则会比较两个目录中具有相同文件名的文件,且不会对其子目录文件进行任何比较。另外,diff命令的输出被保存在一个叫“补丁”的文件中,使用 -u 选项来输出“统一的(unified) diff格式文件,最适用于补丁文件。

常用参数

  1. -y: 以并列的方式显示文件的异同之外
  2. -q: 仅显示有无差异,不显示详细信息
  3. -u: 以统一合并的方式来显示文件的不同

使用示例

看这两个文件:

看看两个文件有何异同:

[[email protected] ~]# diff file2 file3

[[email protected] ~]# diff -q file2 file3
Files file2 and file3 differ
[[email protected] ~]# 
[[email protected] ~]# diff -y file2 file3 
Name       Gen                                                  Name       Gen
liansir    man                                                | 1iansir    man  
xiaolei    girl                                               | xia0lei    gir1
[[email protected] ~]# 
[[email protected] ~]# diff -u file2 file3 
--- file2       2016-08-06 05:06:59.809254741 -0400
+++ file3       2016-08-06 07:03:22.579524822 -0400
@@ -1,3 +1,3 @@
 Name       Gen
-liansir    man  
-xiaolei    girl
+1iansir    man  
+xia0lei    gir1
[[email protected] ~]#

patch

主要用途

备份与安装补丁程序

patch - apply changes to files
patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]           
[-o outfile][-p num][-r rejectfile][file]

patch命令可以为开放源代码程序安装补丁,一般情况下,修改一个或少量文件可下达指令依序执行,如果配合修补文件的方式则能一次修补大批文件,这是Linux系统一项重要的升级方法。

常用参数

  1. -b: --backup, 备份每一个原始文件
  2. --binary: 以二进制模式读取数据,而不通过标准输出设备
  3. -u: 可将文件一差异存到其他文件中

使用示例

说明:patch这个命令在CentOS 7.2上能够man 出来,但运行时找不到命令,在CentOS 6.8上无此情况

[[email protected] ~]# diff -u f1 f2 > f1f2.diff     # -u将不同重定向到其他文件
[[email protected] ~]# patch -b f1 f1f2.diff # -b选项是备份f1
[[email protected] ~]#[[email protected] ~]# ll f*       
-rw-r--r--. 1 root root  22 Aug  6 20:40 f1
-rw-r--r--. 1 root root   0 Aug  6 20:42 f1f2.diff
-rw-r--r--. 1 root root 845 Aug  5 14:28 f1.orig # 自动生成的
-rw-r--r--. 1 root root  22 Aug  6 20:40 f2
[[email protected] ~]#

说明:如果f2丢了,可以使用f1与f1f2.diff找回f2,但是,如果在patch时没有-b,则将f1和f1f2.diff恢复f2后,会覆盖原来的f1,故这里使用-b达到同时备份f1的效果。

练习一

1、找出ifconfig命令结果中本机的所有IPv4地址

[[email protected] ~]# ifconfig |tr -cs ‘[0-9].‘ ‘\n‘ |sort -ut. -k3 -n

2、查出分区空间使用率的最大百分比值

[[email protected] ~]# df |tr -s ‘ ‘ |cut -d‘ ‘ -f5 |tr -d % |sort -r |tail -n +2 |head -n 1

3、查出用户UID最大值的用户名、UID及shell类型.

[[email protected] ~]# getent passwd |cut -d: -f1,3,7 |sort -t: -k2 -n | tail -1

4、查出/tmp的权限,以数字方式显示

[[email protected] ~]# stat /tmp |head -4 |tail -1 |tr -s ‘ ‘ |cut -d‘(‘ -f2 |cut -d/ -f1
或
[[email protected] ~]# stat /tmp |head -4 |tail -1 |tr ‘ ‘ ‘\n‘ |head -2 |tail -1 |tr -dc ‘[:digit:]‘

5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序

[[email protected] ~]# netstat -nt | tr -s ‘ ‘ |cut -d‘ ‘ -f5 |tail -n +3 |cut -d: -f1 |sort -n |uniq -c


grep

主要用途

文本搜索工具

grep, egrep, fgrep - print lines matching a pattern
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索并过滤文本,并把匹配的行打印出来( By default, grep prints the matching lines.)

常用参数

  1. -a: --test,--binary-files=text option, 不要忽略二进制数据
  2. -A #: --after-context, 后#行
  3. -B #: --before-context, 前#行
  4. -C #: --context, 前后各#行
  5. -c: 统计匹配的行数
  6. -n: 显示匹配的行号
  7. -q: 静默模式,不输出任何信息
  8. -i: 忽略字符大小写
  9. -v: 显示不能够pattern匹配到的行
  10. -w: 整行匹配整个单词
  11. --color=auto: 对匹配到的文本着色
  12. -e: 实现多个选项之间的逻辑或关系
  13. -E: 使用ERE

练习二:正则表达式

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

[[email protected] ~]# grep -i ^s /proc/meminfo或
[[email protected] ~]# grep -e ‘^s‘ -e ‘^S‘ /proc/meminfo

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

[[email protected] ~]# grep -v /bin/bash$ /etc/passwd

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

[[email protected] ~]# grep ‘^rpc\>‘ /etc/passwd |cut -d: -f7
/sbin/nologin
或
[[email protected] ~]# grep -w ‘\<rpc\>‘ /etc/passwd |cut -d: -f7
/sbin/nologin
[[email protected] ~]#
或
[[email protected] ~]# grep ‘\brpc\b‘ /etc/passwd |cut -d: -f7 
/sbin/nologin
[[email protected] ~]#

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

[[email protected] ~]# cat /etc/passwd |tr -cs ‘[:digit:]‘ ‘\n‘ |grep ‘\b[0-9][0-9][0-9]\?\b‘
或
[[email protected] ~]# getent passwd |tr -cs ‘[:digit:]‘ ‘\n‘ |grep ‘\b[0-9]\{2,3\}\b‘

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

这是一个:^‘开头‘ 与 ‘^非‘的练习

[[email protected] ~]# grep ‘^[[:space:]]\+[^[:space:]]‘ /etc/grub2.cfg

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行

netstat -tan |grep ‘\<LISTEN\>[[:space:]]*$‘

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

[[email protected] ~]# grep ‘^\<\(.*\)\>.*/\1$‘ /etc/passwd

[[email protected] ~]# grep ‘^\<\(.*\)\>.*\1$‘ /etc/passwd # (这各做法有问题)
[[email protected] ~]# grep ‘^\<\(.*\)\>.*\1$‘ /etc/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:1005:1010::/home/bash:/bin/bash
[[email protected] ~]#

虽然此处结果是没问题的,但是当我们添加一个用户ash后,就有问题了。

练习三:扩展正则表达式

1、显示三个用户root、mage、wang的UID和默认shell

[[email protected] ~]# getent passwd |egrep ‘^root\>|^mage\>|^wang\>‘ |cut -d: -f3,7
或
[[email protected] ~]# grep -e ‘^root\>‘ -e ‘^mage\>‘ -e ‘^wang\>‘ /etc/passwd |cut -d: -f3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

[[email protected] ~]# egrep ‘^[[:alnum:]_]+\(\)‘ /etc/rc.d/init.d/functions
或[[email protected] ~]# egrep ‘^[[:alnum:]]+\(\)|^_*.*+\(\)‘ /etc/rc.d/init.d/functions

扩展:该文件下以_开头且后面有括号的行:

[[email protected] ~]# egrep ‘^_.*+\(\)‘  /etc/rc.d/init.d/functions
__pids_var_run() {
__pids_pidof() {
[[email protected] ~]#

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

[[email protected] ~]# basename /etc/rc.d/init.d/functions # 专门取基名
functions
[[email protected] ~]# echo ‘/etc/rc.d/init.d/functions‘ |egrep -o ‘[^/]+/?$‘
functions
[[email protected] ~]#

4.使用egrep取出/etc/rc.d/init.d/functions或/etc/rc.d/init.d/functions/的目录名


5.统计以root身份登录的每个远程主机IP地址的登录次数

[[email protected] ~]# last |tr -s ‘ ‘ |cut -d‘ ‘ -f1,3 |egrep ‘^root\> ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})‘ |sort -n |uniq -c     
24 root 10.1.250.37
      3 root 192.168.1.101
      1 root 192.168.1.105
[[email protected] ~]#

6.利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

[0-9]、[1-9][0-9]、1[0-9]{2}、2[0-4][0-9]、25[0-5]

7.显示ifconfig命令结果中所有IPv4地址

[[email protected] ~]# ifconfig |egrep -o ‘\<[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\>‘
10.1.253.100
255.255.0.0
10.1.255.255
127.0.0.1
255.0.0.0
192.168.122.1
255.255.255.0
192.168.122.255
[[email protected] ~]#

老王的加餐题:

待续

时间: 2024-10-14 04:49:08

文本处理三剑客之grep的相关文章

Linux文本处理三剑客之grep一族与正则表达式

一,grep一族是什么? Linux上有三种常用的文本处理工具,分别为:grep(egrep.fgrep).sed.awk.这三者被称为Linux文本处理三剑客. grep一族:文本搜索工具 grep:支持使用基本正则表达式: egrep:支持使用扩展正则表达式,相当于grep -E: fgrep:不支持使用正则表达式,相当于grep -F; [PS:fgrep不需要加载正则表达式引擎,因此速度较快,fgrep的搜索效率在当文件达到几亿行时就能体现出来.(大型web网站一天的日志量都是几亿行的,

文本处理三剑客之-grep

文本处理工具: Linux上文本处理三剑客: grep:文本过滤工具(以模式过滤:pattern) sed:stream editor,流编辑器,文本编辑工具 awk:Linux上的实现为gawk,文本报告生成器(格式化文本) 正则表达式:regular expression  REGEXP 由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义, 而是用于表示控制或通配的功能: 分两类: 基本正则表达式:BRE 扩展正则表达式:ERE 元字符:\(hello[[:space:]]\

Linux 文本处理三剑客之grep &nbsp; egrep

Linux 文本处理三剑客之grep   egrep grep: Global search REgular expression andPrint out the line. 作用:文本搜索工具,根据用户指定的"模式(pattern)"逐行去搜索目标文本,打印匹配到的行. 模式:由正则表达式的元字符及文本字符所编写的过元字符,其中正则表达示分基本正则表达式,和扩展正则正则表达式2类 元字符不表示其字面意义,而用于表示通配或控制功能滤条件.元字符有下面一些 字符匹配: .:匹配任意单个

linux文本处理三剑客之grep家族及其相应的正则表达式使用详解

一.Linux文本处理三剑客.grep家族和正则表达式介绍 Linux上文本处理三剑客: grep(egrep, fgrep):文本搜索工具:基于"pattern(过滤条件)"对目标文本进行逐行搜索操作: sed:Stream Editor,流编辑器行编辑工具:文本编辑工具: awk:GNU awk,文本格式化工具:文本报告生成器: grep家族: grep: Global search REgular expression and Print out the line,支持使用基本正

Linux 系统中文本处理“三剑客”之grep

我们写脚本的时候,经常要截取命令输出的某项数据,比如:我要知道主机上有多少块硬盘 这是很方便的.使用grep搜索出我们想要的数据再使用 sed .或 cup 切割就可以取得我们主机的设备名称了,这是我们取数据的一种方法. Egreq 是grep 的升级版,支持扩展表达式.fgrep不支持正则表达式. 使用格式: 1 2 3 4 5 grep [OPTIONS] PATTERN [FILE...]      -o     只打印输出匹配到字符串      -i      做匹配时候忽略大小写   

linux文本处理三剑客之grep命令详解

Linux文本处理三剑客之grep grep:文本过滤(模式:pattern)工具 grep, egrep, fgrep(不支持正则表达式搜索) sed:stream editor,文本编辑工具 awk:Linux上的实现gawk,文本报告生成器 grep grep: Global search REgularexpression and Print out the line 作用:文本搜索工具,根据用户指定的"模式"对目标文本逐行进行匹配检查:打印匹配到的行 模式:由正则表达式字符及

linux文本处理三剑客之grep

  一.linux文本处理三剑客介绍 linux中文本三剑客包括grep(egrep,fgrep),sed,awk,三者基本的功能如下: 工具名称 功能 grep,egrep,fgrep 文本过滤工具(搜索工具) sed stream editor, 流编辑器:文本编辑工具 awk 文本报告生成器 二.grep工具详解 1.grep的介绍: grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行

谢烟客---------Linux之文本处理三剑客之grep

Linux之文本处理三剑客介绍 awk 名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母,它具备了一个完整的语言所应具有的几乎所有精美特性,AWK是一个解释器,三位创建者已将它正式定义为"样式扫描和处理语言".它允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据.对输入执行计算以及生成报表,还有无数其他的功能.Linux使用的是Gnu版本的AWK,gawk grep 全称"Global search REgular express

Linux入门——文本处理三剑客之grep

在Linux的使用过程中,需要处理大量的文本文件,这很符合Linux的哲学思想--一切皆文件.也是因为如此linux内置了文本处理三剑客,他们分别是grep.sed.awk.而三剑客在使用的过程中又有不同的侧重,今天将主要介绍的是文本过滤工具grep. 1.    grep命令的使用 grep 选项 关键字 文本路径 grep root  /etc/passwd grep --color=auto: 对匹配到的文本着色显示 (7里自动显示,6不显示) -i: 忽略字符大小写 -n:显示匹配的行号