05. Shell正则表达式

  • 正则表达式

    1. 正则表达式是一个字符串,用来表示一个规则,用来描述或匹配符合此规则的结果;
    2. 在文本编辑中,正则表达式通常用来检索/替换符合某个模式的文本内容;
    3. 常用的正则表达式工具grep,sed,awk

  • grep检索

    grep [-option] 文件名
      -c:打印符合要求的行数
      -i:忽略大小写
      -n:带行号输出
      -v:打印不符合要求的行
      -A:例如-A2或-A 2,表示打印符合要求的行以及下面两行
      -B:打印符合要求的行以及上面n行
      -C:打印符合要求的行以及上面和下面的n行
      -l:列出包含某些字符的文件名
    

    参数ABC

    image.png

    输出行号

    image.png

    正则式

    1. [0-9] 即包含0到9数字
    2. [0-9a-zA-Z] 包含数字0到9,字母a到z和A到Z
    3. [^A-Z] 不包含字母A到Z
    4. [678] 包含6或7或8的,而非678
    image.png

    正则式+字符串

    image.png

    开头&结尾

    1. 在字符串中,^表示行的开始;
    2. 在字符串中,$表示行的结尾;
    3. 在字符串中,^$表示空行;
    image.png

    通配符

    1. 符号.代表任意一个字符;
    2. 符号*代表了0或多个*之前的字符;
    3. 符号.*表示任意字符,包括空行;
    image.png

    出现次数

    1. \为转义字符;
    2. '\{n1,n2\}'其中n1<n2,出现次数[n1,n2],若省略n2,则表示>=n1
    image.png

  • sed

    1. grep只能实现查找,无法实现编辑;
    2. vim可实现查找替换,但无法输出到屏幕上;
    3. sed和awk可实现将替换文本输出到屏幕上;
    4. sed和awk都是流式编辑器,是对文档的行来操作的

    打印行

    1. p字符实打印输出
    2. -n实现打印某行
    sed -n 'x'p filename  打印第x行,x为任意数字,''可省略
    sed -n '1,$'p filename 打印多行,'1,x'即第1到第x行,'1,$'表示整个文档
    sed -n '/xxx/'p filename 打印包含xxx内容的行
    
    image.png

    特殊字符

    1. 在字符串中,^表示行的开始;
    2. 在字符串中,$表示行的结尾;
    3. 在字符串中,^$表示空行;
    4. 符号.代表任意一个字符;
    5. 符号*代表了0或多个*之前的字符;
    6. 符号.*表示任意字符,包括空行;
    image.png

    多个行为

    1. -e实现多个行为
    sed -e '/xxx/'p -e '/xxx/'p ... -n filename
    
    image.png

    删除行

    1. d符号实现删除打印;
    2. 此结果只影响打印结果,不影响文件实际内容
    sed 'x'd filename  删除第x行,然后输出结果
    sed 'x,y'd filename 删除从第x行到第y行,然后输出结果
    sed '/xxx/'d filename 删除能匹配到xxx内容的行,然后输出结果
    
    image.png

    替换

    1. s符号实现替换打印;
    2. g符号实现全局替换,否则,只替换匹配到的第一个;
    3. 此结果只影响输出结果,不影响文件实际内容
    sed 'x,ys/xxx/yyy/g' filename  将第x到y行的字符xxx均替换为yyy并输出到屏幕
    sed 's/xxx/yyy/g' filename 将整个文件的字符xxx均替换为yyy并输出到屏幕
    sed 's@xxx@yyy@g' filename 符号/可使用@,#等符号代替,作用一样
    sed 's/[0-9]//g' filename 将所有的数字删除(替换为空)并输出到屏幕
    sed 's[0-9A-Za-z]//g' filename 将所有的数字和字母删除并输出到屏幕
    
    image.png

    位置互换

    1. 通过s符号实现位置互换;
    2. 通过s符号和&符号实现插入操作;
    3. 符号.*$与符号.*均代表整个文档,符号$代表空行;
    4. 此操作只改变输出结果,不改变文本源内容
    sed 's/\(xxx\)\(.*\)\(yyy\)/\3\2\1/' filename 将字符xxx与yyy互换位置,其他保持不变;
        其中\(\)为转义的小括号即(),符号.*表示任意多的任意字符,\3\2\1对应括号表示其位置;
        基础语法:sed 's/互换的内容/位置顺序/' 文件名
    sed 's/^.*$/xxx&/' filename  在文档每行的行首插入字符xxx;
        等同:sed 's/.*/xxx&/' filename
    sed 's/^$/xxx&/' filename 相当于在空行行首插入字符xxx
        等同:sed 's/^$/xxx/' filename 即将空行替换为字符xxx
    sed 's/^.*$/&xxx/' filename 在文档每行的行末插入字符xxx;
    sed 's/^.*$/xxx/' filename 即将文档所有行的内容均替换为xxx;
    sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/' filename 即将文档每行的首字符与尾字符互换位置
    sed 's/^\(.*\):\(.*\):\(.*\)$/\3:\2:\1/' filename 即以:为分割符,将首块和尾块互换位置
    
    image.png
    image.png

    修改源文件

    1. 参数 -i 实现直接修改文件内容;
    2. 修改时不在屏幕打印修改结果;
    3. 因可直接修改文件,故一般在修改前先备份文件;
    sed -i 's/:/,/g' filename  例:此语句可将文件实际内容修改,替换:为,写入
    
    image.png

  • awk

    1. awk与sed一样为流式编辑器,即针对行进行操作,一行一行执行;
    2. awk比sed更强大,可实现sed的功能,也能做到sed无法做到的

    打印

    1. -F 参数后面跟分割符,以''包括,缺省为tab;
    2. '{print $x,$y...}' 为输出方法,$x为分割出的第x块;
    3. 符号$0代表整行;
    4. 在print方法中,可加入想输出的字符,但需要使用"xxx"将其包括;
    5. 此操作不改变文件源内容
    head -n2 filename | awk -F':' '{print $x}'  命令head截取文件前2行,在此两行中操作:
        以:为分割符,打印被分割出的第x区域的内容,其中:根据实际需要选取分割符
    awk -F':' '{print $x,$y,...}' 打印多个分区
    awk -F':' '{print $0}' 打印整行,等同 awk '{print $0}'
    awk -F':' '{print $x"#"$y"aaa"$...}'  在各分区中插入向输入的字符,且必须使用"xxx"包括 
    
    image.png

    匹配

    1. 符号~表示匹配的意思;
    awk -F':' '$n~/xxx/' filename  通过:分割,第n区中匹配字符xxx,输出全行;
    awk -F':' '$n~/xxx/ {print $m}' filename  通过:分割,第n区中匹配字符xxx,输出m区;
    awk -F':' '/xxx/ {print $m} /yyy/ {print $n}' filename  通过:分割;
        匹配到xxx的结果,打印其第m区,匹配到yyy的结果,打印其第n区,并顺序输出.
    
    image.png

    条件操作

    1. 逻辑比较符号 ==,!=,>,>=,<,<=
    2. 匹配结果均为字符或字符串,无数字,故为ascii码的比较
    3. 逻辑运算符号 &&,||
    image.png
    image.png

    内置变量

    1. NF:用分割符分割后的段数;
    2. NR:行数
    awk '{print NR}' filename  打印文件行数
    awk -F':' '{print NF}' filename  打印分割段数
    
    image.png

    数学运算

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

推荐阅读更多精彩内容