文本处理之正则表达式和grep

Linux是基于文件的系统,可以认为Linux的所有命令都是对文件的操作(有些操作的是变量),熟练掌握Linux的文本处理工具是所有学习linux所必需要掌握的,尤其是准备跨入Linux行业的同学更是如此,在工作中我们将会遇到非常多而且内容庞大的文本,批量处理和精确定位将成为工作的日常操作。有时即使我们已经掌握了所有的文本处理工具,面对繁杂的文本也会感到无从着手,这是很正常的,Linux文本处理技巧是需要时间和练习去不断积累的,所以不要感到疲倦,下面来梳理一下日常中常见到的命令吧。

一、Linux的基本文本处理命令:

1、 cat,连接文件并打印到标准输出

cat [OPTION]... [FILE]...

-A 等同于:-vET

-b 非空的行显示行号,被-n覆盖

-e 等同于-vE

-E 在每行加上$

-n 显示行号

-s 压缩连续的空行为一个空行(空行为回车,如果回车前有空格不压缩)

-t 等同于-vT

-T 显示tab为^I

-v 使用^和M-符号,除了LFD和TAB

同cat相似的命令

tac:文本倒行显示

rev:文本的每行倒序显示

查看文本:less和more:less is better then more

head和tail命令:

head:默认显示文本的前十行

-c 只显示前几个字节

-n 显示前几行

tail:显示后十行

-c和-n 选项和head一样

-f :动态监视最后几行

怎样监视/var/log/secure 并且只有发生变化时打印变化?

[[email protected] ~]# tailf -n 0 /var/log/secure &
cut

-d:指定分隔符,默认为tab

-c:按字符数来切割某字段

-f:选取字段

paste:将两个文件同行号合并在一起

-d:指定分隔符,默认为tab

-s:一个文件的所有行显示为一行

wc:统计文件的数据

-l:统计行数

-w:统计单词数

-c:统计字节数

-m:统计字符数

sort:给文件的行排序

-b:忽略行首的空格,将第一个非空字符与其他行比较

-f:将小写字母转为大字字母来比较,即忽略大小写,全部按大写字母比较

-g:按照常规的数字排序,数字数值大的排在后面

-n:按照字符串数值比较,和-g的区别

-r:逆序排列

-u:删除输出中的重复行

-t:指定分隔符

-k:选取比较的字段

uniq:报告或省略重复的行(连续相同才是重复)、

-c:显示重复行的数量

-d:将显示重复的行

-u:显示不重复的行

通常,用sort排序将重复的行放在一起然后用uniq去重统计

diff:一行一行比较文件的内容,vimdiff更直观

-u:以统一的格式输出比较的结果,以便于patch命令去恢复文件

patch:通过diff的差异文件来恢复原始文件,并将生成的文件命名为基础文件名(注意一定要加-b选项)

-b自动备份基础文件为file.orig

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

[[email protected] ~]# ifconfig |grep "netmask"|cut -d ‘n‘ -f2|grep "\b[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}\b" -o
10.1.70.102
127.0.0.1
192.168.122.1

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

[[email protected] ~]# df |tr -s ‘ ‘|cut -d ‘ ‘ -f5|egrep -o "[0-9]{1,2}"|sort -nr|head -1
38

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

[[email protected] ~]# sort -nr -t: -k3 /etc/passwd|head -1|cut -d: -f1,3,7
nfsnobody:65534:/sbin/nologin

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

[[email protected] ~]# stat /tmp/|grep "Access"|head -1|cut -c11-13
777

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

[[email protected] ~]# netstat -nt|tr -s ‘ ‘|cut -d ‘ ‘ -f5|egrep "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" -o|sort|uniq -c
      2 10.1.250.91

二、linux三剑客之grep

grep:(Global search REgularexpression and Print out the line)文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行。

模式:由正则表达式字符及文本字符所编写的过滤条件

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep有诸多选项,详细的选项可以查看

http://www.lampweb.org/linux/3/27.html

下面列出较常用的选项

--color=auto: 对匹配到的文本着色显示

-v: 显示不能够被pattern匹配到的行

-i: 忽略字符大小写

-n:显示匹配的行号

-c: 统计匹配的行数

-o: 仅显示匹配到的字符串

-q: 静默模式,不输出任何信息,常用作脚本判断

-e:实现多个选项间的逻辑or关系

-w:整行匹配整个单词,单词可包括字母、数字和下划线

-A:显示匹配行及其前几行

-B:显示匹配行及其前几行

-C:显示匹配行及其上下几行

-l:打印符合匹配模式的文件名

-H:在显示匹配行前加文件名

三、正则表达式

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

正则表达式常用来匹配文本内容,shell通配符常用来匹配文件路径

可以通过man 7 regex来查看帮助

正则表达式元字符分类:字符匹配、匹配次数、位置锚定、分组

正则表达式可以分为两类:

1、基本正则表达式BRE

字符匹配:

. :匹配任意单个字符

[]:匹配方括号中的任意单个字符

[^]:匹配非方括号中指定的字符

[[:digit:]]匹配单个数字,同[0-9],使用时双方括号

[[:alpha:]]匹配任意单个大小写字母

[[:lower:]]匹配单个小写字母

[[:upper:]]匹配任意单个大写字母

[[:alnum:]]匹配单个大小写或数字

[[:punct:]]匹配任意单个标点符号

[[:space:]]匹配单个空格

匹配次数:

* :匹配前面的字符任意次(贪婪模式,在其后面加问号取消贪婪模式)

.* :任意字符任意长度

\?:匹配前面的字符0次或一次

\+:匹配前面的字符一次或多次

\{m,n\}匹配前面的字符m到n次、

若m为零,则最大匹配n次

若n为零,则最小匹配m次

位置锚定:

^ :匹配以某字符开头

$ :匹配以某字符结尾

^$:匹配没有空格的行,即只有回车行

^[[:space:]]*$:匹配包括空格的行

\<或\b:词首锚定

\>或\b:词尾锚定

分组:

\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...

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

后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)

2、扩展正则表达式ERE

grep -E 或egrep支持正则表达式

次数匹配:

*:匹配前面字符任意次

?:0次或1次

+:1次或多次

{m}:匹配m次

{m,n}:至少m,至多n次

位置锚定:

^ :行首

$ :行尾

\<, \b :词首

\>, \b :词尾

分组:

()或\(\)都支持

“or”匹配:

a|b :匹配a或者b

C|cat: C或cat

(C|c)at:Cat或cat

具体使用细节请看下篇博客:

时间: 2024-10-24 01:24:39

文本处理之正则表达式和grep的相关文章

文本处理工具与正则表达式、grep

一.文本处理工具 1.文本查看命令 cat [OPTION]- [FILE]- -n 显示行号 -b 空格行不加行号,有字符的行才加 -s  相邻的空行压缩为一行,长和-n联用 -v 处理windows中的^M -T 可以看到tab\space -A  显示所有控制符(包括windows文本中的^M,^T) -E  显示行结束符$ (回车) tac [OPTION]- [FILE]-  将每个指定文件按行倒置并写到标准输出. 效果与cat 相反 rev  将指定文件从最后一个字符开始显示到第一个

关于 文本处理工具、正则表达式、grep 的简单举例

文本处理工具 抽取文本的工具 文件内容:less和cat 文件截取:head和tail 按列抽取:cut 按关键字抽取:grep 文件查看命令:cat,tac,rev cat [选项] [file] cat -n     对显示出的每一行进行编号 cat -b     非空行编号 cat -ns    连续压缩空行成一行 cat -v     显示回车符 cat -E     显示行结束符$ cat -A     显示所有控制符 tac file   反向显示内容 rev file   反向显示

正则表达式和grep文本搜索工具

正则表达式和文本搜索工具介绍 正则表达式:如果想搜索/etc/passwd文件中以root开头的行,对与人来说很容易理解,但是对与计算机来说就无法理解,这个时候就需要使用正则表达式来表达过滤条件了,让用户实现对文本的智能搜索.正则表达式就是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能. 正则表达式的特点是: 1. 灵活性.逻辑性和功能性非常的强: 2. 可以迅速地用极简单的方式达到字符串的复杂控制. grep:支持正则表达式,是一个文本搜索工具,

正则表达式与文本处理三剑客之一:grep和egrep

对于刚接触的人而言,正则表达式的学习与使用一个痛苦而迷茫的东东,但是只要有热心,也会发现很有趣的.那么请让我们打起精神,拿出自己的兴趣与激情一起走进Linux的奇妙世界吧. 什么是正则表达式? 正则表达式是你定义的,Linux工具用来过滤文本的模式模板,换句话说就是使用一定的工具(比如今天要写的grep和egrep)用来文本匹配和过滤的一个手段,是通过正则表达式引擎来实现的,而正则表达式引擎是解释正则表达式模式并使用这些模式进行文本匹配的底层软件,在Linux中有两种流行的正则表达式引擎(也就有

正则表达式与grep、sed工具使用简介

正则表达式与grep.sed工具使用简介 一.正则表达式     正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 其介绍如下:      \ 将下一个字符标记符.或一个向后引用.或一个八进制转义符 ^ 匹配输入字符串的开始位置 $ 匹配输入字符串的结束位置 * 匹配前面的子表达式任意次 + 匹配前面的子表达式一次或多次(大于等于1次) ? 匹配前

Linux文本处理工具三剑客之grep

Linux家族关于文本处理的工具有三个,他们分别为grep.awk和sed,今天我就介绍一下grep文本处理工具. 首先,什么是grep呢? grep是一种文本搜索工具,基于"pattern"对给定文本进行搜索过滤,并对目标文本进行检查,并打印出符合条件的文本的一款文本处理工具.说到pattern,那么pattern又是什么呢?那就是大家所熟知的"正则表达式". grep家族又有三个成员:grep,egrep和fgrep. grep: 支持正则表达式. egrep:

linux下的文本处理命令sed&amp;awk&amp;grep

Sedsed 是个精简的.非交互式的编辑器.他能执行和编辑vi和emacs相同的编辑任务.sed编辑器不提供交互使用方式:只能在命令行输入编辑命令.指定文件名,然后在屏幕上察看输出.sed编辑器没有破坏性.他不会修改文件,除非用shell重定向来保存输出结果.缺省情况下,所以的输出都被打印到屏幕上.sed 编辑器在shell脚本中非常有用,因为在shell脚本中使用像vi或emacs这类交互式编辑器,需求脚本用户精通该编辑器,而且还会导致用户对打开 的 文件做出不必的修改.如果需要执行多项编辑任

文本处理工具--正则表达式

在学习linux中文本搜索是很重要的 对于初学者来说如何快速学会运用正则表达式相当重要的. 文本搜索工具,根据用户指定的文本搜索模式(搜索条件)对目标进行逐行搜索,显示能匹配的行. 文本搜索: grep :基本正则表达式 egrep:扩展正则表达式 fgrep:fast,不支持使用正则表达式 其语法格式: grep [option]...'PATTERN' FILE... 正则表达式:是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等能: 元字符:不表示其字面意义,而用于

正则表达式及grep

正则表达式及grep #以下所有的举例是用正则表达式的方式 #正则表达式 #由一类特殊字符及文本所编写的模式 #分两类: 基本正则表达式:BRE 扩展正则表达式:ERE 字符匹配选项 .              匹配任意单个字符 []               匹配指定范围内的任意单个字符 示例:cat /etc/passwd | grep "roo."         查看/etc/passwd目录下 显示包含roo后面加任意单个字符的行 示例:cat /etc/passwd |