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

正则

正則表達式主要分为基础正则和扩展正则。注意,正则和一般命令行输入的命令的通配符不同。正则仅仅使用于支持这样的表示法的工具,如: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个

{n,} 同上,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要使分隔符在第一行生效,需加BEGINkeyword

输出的时候,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})|(1[0-9]{2,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

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

  1. Linux三剑客grep/sed/awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

  2. linux三剑客grep|sed|awk实践

    最好先学习正则表达式的基本用法,以及正则表达式BREs,EREs,PREs的区别 此坑待填 grep sed awk

  3. [svc]linux正则实战(grep/sed/awk)

    企业实战: 过滤ip 过滤出第二行的 192.168.2.11. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ine ...

  4. 【Linux】 字符串和文本处理工具 grep & sed & awk

    Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...

  5. linux 三大利器 grep sed awk sed

    sed主要内容和原理介绍 sed 流处理编辑器 sed一次处理一行内容,读入一行处理一行 sed不改变文件内容(除非重定向) sed 命令行格式 $ sed [options] 'command' f ...

  6. grep sed awk 3个Linux中对文件内容操作的命令

    在学习Linux命令中,发现3个有关于文件内容操作的命令grep,sed和awk,在这里简单汇总这3个命令主要作用,在实际中找到最合适的情景应用,详细用法可以参考其他文章. 1.grep命令 主要作用 ...

  7. Linux基础命令-Nginx-正则表达式( grep sed awk )-Shell Script--etc

    Linux基础使用 学习内容博客 内存 查看swap分区信息 > swapon -s 添加swap分区 > mkswap /dev/sdb2 > 激活 swapon -a /dev/ ...

  8. 三个支持正则表达式的行处理的工具: grep/sed/awk

    grep: 全称Global Regular Expression Print, 是干什么的,不多说了: 用法:grep [-options] [pattern] [filename] 选项: -c: ...

  9. linux grep,sed,awk和diff的使用

    1:grep//显示行 # grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来 # grep -v 'main' /home/myhome/a.c //显示除 ...

  10. Using of grep sed awk on Linux

    #This script is to parse data file: fun0() { ## [INFO1]a=1   b=2 c=3 [INFO2]a=7 b=8 c=9 [INFO3] a=x ...

随机推荐

  1. http协议之cookie标准RFC6265介绍

      [Docs] [txt|pdf] [draft-ietf-httpst...] [Diff1] [Diff2] [Errata] PROPOSED STANDARD Errata Exist In ...

  2. 一个非常优秀的前端框架--BootStrap

    在接触BootStrap之前,也许我们已经度过了很多关于前端开发的框架及

  3. HDU 1171 Big Event in HDU (多重背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. IOS开发-通知与消息机制

    在多数移动应用中不论什么时候都仅仅能有一个应用程序处于活跃状态.假设其它应用此刻发生了一些用户感兴趣的那么通过通知机制就能够告诉用户此时发生的事情. iOS中通知机制又叫消息机制,其包含两类:一类是本 ...

  5. IOS设计模式学习(20)命令

    1 前言 在面向对象中,把指令封装在各种命令对象中.命令对象可以被传递而且在指定时刻被不同的客户端复用.这一概念精心设计而来的设计模式叫做命令(Command)模式. 2 详述 2.1 简述 命令对象 ...

  6. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  7. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  8. SQLServer2014新功能

    随机存取存储器 OLTP:提供了内置在芯 SQL Server 数据库内存 OLTP 特征,为了显著提高事务数据库应用程序的速度和吞吐量.随机存取存储器 OLTP 它是包含在 SQL Server 2 ...

  9. [笔记] C# Windows Phone 8 WP8 开发,判断目前网路是否可用。

    原文:[笔记] C# Windows Phone 8 WP8 开发,判断目前网路是否可用. 常常我们在开发Windows Phone 8 App时会使用网路来读取网页的资料或其他开放平台的Json.X ...

  10. 十步完全理解SQL(转)

    本文由 伯乐在线 - 水果泡腾片 翻译.未经许可,禁止转载!英文出处:Lukas Eder.欢迎加入翻译组. 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同 ...