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最好用单引号就好了。