【linux】正则表达式

grep\sed\awk 都是针对文本行的操作

grep、egrap

grep [-cinvABC] ‘word’ filename
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

下面例子用到的原文档:

cat 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

例子1:

grep -A 2 3 123.txt
hello3 world3
hello world
hello world
--
hello3 world3
hello2 world2

例子2:过滤出带有某个关键词的行并输出行号

grep -n "3" 123.txt

4:hello3 world3
8:hello3 world3

例子3: 过滤不带有某个关键词的行,并输出行号

grep -vn '3' 123.txt

1:hello2 world2
2:hello world
3:hello world
5:hello world
6:hello world
7:hello world
9:hello2 world2

例子4:过滤出所有包含数字的行

grep [0-9] 123.txt

hello2 world2
hello3 world3
hello3 world3
hello2 world2

例子5:过滤出文档中以某个字符开头或者以某个字符结尾的行
"^"表示行的开始

grep "^h" 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

"$"表示行的结束

grep "3$" 123.txt

hello3 world3
hello3 world3

"^$"表示空行(文档中没空行,无输出)

grep "^$" 123.txt
 

打印出不以英文字母开头的行
第一个 "^" 表示开头,第二个 "^" 表示否定。

grep "^[^a-zA-Z]" 123.txt

grep "^[a-zA-Z]" 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

过滤任意一个字符与重复字符
“.”表示任意一个字符
“*”表示零个或多个前面的字符

grep "o*" 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

指定要过滤字符出现的次数

这里用到了{ },其内部为数字,表示前面的字符要重复的次数。{}左右都需要加上脱意字符’\’。另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘\’其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。

grep "l\{2\}" 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2
image.png

上面部分讲的grep,另外笔者常常用到egrep这个工具,简单点讲,后者是前者的扩展版本,我们可以用egrep
完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。

sed 工具的使用

sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。

例子1:打印某行 e sed -n ‘n’p filename 单引号内的n n 是一个数字,表示第几行

sed -n "2"p 123.txt

hello world

例子2:打印多行 打印整个文档用 -n ‘1,$’p

sed -n "2,4"p 123.txt

hello world
hello world
hello3 world3
sed -n "1,$"p 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

例子3:打印包含某个字符串的行

sed -n "/o3/"p 123.txt

hello3 world3
hello3 world3

例子4:上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用。

sed -n "/3$/"p 123.txt

hello3 world3
hello3 world3

例子5: -e 可以实现多个行为

sed -e "/2/"p  -e "/3/"p -n 123.txt

hello2 world2
hello3 world3
hello3 world3
hello2 world2

例子7: 删除某行或者多行(d 就是删除选项)

sed -n "/2/"p 123.txt 

hello2 world2
hello2 world2

sed "/2/"d 123.txt 

hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3

例子8: 替换字符或字符串

’s’就是替换的命令,’g’为本行中全局替换,如果不加’g’,只换该行中出现的第一个。除了可以使用’/’外,还可以使用其他特殊字符例如’#’或者’@’都没有问题。

sed "1,3s/ll/zz/g" 123.txt

hezzo2 world2
hezzo world
hezzo world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

sed "1,3s/z/l/g" 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

例子9:删除文档中的所有数字或者字母

sed "s/[0-9]//g" 123.txt

hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

例子10:调换两个字符串的位置

命令的大概意思是,把原行分成3段,分别赋予新位置。

用’()’把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符’\’,替换时则写成’\1’, ‘\2’, ‘\3’ 的形式。除了调换两个字符串的位置外,笔者还常常用到在某一行前或者后增加指定内容。

sed "s/\(hello\)\(.*\)\(world\)/\3\2\1/" 123.txt

world2 hello2
world hello
world hello
world3 hello3
world hello
world hello
world hello
world3 hello3
world2 hello2

例子11:直接修改文件的内容

sed -i ‘s/:/#/g’ test.txt ,这样就可以直接更改test.txt文件中的内容了。由于这个命令可以直接把文件修
改,所以在修改前最好先复制一下文件以免改错。

cat 123.txt

hello2 world2
hello world
hello world
hello3 world3
hello world
hello world
hello world
hello3 world3
hello2 world2

sed -i "s/\(hello\)\(.*\)\(world\)/\3\2\1/" 123.txt

cat 123.txt

world2 hello2
world hello
world hello
world3 hello3
world hello
world hello
world hello
world3 hello3
world2 hello2

awk 工具的使用

awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。awk工具其实是很复杂的,有专门的书籍来介绍它的应用。

例子1:截取文档中的某个段

cat 123.txt |awk -F'h' '{print $1}'

world2 
world 
world 
world3 
world 
world 
world 
world3 
world2 

cat 123.txt |awk -F'h' '{print $2}'

ello2
ello
ello
ello3
ello
ello
ello
ello3
ello2

例子2:匹配字符或字符串

awk '/hello3/' 123.txt

world3 hello3
world3 hello3
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,226评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,509评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,523评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,181评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,189评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,642评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,993评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,977评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,527评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,547评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,661评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,991评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,422评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,571评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,241评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,737评论 2 366