是谁软测三年 但是实际上只是个兢兢业业的日志矿工

  • 实时日志跟踪:
tail -f app.log 日志尾端实时打印
  • 日志文件不大且打印内容鲜明,我常用于查看启动日志或者进程日志
cat app.log  查看全日志

另:有开发总是爱和测试搞对立,我们要善于引导他,比如日志甩给他让他自己找

sz app.log  windows下载日志

crt的会话日志选项也可实时保存当前窗口打印日志

说起这个我之前不知道这个命令还一直用ftp下载全日志 甚至为此专门写了个上传下载脚本我就气(还好有时候在云桌面里面也能用到)

稍微高级点儿的查找方法:针对大日志文件 尤其是日志文件中同一接口多次调用

grep  万年好用

经过多次网上找吃的,总结常用的如下

cat app.log |grep --color -c5 '关键字'--高亮打印关键字 并打印关键字前后5行
grep '2022-10-26 17:[00-50]' app-20221026.log  --查找2022-10-26 17点前50分的日志

grep 对文件进行 模式查找
-n 显示匹配行及行号
-v 显示不包含匹配文本的所有行(求反)
-i 忽略大小写
-w 精确匹配
-c 显示总共匹配多少行 --可以用于统计某接口一段时间内被调用多少次
-cv 多少行没有被匹配到
-o 只显示被模式匹配到的字符串 --可以搭配其他正则用于统计
-color 匹配高亮展示
-A n 显示匹配到的字符串所在的行及其后n行 。 其中A代表after B 代表before(前n行)C代表context (前后各n行)

  • 文件要是实在太大了
分两步吧
 -  cat app.log | grep -n “abc”
 -  tail -n +目标调用行数 app.log | head -n 100
第一步:
grep -n "abc" 查找日志中带有 abc 字符的日志行,并输出行号
第二步:
tail -n +目标调用行数 app.log  通过上一个命令找到的行开始,一直输出到文件结束
通过 | 管道符,配合 head 命令,输出前一个命令 tail 后的100行日志  (行数可变)
  • 我有时候会干的错误示范操作 不要学

当一个组里面测试多了,而我测的业务又比较紧急且心情比较焦躁
嘿嘿 我就会~~~~

echo " ">app.log   把他们日志都清掉然后飞快调用一把把日志下载下来去notepad搜
  • 正则

grep还可以和正则表达式搭配起来 但是我懒 且我工作三年需要它的机会屈指可数,这个变成了我落灰的记忆角落

正则

^ 行首
$ 行尾
. 除了换行符以外的任意单个字符
* 前导字符的零个或多个
.* 所有字符
[] 字符组内的任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-z] 小写字母
[A-Z] 大写字母
[a-Z] 小写和大写字母
[0-9] 数字
\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾
^p$  匹配空行

扩展正则 sed 加 -r 参数 或转义
grep 加 -E 或 egrep 或转义
AWK 直接支持 但不包含{n,m}


sed -n '/roo\?/p' /etc/passwd 
sed -rn '/roo?/p' /etc/passwd
? 前导字符零个或一个
+ 前导字符一个或多个
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出现m次
x\{m,\} x出现m次至多次(至少m次)
x\{m,n\} x出现m次至n次



posix定义的字符分类
[:alnum:] Alphanumeric characters.
匹配范围为 [a-zA-Z0-9]
[:alpha:] Alphabetic characters.
匹配范围为 [a-zA-Z]
[:blank:] Space or tab characters.
匹配范围为 空格和TAB键
[:cntrl:] Control characters.
匹配控制键 例如 ^M 要按 ctrl+v 再按回车 才能输出
[:digit:] Numeric characters.
匹配所有数字 [0-9]
[:graph:] Characters that are both printable and visible. (A space is print-
able, but not visible, while an a is both.)
匹配所有可见字符 但不包含空格和TAB 就是你在文本文档中按键盘上能用眼睛观察到的所有符号
[:lower:] Lower-case alphabetic characters.
小写 [a-z]
$ grep -n '[[:lower:]]' regular_express.txt --查找小写字母
[:print:] Printable characters (characters that are not control characters.)
匹配所有可见字符 包括空格和TAB
能打印到纸上的所有符号
[:punct:] Punctuation characters (characters that are not letter, digits, con-
trol characters, or space characters).
特殊输入符号 +-=)(*&^%$#@!~`|\"'{}[]:;?/>.<,
注意它不包含空格和TAB
这个集合不等于^[a-zA-Z0-9]
[:space:] Space characters (such as space, tab, and formfeed, to name a few).
[:upper:] Upper-case alphabetic characters.
大写 [A-Z]
[:xdigit:] Characters that are hexadecimal digits.
16进制数 [0-f]


sed

流编辑器 stream editer,是以行为单位的处理程序
sed 流编辑器 stream editer
语法
sed [options] 'command' in_file[s]
options 部分
-n
-e
-i
-f
command 部分
'[地址1,地址2] [函数] [参数(标记)]'

定址的方法 1.数字 2.正则
数字
十进制数
1 单行 
1,3 范围 从第一行到第三行
2,+4 匹配行后若干行
4,~3 从第四行到下一个3的倍数行
2~3 第二行起每间隔三行的行
$ 尾行
1! 除了第一行以外的行
正则
正则必须用//包裹起来
扩展正则需要用 -r 参数或转义
数字定址:sed -n '1p' /etc/passwd
正则定址:sed -n '/^root/p' /etc/passwd

正则介绍
^ 行首
$ 行尾
. 除了换行符以外的任意单个字符
* 前导字符的零个或多个
.* 所有字符
[] 字符组内的任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-z] 小写字母
[A-Z] 大写字母
[a-Z] 小写和大写字母
[0-9] 数字
\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾



扩展正则 加 -r 参数 或转义
sed -n '/roo\?/p' /etc/passwd 
sed -rn '/roo?/p' /etc/passwd
? 前导字符零个或一个
+ 前导字符一个或多个
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出现m次
x\{m,\} x出现m次至多次(至少m次)
x\{m,n\} x出现m次至n次


函数
增删改
a 后插
c 替换
i 前插
d 删除
输入输出
p 打印匹配的行 一般和 -n 参数连用,以屏蔽默认输出
r 从文件中读入
w 写入到文件中
控制流
! 命令取反 例: 1!d 删除第一行以外的行
{} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法
= 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile
n 读入下一行到模式空间 例:'4{n;d}' 删除第5行
N 而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令


\(\) 保存被匹配的字符 以备反向引用\N时使用 最多9个标签 标签顺序从左至右
& 替换时使用,在不定义标签时使用(反向引用)


awk [options] 'commands' files
option
-F 定义字段分隔符,默认的分隔符是连续的空格或制表符
使用option中的-F参数定义间隔符号
用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域
NF变量表示当前记录的字段数
-v 定义变量并赋值 也可以借用次方式从shell变量中引入

AWK变量
NR 当前记录的个数(全部文件连接后的统计) 
FNR 当前记录的个数(仅为当前文件的统计,非全部)
FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
OFS 输出字符的分隔符 默认是空格
NF 当前读入行的字段个数
ORS 输出记录分隔符 默认是换行
FILENAME 当前文件名
 

操作符
赋值
= += -= /= *= 
逻辑与 逻辑或 逻辑非
&& || !
匹配正则或不匹配,正则需要用 /正则/ 包围住
~ !~
关系 比较字符串时要把字符串用双引号引起来
< <= > >= != ==
字段引用
$ 字段引用需要加$,而变量引用直接用变量名取
运算符
+ - * / % ++ --
转义序列
\\ \自身
\$ 转义$
\t 制表符
\b 退格符
\r 回车符
\n 换行符
\c 取消换行


参数说明:
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!



总结:
^word    表示带搜寻的字符串(word)在行首

word$    表示带搜寻的字符串(word)在行尾

.(小数点) 表示 1 个任意字符

\        表示转义字符,在特殊字符前加\会将特殊字符意义去除

*        表示重复 0 到无穷多个前一个 RE(正则表达式)字符

[list]   表示搜索含有 l,i,s,t 任意字符的字符串

[n1-n2]  表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等

[^list]  表示反向字符串的范围,例如[^0-9]表示非数字字符,[^A-Z]表示非大写字符范围

\{n,m\}  表示找出 n 到 m 个前一个 RE 字符

\{n,\}   表示 n 个以上的前一个 RE 字符




例子
$ grep -n 'the' regular_express.txt

$ grep -in 'the' regular_express.txt

查找“tast”或者“test”两个字符串。
# grep -n 't[ae]st' regular_express.txt 

查找不包含“#”的字符串
# grep -n '[^#]' regular_express.txt  

查找字符“oog”,如果我不想要“oog”字符前面有 g,则查找“[^g]oog”,同理,查找“[^go]oog”是指字符“oog”前面不能为 g 或者 o

$ grep -n 'oog' regular_express.txt

$ grep -n '[^g]oog' regular_express.txt 

$ grep -n '[^go]oog'regular_express.txt 

查找行首为“the”的字符行
$ grep -n '^the' regular_express.txt 

查找以 d 字母结尾的行
# grep -n 'd$' regular_express.txt 

查找空行
$ grep -n '^$' regular_express.txt 

*(星号):代表重复前面 0 个或者多个字符。
e*: 表示具有空字符或者一个以上 e 字符。
ee*,表示前面的第一个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。
eee*,表示前面两个 e 字符必须存在。第三个 e 则可以是 0 个或者多个 e 字符。
ee*e :表示前面的第一个与第三个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。

我看有的大佬还用vi编辑模式去找日志 ,可能还是我们公司太小了吧