2.1 Awk, by Sed and Grep, out of Ed

awk身上可以看到sedgrep的血统,而sedgrep又起源于ed.

what is ed

ed 是unix最初的行编辑器

下面来说一下ed的一些命令,谈ed是为了引出后面的awksedgrep

首先创建一个测试文件test,内容如下

1abcd
2efgh bbb
3kgh aaa
4end

接下来ed test, 它会显示出test文件有多少个字符,同时指向最后一行。

[root@master ~]# ed test
31

ed命令已交互的形式等待用户的输入,如果用户输入的指令ed不理解,它会打印出表示错误输入。

打印

p代表打印当前行

p
4:end

定位到指定行

可以看到ed打开文件时指向了最后一行。
默认情况下命令只会影响到当前行,想要编辑文件首先需要定位到需要编辑的行,然后再使用编辑命令修改。可以通过行号或正则表达式定位到指定的行。

比如输入1定位到第一行

1
1abcd

删除

d代表删除当前行

d
p
2efgh bbb

想要删除某行不需要先定位到这一行然后删除,1d 一起使用就是删除第一行,nd就是删除第n行。

也可以通过正则表达式定位到指定的行。

/regular/d

正则表达式的内容使用斜线包围,这个命令指的是删除第一个包含regular的行,并且定位到这个被删除行的下一行。
注意:这个命令是删除含有regular的一整行而不仅仅是删除这个regular
如果想要删除所有包含regular的行可以使用如下指令

g/regular/d

g代表全局的匹配删除

替换

替换语法如下

[address]s/pattern/replacement/flag
s/regular/complex/

这个 命令会将当前行中的第一个regular替换为complex
由于没有指定行(address),这个命令只会应用到当前行的第一个regular,如果这一行没有regular会打印出一个?
如果想要当前行中所有出现的regular都能够被替换为complex,可以加上g标识

s/regular/complex/g

替换可以先定位到指定行,然后进行替换

/regular/s/regular/complex/g

表示定位到第一个出现regular的行,然后将这一行所有的regular替换为complex。

如果想要将所有包含regular行里面的所有regular都替换为complex,可以执行如下命令

g/regular/s/regular/complex/g

如果定位查找字符串和替换字符串一样,那么可以省略替换字符串。例如

g/regular/s//complex/g
等价于
g/regular/s/regular/complex/g

grep的由来

我们熟知的grep其实是来至于ed的全局指令
g/re/p
它会打印出所有匹配正则表达式的行。原来grep是这么来的,有点意思

使用脚本

ed可以把操作放在脚本里面,然后使用输入重定向来执行脚本

ed test < ed-script

sed

ed是面向行的编辑器,而sed是面向流的编辑工具。ed可以使用交互模式和脚本模式(非交互模式)而sed只有脚本模式。
默认情况下所有到·sed·的输入经过处理后都会输出到标准输出,输入文件本身不会被改变。如果想要改变文件本身需要在修改完成之后重定向到文件以达到替换的目的。

ed不是面向流的,ed在结束时必须使用保存退出命令来保存相关的修改,ed在执行命令是不会输出到标准输出上面,除非这个命令本身会有输出。

ed中默认情况下命令会影响当前行,但是由于sed是面向流的,它会影响到每一行。可以说sed默认是全局的。

语法

command [options] script filename

其中script指定了需要执行的脚本

sed -f scriptfile inputfile

如果指令比较短可以直接在命令行里面声明,在sed和awk中每个指令由两部分构成:patternprocedure pattern是正则表达式,procedure是要执行的动作。

sed默认会将处理完成的行输出到标准输出,awk默认不会输出内容,需要我们通过脚本控制输出。

处理案例

创建list测试文件,该文件每一行的含义为:人名,街道名,城市名 州名缩写

$ cat list
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

使用sed命令

sed [-e] 'instruction' file

-e是可选的参数,当有多个指令时需要加上-e参数。-e后面接上具体的指令

#将州的缩写替换为全称
$ sed 's/MA/Massachusetts/' list
John Daggett, 341 King Road, Plymouth Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston Massachusetts

如果命令里面有空格或者shell特殊字符,指定使用'引起来不是必须的,但是使用'是个好习惯。
如果说上面的指令可以不加单引号,下面这个指令必须加单引号,因为中间有一个空格

#将州的缩写替换为全称,同时在州和城市之间加一个逗号空格
$ sed 's/ MA/, Massachusetts/' list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston, Massachusetts

命令行中处理多指令的三种方式

  1. 每个指令使用逗号分隔
sed 's/ MA/, Massachusetts/; s/ PA/, Pennsylvania/' list
  1. 每个指令前面加-e
sed -e 's/ MA/, Massachusetts/' -e 's/ PA/,
Pennsylvania/' list
  1. 使用>
$ sed '
> s/ MA/, Massachusetts/
> s/ PA/, Pennsylvania/
> s/ CA/, California/' list

使用脚本文件

当命令比较多的时候使用脚本文件更加的方便

sed -f scriptfile file

编写脚本文件

$ cat sedscr
s/ MA/, Massachusetts/
s/ PA/, Pennsylvania/
s/ CA/, California/
s/ VA/, Virginia/
s/ OK/, Oklahoma/

使用脚本文件

$ sed -f sedscr list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond, Virginia
Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke, Virginia
Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Sal Carpenter, 73 6th Street, Boston, Massachusetts

抑制输出

使用-n选项抑制输出

只打印受影响的行
$ sed -n -e 's/MA/Massachusetts/p' list
John Daggett, 341 King Road, Plymouth Massachusetts
Eric Adams, 20 Post Road, Sudbury Massachusetts
Sal Carpenter, 73 6th Street, Boston Massachusetts

awk的使用

awk的使用模式和sed比较相似,但是支持可编程的操作。比如c语言的print 函数。
awk默认使用空白符(space ,tab ...)将一行分为多个单词。
$0代表一整行,$1代表第一个单词,$2代表第二个单词,$n代表第n个单词

打印所有包含MA字符串的第一个单词

$ awk '/MA/ { print $1 }' list
John
Eric
Sal

这里pattern/MA/procedure{ print $1 }。如果只有pattern没有procedure默认打印含有pattern这一整行的内容。反之如果只有procedure没有pattern 会对所有行应用procedure

$ awk '/MA/' list
John Daggett, 341 King Road, Plymouth MA
Eric Adams, 20 Post Road, Sudbury MA
Sal Carpenter, 73 6th Street, Boston MA

自定义分隔符

-F选项自定义分隔符,比如以,作为分隔符

$ awk -F, '/MA/ { print $1 }' list
John Daggett
Eric Adams
Sal Carpenter

多个指令使用;分割

$ awk -F, '{ print $1; print $2; print $3 }' list
John Daggett
341 King Road
Plymouth MA
Alice Ford
22 East Broadway
Richmond VA
Orville Thomas
11345 Oak Bridge Road
Tulsa OK
Terry Kalkas
402 Lans Road
Beaver Falls PA
Eric Adams
20 Post Road
Sudbury MA
Hubert Sims
328A Brook Road
Roanoke VA
Amy Wilde
334 Bayshore Pkwy
Mountain View CA
Sal Carpenter
73 6th Street
Boston MA

sek配合awk一起使用

先使用sed完成州缩写到全称的替换,然后使用awk提取第四个单词,也就是州的全程

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