第十一课(2018-06-04)

目录

  1. 正则表达式
  2. 扩展正则表达式
  3. grep
  4. sed
  5. awk

1. 正则表达式

Regular Expression, 通过一些特殊字符的排列, 配合上部分工具, 达到"搜索/取代/删除"具有某些特征的字符串的目的.
说白了, RE 就是用于标记字符串的一种表达式

符号 含义 示例
[list] 代表一个字符, 方括号内为该字符的穷举 [0-9] 代表数字; [a-z] 代表全部小写;[akw] 代表 a/k/w 中选一个
[^] 代表一个字符, 表示取反, 即不取方括号内的任何值 [^0-9] 代表非数字;[^a-z] 代表非小写; [akw] 代表不是 a/k/w 中的任何一个
^word 代表行首, 后接特征, 代表以该特征作为行首 ^9 代表以9作为行首
word$ 代表行尾, 前接特征, 代表以该特征作为行尾 9$ 代表以9作为行尾
. 代表有且只有任意一个字符 a.g 代表 a 和 g 之间有且只有任意一个字符 如 abg akg a/g a%g 等
* 代表0~无穷个前面那一个, 前接一个字符 .* 代表任意个任意字符; a* 代表0~无穷个 a; aa* 代表1~无穷个 a
{n,m} 代表某个字符连续重复的次数, 前接字符, 中间为次数范围, 但花括号在 RE 中属于特殊字符, 需要转义 o\{2\} 代表2个 o; o\{2,5\} 代表2至5个连续的 o;

2. 扩展正则表达式

RE Extended 字符 含义 示例
char+ >=1 个char a+ 代表1个或更多的a
char? <=1 个char a? 代表0个或1个的a
PATTERN1|PATTERN2 用或的方式进行匹配 gd | good :代表查找关键字 gd 或 good
( ) 查找字符,常与 | 配合使用 g(la|oo)d 代表查找关键字 glad 或 good
( )+ 同一字符多次重复的查找 (xyz)+ 代表查找关键字 xyz 或 xyzxyz 或 xyzxyzxyz...

3. grep

查找、筛选。根据特征进行文本的查找。以行为单位进行查找。查找完成后打印到屏幕。

3.1 用法

grep -[options] 'pattern' <file_name>

<command> | grep -[option] 'pattern'

3.2 选项

  • -n:line_number,显示行号
  • -v:invert_match,反选
  • -i:ignore,不区分大小写
  • -o:only_matching,精确打印一行中匹配的部分
  • -c:counts,仅显示命中的行数
  • -r:recursive,递归地查找子目录中的文件
  • -e PATTERN:如有多个RE,则每使用一个RE要加一次 -e,但是多个RE以“或”方式进行查找,若需要以“与”的方式进行多RE的查找,只能通过多层管道,一层层进行筛选
  • -A#:after,同时显示命中行的 # 行
  • -B#:before,同时显示命中行的 # 行
  • -C#:before & after,同时显示命中行前&后的 # 行

3.3 选项示例

其实示例中应该包含RE相关的知识,但其实RE仅仅是个通用的表达式,跟工具无关。所以在本示例中不再加入过多关于RE使用技巧的介绍

  • 环境介绍
[root@choco-01 grep]# pwd
/root/grep
[root@choco-01 grep]# ls     
regular_express.txt
[root@choco-01 grep]# nl regular_express.txt 
     1  "Open Source" is a good mechanism to develop programs.
     2  apple is my favorite food.
     3  Football game is not use feet only.
     4  this dress doesn't fit me.
     5  However, this dress is about $ 3183 dollars.
     6  GNU is free air not free beer.
     7  Her hair is very beauty.
     8  I can't finish the test.
     9  Oh! The soup taste good.
    10  motorcycle is cheap than car.
    11  This window is clear.
    12  the symbol '*' is represented as start.
    13  Oh! My god!
    14  The gd software is a library for drafting programs.
    15  You are the best is mean you are the no. 1.
    16  The world <Happy> is the same with "glad".
    17  I like dog.
    18  google is the best tools for search keyword.
    19  goooooogle yes!
    20  go! go! Let's go.
    21  # I am VBird
  • 无选项
[root@choco-01 grep]# grep 'GNU' regular_express.txt 
GNU is free air not free beer.
  • -n:打印行号
[root@choco-01 grep]# grep -n 'GNU' regular_express.txt   
6:GNU is free air not free beer.
  • -v:反选
[root@choco-01 grep]# grep -v 'o' regular_express.txt 
Her hair is very beauty.
I can't finish the test.
\# I am VBird
  • -i:不区分大小写
[root@choco-01 grep]# grep 'happy' regular_express.txt 


[root@choco-01 grep]# grep -i 'happy' regular_express.txt 
The world <Happy> is the same with "glad".
  • -o:精确打印匹配字符
[root@choco-01 grep]# grep 'Happy' regular_express.txt 
The world <Happy> is the same with "glad".


[root@choco-01 grep]# grep -o 'Happy' regular_express.txt 
Happy
  • -c:仅打印匹配的行数
[root@choco-01 grep]# grep 'god' regular_express.txt 
Oh! My god!


[root@choco-01 grep]# grep -c 'god' regular_express.txt 
1
  • -e:多RE查找(或关系)
[root@choco-01 grep]# grep -n 'go' regular_express.txt  
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
13:Oh!  My god!
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.


[root@choco-01 grep]# grep -n -e 'go' -e 'GNU' regular_express.txt  
1:"Open Source" is a good mechanism to develop programs.
6:GNU is free air not free beer.
9:Oh! The soup taste good.
13:Oh!  My god!
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
  • -A#:after,同时打印匹配行的后 # 行
[root@choco-01 grep]# grep -n 'GNU' regular_express.txt 
6:GNU is free air not free beer.


[root@choco-01 grep]# grep -n -A2 'GNU' regular_express.txt 
6:GNU is free air not free beer.
7-Her hair is very beauty.
8-I can't finish the test.
  • -B#:before,同时打印匹配行的前 # 行
[root@choco-01 grep]# grep -n 'GNU' regular_express.txt 
6:GNU is free air not free beer.


[root@choco-01 grep]# grep -n -B2 'GNU' regular_express.txt 
4-this dress doesn't fit me.
5-However, this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
  • -C#:同时打印前&后的 # 行
[root@choco-01 grep]# grep -n 'GNU' regular_express.txt 
6:GNU is free air not free beer.
[root@choco-01 grep]# grep -n -C2 'GNU' regular_express.txt 
4-this dress doesn't fit me.
5-However, this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
7-Her hair is very beauty.
8-I can't finish the test.

4. sed

查找、截取、替换、新增、删除。

4.1 用法

sed [options] line1,line2[action] [file_name]

[command] | sed [options] line1,line2[action]

4.2 Option

  • -n:静默模式,仅打印命中的行

  • -e:edit,直接通过命令行模式进行 sed 动作的编辑

  • -f:file,后接 sed 文件,表示直接以后接 sed 文件中的 sed 语句进行执行

  • -r:RE-Extended,开启扩展RE的支持

  • -i:使 sed 命令直接对文件内容进行更改,而不仅仅是对 stdout

4.3 Action

  • i:向上增行,在命中的行的一行新增,后接字符串

  • a:向下增行,在命中的行的一行新增,后接字符串

  • d:行删除,删除命中行

  • p:行打印,打印命中的数据

  • s:字符替换,#,#s/old_pattern/new_pattern/g

  • c:行替换,替换命中的所有行为指定内容(多个行替换成一条新内容),后接字符串。

  • g:全局替换,默认只替换每行第一个命中的字符,加上g后则能替换整行的命中字符

  • \:配合a、i使用,适用于增加的内容为多行的情况

4.3 示例

  • 环境介绍
[root@choco-01 sed]# nl test.txt 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • p-n:光是用p进行打印,会在打印整个文件的基础上多打印一遍命中行,加上-n后就仅打印命中行
[root@choco-01 sed]# nl test.txt | sed '3,4p'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@choco-01 sed]# nl test.txt | sed -n '3,4p'
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
  • d:删除行
[root@choco-01 sed]# nl test.txt | sed '3,4d'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • a:向下增行
[root@choco-01 sed]# nl test.txt  | sed '2a this is a new line'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
this is a new line
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • i:向上增行
[root@choco-01 sed]# nl test.txt  | sed '2i this is a new line'
     1  root:x:0:0:root:/root:/bin/bash
this is a new line
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • \:增加内容为多行,多行内容以\+[Enter]进行分隔,最后一行的末尾以后半个单引号结束
[root@choco-01 sed]# nl test.txt  | sed '2i 1st added line\
> 2nd added line\
> 3rd added line'
     1  root:x:0:0:root:/root:/bin/bash
1st added line
2nd added line
3rd added line
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • c:替换行。上述的“增加内容为多行”的\在此也适用
[root@choco-01 sed]# nl test.txt | sed '2,3c this line replaces the old 2&3 line'
     1  root:x:0:0:root:/root:/bin/bash
this line replaces the old 2&3 line
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • s:字符替换

sed 's/PATTERN/new/g'

[root@choco-01 sed]# nl test.txt 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@choco-01 sed]# nl test.txt | sed 's/sbin/SBIN/'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/SBIN/nologin
     3  daemon:x:2:2:daemon:/SBIN:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/SBIN/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/SBIN/nologin
  • g:全局替换
[root@choco-01 sed]# nl test.txt | grep 'root' | sed 's/root/ROOT/'
     1  ROOT:x:0:0:root:/root:/bin/bash
[root@choco-01 sed]# nl test.txt | grep 'root' | sed 's/root/ROOT/g'
     1  ROOT:x:0:0:ROOT:/ROOT:/bin/bash
  • i:直接更改文件(默认情况下,sed只是修改文件打印到屏幕的样子,加上i则直接改变文件)
[root@choco-01 sed]# nl test.txt 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@choco-01 sed]# sed -i 's/sbin/SBIN/' test.txt 
[root@choco-01 sed]# nl test.txt 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/SBIN/nologin
     3  daemon:x:2:2:daemon:/SBIN:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/SBIN/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/SBIN/nologin

5. awk

(The End)

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