正则、grep、sed、awk

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

正则

正则表达式主要分为基础正则和扩展正则。注意,正则和一般命令行输入的命令的通配符不同。正则只使用于支持这种表示法的工具,如: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要使分隔符在第一行生效,需加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})|(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

[2]:awk简明教程

时间: 2024-12-23 15:11:51

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

Linux三剑客grep/sed/awk

grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color=auto 或者 --color:表示对匹配到的文本着色显示 -i:在搜索的时候忽略大小写 -n:显示结果所在行号 -c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数 -o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行 -v:输出不带关键字的行(反向查询,反

LINUX 下 find grep sed awk 的常见基本用法特点

LINUX 下 find grep sed awk 的常见基本用法特点 只为让自己具有更高的水准,这就开始了长达6个月的小白进阶路! 这几天学习linux基础命令有点犯蒙,尤其是对文件查找这块.所有我想把一些我觉得常用的实用的参数项总结下来,大神勿喷哈... 不到之处请大家指教,小女子在此谢过了. 一.find:命令用于查找文件系统中指定的文件,其命令格式为: 1.find pathname -options [ -print  -exec  -ok ... ] (1)find 命令的参数: p

[CentOS 7系列]grep/sed/awk实战

最近准备和CoreSite - Any2 California接入商建立网络BGP邻居关系.从peeringdb (https://www.peeringdb.com/ix/142)上找到了所有接入商的信息,但是转移信息到本地不是很方便,需要进行多次文本调整,耗时较长.作为萌新,立马就想到近期学习的grep/sed/awk工具.于是就尝试处理数据. 1.下载页面内容 curl https://www.peeringdb.com/ix/142 > peering 将页面内容存入peering文件

grep,sed,awk与简单正则表达式应用

grep,sed,awk与简单正则表达式应用 这里使用的测试文件是linux /etc/passwd文件,最好是复制一份进行练习,方式对文件内容造成损坏.感觉还是要多练习才能很好的使用,习题这里就不贴了,网上一找一大把. grep:   -o 用作计算出现多少次字段  -c 打印符合要求的行数  -n 在输出符合要求的行的同时也打印行号  -v 打印不符合要求的行  -A 后跟一个数字 ps -A2表示打印符合要求的行及下面两行  -B 后跟一个数字 ps -B2表示打印符合要求的行及上面两行 

十七. 正则以及grep ,sed,awk的简单应用

一.正则表达式:/ / grep,sed,awk 都能解释正则表达式 正则表达式:把一些特殊符号组合到一起描述字符和字符串的方法.^ 以什么开头 grep '^root' /etc/passwd$ 以什么结尾 如能登入系统的所有用 grep 'bash$'/etc/passwd. 任意一个字符 grep '^b.n' /etc/passwd 过滤取到bin的.* 所有字符* 代表前面的字符有0个或者无穷个 grep 'b*' /+ 必须用egrep 或 egrep -E 'ab+'表示前面的字符

grep,sed,awk 个人总结

正则表达式 ifconfig |sed -n '2p' |sed 's.*inet//g' |sed 's#netmask.*$##g' #用/ # 均可 理论可用任何特殊字符替代 #sed -r 后面可跟扩展正则 扩展正则 + (.*) ifconfig |sed -n 2p |sed -r 's#^.*inet (.*) Broast.*$#\1#g' # \1 代表正则中的第一个GROUP 即(.*)里的内容 ifconfig |sed -nr '2s#^.*inet (.*)net.*$

shell脚本(正则表达+sed+awk)

一. 正则表达式:   正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式. 该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为, 正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.grep.find.awk

linux初学之grep &nbsp; sed &nbsp; awk 正则表达基本例子

. 表示任意一个 (数字,#,空格,特殊符号,字母) *表示0个或多个*号前面的字符 +表示一个或多个+前面的字符 ?表示一个或零个前面的字符 .*表示任意一个任意字符(贪婪的匹配方法) ?,+,(),|,{},[]需要脱意 参数: -c  一用有多少行 -An n为数字,这一行以及下面(After)n行打印出来 -Bn n为数字,这一行以及上面n(Bfore)行打印出来 -Cn n为数字,上下n行打印出来 [[email protected] ~]#grep -n 'root' 1.txt 打

find/pg/grep/sed/awk命令

find pathname -options [-print -exec -ok ...] -print: find命令将匹配的文件输出到标准输出. 当前目录下查找文件权限位为 7 5 5的文件 $ find . -perm 755 -print 当前目录及子目录中查找文件名以一个大写字母开头的文件 $ find . -name "[A-Z]*" 希望在系统根目录下查找更改时间在 5日以内的文件 $ find / -mtime -5 -print 为了在/var/adm目录下查找更改时

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

grep: 全称Global Regular Expression Print, 是干什么的,不多说了: 用法:grep [-options] [pattern] [filename] 选项: -c: 只输出匹配行的数目 -i: 不区分大小写 -n:显示匹配航以及行号 -l:查询多文件的时候只输出包含匹配字符的文件名 -L: 列出不匹配的文件名: -v:反向匹配,即显示不匹配的行 -h: 查询的时候不适用文件名 -s:不显示错误信息 -E 使用扩展正则表达式 //很有用啊, -A :后跟一个数字