zoukankan      html  css  js  c++  java
  • Linux grep命令详解

    一、grep命令介绍

      很多时候,我们并不需要列出文件的全部内容,而是从文件中找到包含指定信息的那些行,要实现这个目的,可以使用 grep 命令。grep命令是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。正则表达式是描述一组字符串的一个模式,正则表达式可以是一些纯文本文字,也可以是用来产生模式的一些特殊字符。为了进一步定义一个搜索模式,grep 命令支持如下表所示的这几种正则表达式的元字符(也就是通配符)。

    通配符 功能
    c* 将匹配 0 个或多个字符 c(c 为任一字符)
    . 将匹配任何一个字符,且只能是一个字符
    [xyz] 匹配方括号中的任意一个字符
    [^xyz] 匹配除方括号中字符外的所有字符
    ^a 匹配以a开头的行
    $a 匹配以a结尾的行

    grep 命令在每一个文件或特定输出中搜索特定的模式,当使用 grep 时,会输出跟指定模式匹配的每一行,但是使用 grep 命令并不改变文件中的内容。grep命令的基本格式如下:

    [root@localhost ~]# grep [选项] 模式 文件名

    这里的模式,要么是字符串,要么是正则表达式,而此命令常用的选项以及各自的含义如下表所示:

    选项 含义
    -c 仅列出文件中包含模式的行数
    -i 忽略模式中的字母大小写
    -l 列出带有匹配行的文件名,不列出具体的匹配行
    -n 列出所有的匹配行,并显示行号
    -v 列出没有匹配模式的行
    -w 把表达式当做一个完整的单字符来搜寻,忽略那些部分匹配的行(匹配整词)
    -r 递归搜索

    注意,如果是搜索多个文件,grep 命令的搜索结果会显示文件名+匹配模式的行。

    二、grep使用举例

    【例1】假设有一份 emp.data 员工清单,现在要搜索此文件,找出职位为 CLERK 的所有员工,则执行命令如下:

    [root@localhost ~]# grep CLERK emp.data
    #忽略输出内容

    而在此基础上,如果只想知道职位为 CLERK 的员工的人数,可以使用“-c”选项,执行命令如下:

    [root@localhost ~]# grep -c CLERK emp.data
    #忽略输出内容

    【例2】搜索 emp.data 文件,使用正则表达式找出以 78 开头的数据行,执行命令如下:

    [root@localhost ~]# grep ^78 emp.data
    #忽略输出内容

     【例3】搜索data2.txt文件,搜索其中包含"data"的行,命令如下:

    ➜  test cat data2.txt
    line1:This is the header line 1.
    line2:This is the first data line 2.
    line3:This is the second DATA line 3.
    line4:This is the last line 4.
    
    ➜  test grep -inr data data2.txt
    2:line2:This is the first data line 2.
    3:line3:This is the second DATA line 3.
    # -i 表示忽略大小写,-n表示列出行号,-r表示递归搜索,-r会匹配当前目录所有文件,以及子目录下的所有文件

    【例4】使用grep过滤命令输出

    ➜  test ps -aux|grep systemd
    root         246  0.2  0.2  95284 38520 ?        Ss   Jul07 319:31 /lib/systemd/systemd-journald
    root         268  0.0  0.0  45696  3776 ?        Ss   Jul07   0:15 /lib/systemd/systemd-udevd
    root         534  0.0  0.0  38084  4416 ?        Ss   Jul07   0:49 /lib/systemd/systemd-logind
    message+     547  0.0  0.0  36684  3472 ?        Ss   Jul07   2:04 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
    root        1050  0.0  0.0  56540  6184 ?        Ss   Jul07   0:29 /lib/systemd/systemd --user
    tiger       1051  0.0  0.0  56636  6348 ?        Ss   Jul07  93:05 /lib/systemd/systemd --user
    falcon      1055  0.0  0.0  56516  6244 ?        Ss   Jul07   0:00 /lib/systemd/systemd --user
    baichun+ 2981158  0.0  0.0  12756  1016 pts/1    S+   12:38   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox systemd
    baichun+ 3906675  0.0  0.0  56404  6196 ?        Ss   Aug31   0:00 /lib/systemd/systemd --user

     【例5】用 dmesg 列出核心信息,再以 grep 找出包含 eth 那行,在关键字所在行的前两行后三行也一起捉出来显示

    [root@www ~]# dmesg | grep -n -A3 -B2 'eth'
    245-PCI: setting IRQ 10 as level-triggered
    246-ACPI: PCI Interrupt 0000:00:0e.0[A] -> Link [LNKB] ...
    247:eth0: RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84, IRQ 10
    248:eth0: Identified 8139 chip type 'RTL-8139C'
    249-input: PC Speaker as /class/input/input2
    250-ACPI: PCI Interrupt 0000:00:01.4[B] -> Link [LNKB] ...
    251-hdb: ATAPI 48X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(66)
    # 如上所示,你会发现关键字 247 所在的前两行及 248 后三行也都被显示出来!
    # 这样可以让你将关键字前后数据捉出来进行分析啦
    # -B2:Before前两行 -A3:After后三行

    【例6】递归查找文件内容

    ➜  test grep -rn bcy *             # 纯字符串匹配,可以不加单引号,如果是正则表达式匹配,必须加单引号,如:grep -rn 'bcy' *
    temp.txt:1:my name is bcy.
    test.txt:2:smierrth,bcy
    #在当前目录及其子目录下搜索包含'bcy'行的文件,*代表搜索全部文件
  • 相关阅读:
    在金融服务计算中,必须要使用BigDecimal
    互联网发展的三个阶段
    k3 cloud服务器端安装顺序
    k3 cloud修改数据库密码后无法连接管理中心
    K3 CLOUD提示库存键重复,提示如下
    k3 cloud总账凭证提示冲突,清除冲突并且第二天开机以后依然提示
    k3 cloud注册插件的时候提示,请选择一个有效的插件程序集
    k3 cloud付款单提示余额不足,科目余额表中余额为正,银行存款流水账中未负数
    k3 cloud提示超出产品激活有效期
    k3 cloud在站点中新增用户
  • 原文地址:https://www.cnblogs.com/baichunyu/p/15314049.html
Copyright © 2011-2022 走看看