grep 全详解

使用的正则是 POSIX 格式的正则 不可以使用\d 只能使用[:digit:] 这样的缩写

但是我也不建议使用[:digit:] 这样的形式 [0-9] 不是更直接 \w 使用 [a-zA-Z0-9]替代 反正根据自己的需求来 [\w 匹配字母或数字或下划线或汉字]

语法

grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [–binary-files=value] [–color[=when]]
[–colour[=when]] [–context[=num]] [–label] [–line-buffered]
[–null] [pattern] [file …]

和find命令不一样的是 grep 是放在最后面的 而 find 命令是要将文件夹放在最前面

一般情况下 grep 是检索那个 file 中匹配 模式的行,匹配的内容不包含 \n,一个空语句匹配每一行,匹配的行将被输出到标准输出

grep 用来使用简单的模式正则中,egrep 用在扩展正则,fgrep 比grep 和egrep 都快但是要使用编译好的正则,pattern

zgrep, zegrep ,zfgrep 和上面提及到的是一样的,只不过针对的是compress file


下面是详细选项

  1. -A num ,–after-context=num 输出匹配行之后的num行
    demo
tbapi/file1.txt:72059704415233307
tbapi/file1.txt-adklahda
--
tbapi/file2.txt:72059704415233307
tbapi/file2.txt-asdad
tbapi/file2.txt-adhasd
tbapi/file2.txt-dahs

普通程序信息
  1. -V,–version 查看版本
Matcher 选项

grep is used for simple patterns and basic regular expressions (BREs);
egrep can handle extended regular expressions (EREs)

  1. -E 增强正则 类似于egrex ERE
  2. -F –fixed-strings 将Pattern 理解成一个fixed 字符串
    而不是一个正则表达式,通过\n 划分,满足其中一个就会返回
  3. -G ,–basic-regex 将pattern 理解成个一个普通的正则BRE 这个是默认选项
  4. -P –perl-regex 将Pattern 理解成一个Perl 正则表达式,PCRE 这个是实验性的会报一些错误
Matcher 控制
  1. -e Pattern ,–regex=PATTERN 使用PATTERN 当做pattern ,多个-e 可以用来描述多个不同的匹配模式 这个选项在使用pattern 是以“-” 开头的时候特别有用
  2. -f FILE ,–file=FILE 从FILE中获得匹配的数据 ,多个 -f 表示从多个文件中匹配数据 而不是直接输出
    grep "test" file* 可以写成 grep -f grep.cmd file* 将命令写到 grep.cmd 文件中
demo
cat > grep.cmd <<EOF
>test$
>^n
>san.*o
>EOF

grep -f grep.cmd file*
  1. -i ,–ignore-case 忽略Pattern 和文件内容的大小写
  2. -v –invert-match 取没有匹配的行
  3. -w –word-regexp 只选择匹配上整个 words 只有前后被不是word 组成部分的字符包围才会匹配,文档讲的很晦涩,就是单词就对了 ,组成部分可以是 letters 数字和下划线
  4. -x –line-regex 只匹配精确匹配一行的记录
  5. -y 完全和-i一样
输出控制
  1. -c –count [suppress]压住,取缔原来的行输出,取而代之的是返回文件匹配的行数

  2. –color[=WHEN] 可选值是never,always,auto 在输出的时候输出颜色 可以使用GREP_COLORS 环境变量来定义凸显的颜色,过时的GREP_COLORS 过时了但是还是可以用

  3. -L –files-without-match 只输出么有匹配的文件名
  4. -l 只显示匹配的文件名 查找的位置在每个文件的第一个匹配处
  5. -m NUM,–max-count=NUM 有两种情况一种情况是 输入值是文件[多个],每个文件中只返回最多NUM行 如果是管道传过来的数据 最后匹配NUM行
  6. -o 只输出不为空的行中 匹配的部分 ls | grep "file"返回的值只有file 没有-o 选择 会有文件整体名字
  7. -q –quiet,–silence 不打印出任何东西,即使是 发生错误
  8. -s,–no-messages 压制不存在或者文件不可读错误
输出行前缀控制
  1. -b,–byte-offset Print the 0-based byte offset 在文件名前打印出来 【从0 开始 的位置信息 比如查找的是在第一个字符 就是 0 第二个就是1 以此类推 但是在mac 上面 貌似没有用】
  2. -H –with-filename 每一个匹配的行 如果是多个文件 打印出文件名 这个是默认选项
  3. -h ,–no-filename 多个文件的时候不打印出文件名 当中有一个文件的时候 这个是默认选项
  4. –label=LABEL gzip -cd foo.gz | grep --label=foo -H something 这个是在zgrep 的时候比较有用 【不是太熟悉】
  5. -n –line-number 显示行号
    查看下面demo

    martin@ubuntu:~/Desktop/shell_test$ ls | sort
    abc.txt
    awk.txt
    file1.txt
    file2.txt
    file3.txt
    list_salary.awk
    mail_test.php
    martin@ubuntu:~/Desktop/shell_test$ ls | grep -n "file"
    3:file1.txt
    4:file2.txt
    5:file3.txt
  6. -T –initial-tab 让正真打印出来的内容被一个 tab 区分开来
    常常和-b -n -H 一起使用
    demo
martin@ubuntu:~/Desktop/shell_test$ ls | grep -nT "file"
   3   :file1.txt
   4   :file2.txt
   5   :file3.txt
打印出来的内容控制
  1. -A NUM –after-context=NUM 打印出匹配内容的之后几行

  2. -B NUM–before-context=NUM

  3. -C NUM–context=NUM 表示前后各NUM行

    注意都是大写

文件或者目录选择
  1. -a –text 讲一个binary 文件当成一个文件处理 同 –binary-files=text 选项
  2. –binary-files=TYPE 有好几种方式 1.默认是binary 按照binary 输出内容 2. without-match grep 假设一个binary 文件没有被匹配上 比正常的 会多出来一行* 和选项-I 类似 3. text 相当于 -a 将binary 当成文件读取 grep 可能将非text的字符理解成行终结符,比如说pattern“.” 就不会匹配上 空byte 因为空byte 将被当成换行符 少用

  3. -D ACTION –device=ACTION 假如输入是一个设备,FIFO 或者socket 使用ACTION 去处理 默认情况下是read 这些设备将被当成普通文件读取 如果是skip 将会跳过

  4. -d ACTION –directories=ACTION 假如输入的文件是一个目录 使用ACTIOn 来处理,默认的情况是读read,将目录当成一个普通文件,如果是skip 默认跳过,如果是recurse 递归输出所有文件
  5. –exclude=GLOB skip 满足GLOB的文件 可以使用*,? […] 和 \ 转义字符
  6. –exclude-from=FILE 从文件中读取 跳过的文件 也可以使用 –exclude GLOB 中的语法
  7. –exclude-dir = DIR
  8. -I 和–binary-files=without-match 其实就是忽略文件
  9. –include=GLOB 只在满足GLOB 的文件中查找
  10. -r –recursive 对文件夹进行递归查询 但是对symbolic links 的文件只有在命令里面才检索 如果没有文件就是默认当前文件夹
  11. -R 和-r 类似 不过 也包含了symbolic links
其他选项
  1. –line-buffered 在输出上使用行缓存
  2. -U –binary 一般情况下 grep会根据读取文件的32k 开决定文件的类型是binary 还是text 这个选项直接将文件当成binary 处理 只会在MS-DOS 和MS-Windows 下才会有作用
  3. -z –null-data 使用ASCII 中的NUL识别为换行符
正则表达式

grep 理解三种类型的正则表达式
1. basic BRE
2. extended ERE
3. perl PCRE

例子

http://www.cnblogs.com/sky-heaven/p/6034777.html

自己的demo
1. 查看 xml文件中 有特殊状态的信息

grep -ohE '<sid>[0-9]{12,}</sid><status>TRADE_NO_CREATE_PAY</status>' 2017-11-*

默认情况下会输出 文件名 -h 不输出文件名 -o 表示只输出匹配的内容 -E 表示使用增强版的正则表达式

例子

grep -F 的功能类似于 fgrep 语法和 grep 类似 下面是例子

# test.txt 
Demo Hello.*? World
This is second line
This is third line

dingmac@Downloads$ egrep -oni "hello.*?" test.txt
1:Hello
dingmac@Downloads$ fgrep -oni "hello.*?" test.txt
1:Hello.*?

-F 参数表示将 pattern 解释成 一个单纯的文本 不解释成正则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值