每次用到正则都要蛋疼一下,索性总结一下在这里。

正则

正则表达式主要分为基础正则和扩展正则。注意,正则和一般命令行输入的命令的通配符不同。正则只使用于支持这种表示法的工具,如:vi,grep,sed、awk。而ls等命令不支持这种表示,只能使用bash自身的通配符。

基础部分:

[abc]匹配括号中的一个

[^abc]匹配非括号中的一个(取反)

^word以word开头

word$以word结尾

[n1-n2] 从n1到n2之间的所有连续字符.

注意:这个连续与否,与ASCII编码有关,

不同的语系编码方式不同:

LANG=C:0 1 2 3 …A B C …a b c

LANG=zh_CN.gb2312: 0 1 2…a A b B ..z Z

上面是编码顺序,正则使用时,需留意语系环境,通常为兼容POSIX,使用“C”语系。"export LANG=C"

特殊符号如: [:alnum:]等,就是为了避免语系问题。其他如下图:


[0-9]或\d表示一个数字

\s一个空格,tab,回车或一个换行符

\w 表示“一个单词字符”,等同于[0-9A-Za-z_]

.小数点,代表一定有一个任意字符.单独使用需要表示小数点时,需转义\.

*重复前一个0到无穷多次

{n,m}连续前面的字符n到m个

ottom:0.714285em; padding-top:0px; padding-bottom:0px; border:0px; line-height:1.428571em; font-family:Helvetica,}同上,n个以上

注意:在shell里{和}需转义\{\}


扩展正则:

+:重复一个或一个以上的前一个RE字符

?: 零个或一个前一个RE字符

|: 或方法

():组方法,通常和上述几个结合使用,如:a(b|c)d表示 abd或acd,a(xyz)+b,可以匹配axyzxyzxyzb

注意:!和<>不是正则的特殊字符



grep 几个常用参数:

-v:把满足条件取反的信息输出

-i:忽略大小写

-n:显示行号

grep通常是以行为单位输出,但可以这样:

-o:仅仅输出符合要求的部分

egrep,grep升级版,支持扩展正则

sed

sed是按一次处理一行的方式进行的。sed把当前正在处理的行保存在一个叫做模式空间(pattern space)的临时缓存里,处理完成后根据是否满足要求打印输出。然后再读入下一行到这个临时缓存里,直到最后一行。因此,sed不会修改或破坏初始文件。

基本用法,详见:sed简明教程

awk

上古时期的神器,用好了依然称手

有些版本差异,但大致相同:旧awk、新awk(nawk)、gnu awk(gawk)、POSIX awk等

awk不把输入数据看成一个无穷无尽的字符串,而是把它看作一种结构。默认情况下,把每行看成一个记录(record),并以换行符终止。

这个记录分隔符保存在内置变量ORS和RS里分别表示,输出和输入的记录分隔符。

而对于每一个记录,以域(field)为单位分隔,默认情况下,域分隔符为空格符,由内置变量FS保存,每个域依次对应变量$1、$2…而$0表示一个整行。

设置FS,即可改变默认分隔符

eg:{FS=“:”}多个的话:{FS="[,\t]”}

PS要使分隔符在第一行生效,需加BEGIN关键字

输出的时候,OFS保存的默认输出域分隔符,默认为空格

eg:{print $1,$2},默认以空格分隔输出。

awk命令由模式(pattern)和操作(action)组成。

awk 'pattern {action}'

模式控制awk对一行输入做什么样的操作,包括一个正则表达式,一个产生正确或者错误条件的表达式,或者他们的组合。当读入一个模式表达式时,有一个隐含的if语句。

操作封装在花括号里。花括号里多个动作以换行符或者分号分隔

匹配操作符,~,用来与一行或一个域里的表达式匹配

eg: awk ‘$1 ~ /xxx/‘ file

反向的话,!~ 即可。

awk脚本

流程控制,变量,操作符等和其他脚本大同小异。注意它特殊的BEGIN和END段。

最近处理一个文本,感觉到awk的高效,如下:

以行为单位过滤出其中的IP地址:

要得到:

awk初体验:

#!/usr/bin/awk -f
BEGIN {
	FS = "[,\t]"
}
{
	for(i = 1; i <= NF; i++) 
	{
		if ($1 == "#")
			continue
		if ($i ~ /((([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))/)
			printf $i"\t"
		if (i == NF) 
			printf "\n"
	}
}


PS:MacOS里有个小坑,开头的路径是/usr/bin/awk,而不是linux下的/bin/awk



参考:
[1]:鸟哥的linux
[2]: awk简明教程

正则、grep、sed、awk的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. UITableViewCellAccessoryCheckmark涵盖iOS 7上的单元格分隔符

    在iOS7上使用此代码会导致分隔符视图被覆盖或缩短:如何修复分隔符视图?

  3. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  4. ios – 页脚视图的颜色总是比UITableView分隔符的颜色更暗

    在我的UITableView中,我设置了这样的分隔符颜色:我像这样设置页脚的颜色:但是,页脚视图的颜色总是比分隔符的颜色更暗,如下所示:如何让它们成为完全相同的颜色?谢谢.解决方法从iOS6.0开始,您可以使用下面提到的UITableView的委托方法来更改页脚视图的背景颜色–

  5. ios – 使用NSLayoutConstraint垂直居中两个视图

    解决方法通过这样做,我能够做到这一点:棘手的部分是恒定值.该值是所有视图高度的一半,包括它们的分隔符.这意味着,如果imageview的高度为360,按钮的高度为70,分隔符为60,则该常量将为/2=245.确实应该有一种更聪明的方式,但是现在我觉得这没关系.

  6. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  7. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  8. ios – 可以增加UITableView分隔线的厚度吗?

    我看到无处不在试图增加这条线的厚度.有没有办法以编程方式做这个?

  9. ios – 来自Swift Xcode 6中的应用程序的iPhone电话

    我检查并尝试过以前的答案,如何直接从应用程序拨打电话,但我不断收到错误.我刚刚在储物柜中制作了一个按钮,并将其连接到视图控制器.它不断给我“错误审查”,“分隔符,但这并不解决任何事情.我需要向AppDelegate或其他任何内容添加代码吗?我真的想知道在斯威夫特这样做的方式.解决方法此代码将帮助您:要么

  10. ios – 在TabBar中的段之间添加分隔符

    我必须在TabBar的部分之间添加分隔符,如下图所示:我试图设置背景iamge为tabbar使用这个图像:但是当我旋转设备时我有问题.我使用的代码:此外,我尝试在图像的右侧添加一个分隔符,我用于abbar项,但没有结果.请问,请帮帮我吗?

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部