grep命令学习

转自:https://blog.csdn.net/weixin_42586723/article/details/116481242

https://www.runoob.com/linux/linux-comm-grep.html,https://www.myfreax.com/regular-expressions-in-grep/

1.在gz压缩文件中查找 

zcat nbsp-2021-05-06-11-82.log.gz  | grep -a -C 30 '884381688886'

无需解压日志,grep的选项介绍:

    -a :将 binary 文件以 text 文件的方式搜寻数据
    -r :递归搜索,当查找目录时使用该参数
    -v :反向选取,显示不包含匹配文本的所有行。
    -o :只显示被模式匹配到的字符串,而不是整个行,只显示匹配PATTERN 部分。//!!
    -i :匹配时不区分大小写(ignore)
    -A  5 :显示匹配到的行时,显示后面的 5-B  5 :显示匹配到的行时,前面的 5-C  5 :显示匹配到的行时,前后的 5-E :使用扩展的正则表达式
-n : 显示匹配行的行号。
-w : 精确查找 某个字符串

其实这里还是解压了文件,zcat 解压文件并将内容输出到标准输出。可以直接使用zgrep命令一步完成:

zgrep "/api" access_log.gz

找出以.log为结尾的文件:(不包含.log.gz压缩文件)

ls |grep 'log$'

查找带空格的字符串:

使用双引号或者 不使用引号+空格用转义字符:

grep  -r Can\ not\ loading ../

^字符号表示与行的开头的字符串匹配。如果正则表达式以^开头,grep将在每行的开头开始匹配^之后的字符串:

grep '^linux' file.txt    #从文件file.txt中搜索以字符串linux开头的行

$美元符号与行的结尾字符串匹配。$之后表示你需要搜索的内容。grep将在每行的行尾匹配$之后的字符串:

grep 'linux$' file.txt    #从文件file.txt中搜索以字符串linux结尾的行
grep '^$'  #查找空行
grep '^linux$' file.txt  #从文件file.txt中搜索仅包含linux的行

或运算:

grep 'fatal\|error\|critical' /var/log/nginx/error.log      #需要加反斜杠
grep -E 'fatal|error|critical' /var/log/nginx/error.log    #有 -E不需要加转义的反斜杠

 

2.其他例子 

grep test test* #查找前缀有“test”的文件包含“test”字符串的文件 

grep -r update /etc/acpi 
# 查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,

参数顺序是:grep 查找内容 查找文件

3.引号、单引号区别

  • ""号里面遇到$,\等特殊字符会进行相应的变量替换。(双引号shell会转义一次,grep会再转义一次。)
  • ''号里面的所有字符都保持原样。(只有grep会转义一次)
  • 完全不加:不会将含有空格的字符串视为一个整体输出,会截断。一般连续的字符串,数字,路径等可以用。

一般常量用单引号''括起,如果含有变量则用双引号""括起。

grep "$a" file        #引用变量a,查找变量a的值
 
grep '$a' file        #查找$a字符串

grep "\\\\" file    #如果用双引号,查找一个\,就应该用四个\,
#shell把四个\,转义成2个\传递给grep,grep再把2个\转义成一个\查找

grep '\\' file    #查找\字符串
#shell没转义,直接把2个\传递给grep,grep再把2个\转义成一个\查找

所以,为了避免shell的元字符对正则表达式的影响,请用单引号''括起来,千万不要用双引号括起来""或者不括起来。 只要是grep最好用单引号就好了。

 

posted @ 2022-09-23 08:05  lypbendlf  阅读(360)  评论(0编辑  收藏  举报