文章目录

  • ​​报错:grep: 04:00:30.775: No such file or directory​​
  • ​​查看zip文件中的内容​​
  • ​​忽略大小写​​
  • ​​打印文件名(一般用于多文件)​​
  • ​​只获取匹配到的内容,不要整行数据​​
  • ​​获取匹配行前后的数据​​
  • ​​匹配单个单词​​
  • ​​grep的or,and,not​​
  • ​​or多条件或​​
  • ​​and多条件与​​
  • ​​通过管道多次grep​​
  • ​​### 排除掉匹配行(not)​​
  • ​​grep子级目录​​
  • ​​-a的作用​​
  • ​​grep 大文件,多条件的处理方案​​
  • ​​通配符​​
  • ​​通配符例子​​
  • ​​小括号要转义么​​
  • ​​转义字符​​
  • ​​-l 只查找匹配到的文件​​

报错:grep: 04:00:30.775: No such file or directory

如果是date要用双引号,否则空格会认为一半是string,一半是file。

查看zip文件中的内容

zgrep dingbusan *.zip

忽略大小写

grep -i *.log

打印文件名(一般用于多文件)

grep -H shipotian *.log
如果条数太多,可以加​​​wc -l​​ 查看条数.

只获取匹配到的内容,不要整行数据

grep -o zhangwuji *.log #

获取匹配行前后的数据

grep -C 2 error *.log    # 匹配行和上下(center)2行的数据
grep -A 5 error *.log # 匹配行和后面(after)5行的数据
grep -B 2 error *.log # 匹配行和之前(before)2行的数据
grep -5 error *.log # 不写字母,和C相同,默认是上下n行

匹配单个单词

grep -word ing *.log

grep的or,and,not

or多条件或

or多条件查询,例如 zhangsan,lisi的我都要
方法有好几种,如下是3种示例:

grep "zhangsan\|lisi" *.log  # 用\| 表示转义的 | ,不要忘记前面的右斜杠  
# grep -E 相当于 egrep, 使用正则表达式, 中间的 | 不用转义
grep -E "zhangsan|lisi" *.log #
egrep "zhangsan|lisi" *.log #

错误写法:
grep a b test.txt
这样肯定是不行的,因为会把b当做文件。

and多条件与

不只一种办法。

通过管道多次grep

方案一:
多条件与,用多个grep即可。

grep zhangsan *.log | grep lisi

就是多条件在不同行, 例如异常是多行的。

java.lang.Exception
at com.example.accessingdatamysql.controller.Demo.main(Demo.java:15)

我们要找Demo类的Exception,可以如下写法,这样2行记录都能显示出来:

grep -A 2 Exception  | grep -B 2 Demo *.log

方案二:
排列组合下可能的情况(如果字段比较多,那么不太适合):
grep “chu.*yu|yu.*chu” c.txt

### 排除掉匹配行(not)

grep -v zhangfei *.log # 排除带有zhangfei的行

grep子级目录

有的时候,不确定在哪个文件夹下:

grep 1bbb9012cf543e26 */*.log  # 这样可以,但是成本有点高

如果大致知道在某几个文件夹下,用空格分隔即可,如下:

grep 1bbb9012cf543e26 document/*.log custom/*.log  # 可以多文件夹grep 空格分隔

-a的作用

像处理文本一样处理二进制文件,简单的说就说可以查看二进制文件中的内容。
例如

grep bbb a.txt.tar  # 能匹配到文件,但是不会显示内容 
grep -a bbb a.txt.tar # 可以显示内容

注: tar是二进制文件。 tar.gz不是二进制文件。 需要用zgrep命令

grep 大文件,多条件的处理方案

如果文件很大,且要通过管道来grep,那么速度不够快。
例如 一个文件8G。

# 语句一
grep 查询单据成功 info.log
# 语句二
grep 查询单据成功 info.log | grep 66667777

当文件很大的时候,会发现grep是个逐渐处理的过程,找到的行会打印出来,再找到会继续打印。
如果使用管道,那么不会逐渐打印,第一个grep会把内容先缓存起来,通过第二个grep之后才会输出。 这时间肯定不短。 而且重新搜索,又要那么长时间。

解决方案:
分为2步,先存到文件,再grep。

grep  查询单据成功 info.log > a.txt
grep 66667777 a.txt

实测第一个语句速度蛮快的,第二个更快。而且a.txt复用起来方便。
这并没有使用新技术,属于技巧上的问题。

通配符

  • 任意字符
    ? 任意单个字符
    [abc] 集合内的任何单个字符
    [a-c] 范围内的任何字符
    ​​​[^ab]​​​ 不是集合内的任何字符
    ^c c开头的行
    b$ b结尾的行

通配符例子

筛选日志文件:

# 所有日志文件
grep code *.log
# *的话,范围太大,6月十几号的日志文件
grep code localhost-2019-06-1?.log
# 6月所有的日志文件
grep code localhost-2019-06-??.log

小括号要转义么

不用。 要匹配小括号,直接输入即可。 输入左斜杠反而会报错。

# 正确
grep "(" info.log

# 错误
grep "\(" info.log
# 报错信息
grep: Unmatched ( or \(

转义字符

为什么要有转义字符,因为grep是支持正则表达式的,有些符号表示其他含义,所以如果要表示为字符,就需要转义。

常见的要转义的字符:
"
​​​\​​ ( 和 )

写法:

双引号
grep "\"" a.txt

右斜杠 \ ,这个比较特殊,如果要匹配\字符,需要这么写:
grep "\\\\" a.txt
为什么是4个右斜杠呢,因为前2个右斜杠解析为\转义符号,后2个右斜杠表示为\符号。

-l 只查找匹配到的文件

例如,有时不要内容,只想要匹配到的文件名,一个-l就可以解决。
grep -l aaa *.log; # 输出结果 a.txt