• 探索grep命令


    grep是linux的一款搜索工具,基本啥linux版本都有自带此工具。下面部分参数若没有说明,表示功力不够,理解不了。

    选择匹配器

    -E 正则表达式(相当于egrep命令)
    -F 将pattern当作纯文本,纯字符串匹配(相当于fgrep命令)
    -G 基础表达式(默认的,不需指定)
    -P perl正则表达式

    匹配控制

    -e pattern pattern就是要匹配的模式串(默认,不需指定)
    -f filename 模式串在文件中给出
    -i 忽略大小写
    -v 反转匹配,就是选中那些没匹配到的行
    -w 匹配整个词
    -x 匹配整行

    输出控制

    -c 统计匹配了多少行
    --color=WHEN 什么时候显示颜色,WHEN可以是never、always、auto(不过颜色是由环境变量GREP_COLORS定义的),一般用auto即可
    -L 输出一个没有任一行被匹配到的文件名(最多仅输出一个文件名,输出后立即停止搜索)
    -l 输出一个至少有一行被匹配到的文件名(注意点同上)
    -m NUM 指定每个文件只输出几行,即最多在搜出NUM行后就停止这个文件的搜索
    -o 只输出行中匹配到的部分,而不是输出整行
    -q 不输出任何东西?连错误都不输出,很奇怪的参数
    -s 不输出错误信息,包括文件不存在、不可读文件等产生的错误

    输出行前缀控制

    -b
    -H 每次匹配到就打印文件名(在输入文件个数为1时就是默认项)
    -h 省去文件名的前缀(文件的位置比较深,前缀比较长时有用)
    --label=LABEL
    -n 顺便打印出匹配到的模式在文件中的行号
    -T
    -u 报告unix风格的字节偏移(win系统才有用)
    -Z 打印NULL字符

    上下文行控制

    -A NUM 输出的每个匹配行之后多输出NUM行上下文
    -B NUM 和-A同理,就是在匹配行之前的上下文而已
    -C NUM 输出NUM行上下文,估计是包括上文和下文

    选择文件和目录

    -a 按二进制处理文件
    --binary-files=TYPE 如果TYPE是text,就相当于-a
    -D ACTION 如果输入文件是个设备、FIFO、socket,就以ACTION来处理它,可以是skip、read(默认)
    -d ACTION 如果输入的是目录,则以ACTION来处理它, ACTION可以是skip、recurse、read(默认)
    --exclude=GLOB 忽略那些文件名能被GLOB匹配中的文件
    --exclude-from=FILE 同上,只是将多个GLOB写在文件中,匹配中其中一个GLOB都会被忽略
    --exclude-dir=DIR 忽略指定目录,DIR也是个模式串,目录可以是递归的(就是说可以是某个目录下的目录名)
    -I
    --include=GLOB 只搜索那些文件名被GLOB匹配的文件
    -r 递归搜索所有文件(默认是只搜当前一层文件),不考虑符号链接
    -R 同-r,但是考虑符号链接

    其他选项

    --mmap 如果可能的话,用系统调用mmap()来读取输入文件,而不是用read()
    -U 将输入文件作为二进制处理,一般在win系统中会去读文件前32KB来判断文件类型(不是win系统则选项无效)

    实战

    1、
    如果输入多个文件,可以用管道符|,grep匹配的就是文件名了,输出的也是文件名,比如:
    ls | grep "int"

    如果输入的只有单个文件,grep匹配的就是文件中的行了,比如:
    grep "int" test.txt

    如果输入多个文件,又要匹配每个文件中的行,那就要配合xargs命令了,如:
    ls | xargs grep "int"

    如果不想用xargs,也可以在最后面加上要匹配的文件名规则,grep就知道你要匹配的是行,如:
    ls | xargs grep "int" *.txt

    2、
    如果输入的是多个文件,可以直接将文件名列出来,如:
    grep "int" a.cpp b.cpp d.cpp g.cpp

    如果要在多个文件中指定部分文件作为输入,可以用通配符*等来匹配文件名,如:
    grep "int" *.cpp

    当然,管道符也是可以照样用的,这样它就不是从本目录搜文件,而是从输入中搜文件,如:
    ls | grep "int" *.cpp

    3、
    grep默认是匹配串的,就是只要匹配到就能输出,如果要匹配整个单词,可以用-w,如:
    grep -w "int" *.cpp

    如果要匹配整个行,可以用-x,如:
    grep -x "int" *.cpp

    反转匹配一下试试,如:
    grep -vx "int" *.cpp

    忽略一下大小写,如:
    grep -ivx "int" *.cpp

    4、
    如果想统计某文件中匹配到几个,可以用-c,如:
    grep -c "static" *.cpp

    有颜色的话看起来显眼一些,如:
    grep --color=auto "static" *.cpp

    如果想知道哪些文件中不含指定关键字,可以用-L,只输出文件名,如:
    grep -L --color=auto "static" *.cpp

    5、

    搜索多个关键字,匹配其中一个就输出,如:
    grep "std|abc|oom" * -rni


    未完待续。。。

  • 相关阅读:
    leetcode 对称二叉树
    leetcode 验证二叉搜索树
    蓝桥杯 完美的代价 贪心
    蓝桥杯 字符串对比 模拟
    蓝桥杯 芯片测试 极限找规律
    蓝桥杯 2n皇后问题 深搜
    74. 搜索二维矩阵
    二分 34
    二分 35
    二分 69
  • 原文地址:https://www.cnblogs.com/xcw0754/p/8595430.html
Copyright © 2020-2023  润新知