GREP文本处理工具及正则表达式

Linux文件处理三剑客

  • grep : 文本过滤工具

    • 支持基础正则表达式
    • -E 支持扩展正则表达式
    • -F 支持快递过滤(在不匹配正则表达式的情况下)
    • 其中有egrep,其不用-E参数,直接支持扩展正则表达式
    • 其中有fgrep,其不用-F参数,直接支持快速搜索
  • sed : stream editor,流编辑器,使用-r参数,支持正则表达式

  • awk : linux上的实现为gawk,格式化输出文本,一般情况用于生成报告,且支持正则表达式

基本正则表达式(Basic regual expression,regexp)

基本正则表达式元字符

  1. 字符匹配

    • . : 匹配任意单个字符
    • [] : 匹配指定范围的任意字符
    • [^] : 匹配指定范围外的任意字符
      • [:upper:] [:lower:] [:alpha:] [:alnum:] [:digit:][:punct:] [:space:]
  2. 匹配次数

    • * : 匹配其前面的字符任意次,0次、1次或者多次;
      * 例如:grep “xy”
      abxy
      aby
      xxxxxy
      yab
      注意:匹配任意长度的任意字符,同glob里的

    • ? : 匹配其前面的字符0次或1次,即前面的字符,可有可无;
      * 例如:grep “x?y”
      abxy
      aby
      xxxxxy
      yab

    • \+ : 匹配其前面的字符至少1次或多次,即前面的字符至少需要出现一次
      * 例如:grep “x+y”
      abxy
      xxxxxy

    • {m} : 匹配其前面的字符M次

    • {m,n} : 匹配其前面的字符至少M次,最多N次

    • {0,n} : 匹配其前面的字符最多N次

    • {m,} : 匹配其前面的字符至少M次

  3. 位置锚定

    • ^ :锚定行首,用于模式的最左侧
    • $ :锚定行尾,用于模式的最右侧
    • \< 或者\b :锚定词首,用于单词的最左侧
    • \> 或者\b :锚定词尾,用于单词的最右侧
  4. 分组及引用

    • \( \) : 将一个或者多个字符捆绑在一起,当作一个整体
    • \1,\2,\3... : 向后引用前面被匹配到的第一个、第二个、第三个...
      • 注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,变量为\1,\2,\3....

扩展正则表达式元字符

  1. 字符匹配

    • . : 任意单个字符
    • [] : 指定范围内的任意字符
    • [^] : 指定范围外的任意字符
  2. 次数匹配

    • . : 任意次,匹配0次,1次或多次
    • ? : 0次或者1次,表示前面的字符可有可元
    • + : 其前面的字符最少一次,1次或者多次
    • {m} : 匹配其前面的m次
    • {m,n} : 匹配其前面的至少M次,至多N次
    • {0,n} : 匹配其前面的最多N次
    • {m,} : 匹配其前面的最少M次
  3. 位置锚定

    • ^ :锚定行首,用于模式的最左侧
    • $ :锚定行尾,用于模式的最右侧
    • \< 或者\b :锚定词首,用于单词的最左侧
    • \> 或者\b :锚定词尾,用于单词的最右侧
  4. 分组及引用

    • \( \) : 将一个或者多个字符捆绑在一起,当作一个整体
    • \1,\2,\3... : 向后引用前面被匹配到的第一个、第二个、第三个...
      • 注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,变量为\1,\2,\3....
    • | : 或者,或者整个左边和整个右边
      • 例:
        • a|b: a或者b
        • C|cat :C或cat
        • (C|c)at: 表示cat和Cat

练习:

  1. 找出/proc/meminfo文件中,所有以大写或小写s开头的行,至少三种实现方式
    * cat /proc/meminfo | grep -E ‘^(s|S)’
    * cat /proc/meminfo | grep ‘^[sS]’
    * cat /proc/meminfo | grep -i ‘^s'

  2. 显示当前系统上root、centos、或者user1用户的相关信息
    * cat /etc/passwd | grep -E “^(root|centos|user1)\>"

  3. 找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
    * cat /etc/rc.d/init.d/functions | grep -Eo “[_[:alnum:]]+\(\)"

  4. 使用echo命令输出一绝对路径,使用grep取出其基名
    * ehco /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -Eo "\<[^/]+/?$”
    进一步:取出其路径名,类似于对其执行dirname命令的结果
    * `echo /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -o "^/.*/"

  5. 找出ifconfig命令结果中的1-255之间的数值
    * ifconfig | grep -E "[1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-5][0-5]"

  6. 课外作业:找出ifconfig命令结果中的IP地址

  7. 添加用户bash,testbash,basher以及nologin(其shell为/sbin/nolgin);而后找出/etc/passwd文件用户名同shell名的行
    * cat /etc/passwd | grep -E "^(\<.*\>):.*\1$”
    * grep -E “^[^:]+\>” /etc/passwd
    * grep -E “^([^:]+\>).*\1$” /etc/passwd

grep命令

  • grep - grep, egrep, fgrep - print lines matching a pattern

      synopsis: grep [OPTIONS] PATTERN [FILE...]
                grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
      options:
          -e : 指定多个pattern
          -f : 把pattern放到文件里,从文件里读取
          --color=auto : 对匹配到的文本高亮显示
          -i : ignorecase,不区分大小写
          -o : 只显示匹配到的本身
          -v : --invert-match,反向显示,显示不能匹配到的行
          -E : --extend-regexp,支持扩展正则表达式元字符
          -F : 快速搜索,等于直接使用fgrep命令
          -q : --quiet,--silent,静默模式,即不输出任何信息,一般在脚本中使用
          -A # : (after)显示匹配到的行,后#行
          -B # : (before)显示匹配到的行,前#行
          -C # : (context),显示匹配到的行,前后各#行
          -n : 显示行号
    
    • 例: cat /etc/rc.d/init.d/functions | grep -E2 "^[_[:alnum:]]+\(\)"
      • 解释:过滤functions文件中,以单词或者单词前面跟了一个"_"开头的行,并显示前后2行,这里的2相当于 -C 2,或者可以直接写成-2,

练习:

  1. /etc/passwd文件中不以/bin/bash结尾的行
    • grep -v "/bin/bash" /etc/passwd
  2. 找出/etc/passwd文件中两位数或三位数
    • grep "\<\([[:digit:]]\)\{2,3\}\>" /etc/passwd
  3. 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg g文件中,以至少一个空白字符开头,且后面存在非空白字符的行
    • grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf
  4. 找出netstat -tan命令的结果中以LISTEN后面跟0个、1个或者多个空白字符结尾的行
    • netstat -tan | grep "LISTEN[[:space:]]*”
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容