Arthas 应用诊断利器学习及使用(五) 基础命令tee,grep

434 阅读2分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

本文内容基于arthas 3.5.1 版本,介绍基础命令tee,grep的使用及实现。

一.tee命令

类似传统的tee命令, 用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

参数名称参数缩写参数说明必填项示例
file文件路径可选sysprop | tee /path/to/logfile
--append-a是否追加到文件中可选sysprop | tee -a /path/to/logfile

文件位于com.taobao.arthas.core.shell.command.internal.TeeHandler.java

首先会执行TeeHandler中的inject(List<CliToken> tokens)方法,CLIConfigurator.inject(commandLine, teeCommand)会通过反射将解析出来的参数,注入到创建出来的teeCommand中。并执行TeeHandler的构造方法中的真正实现逻辑。

image.png

根据获取的文件路径filePath判断是否为文件夹,是的话则报错提示。如果输出路径不存在则创建后,通过new PrintWriter(new BufferedWriter(new FileWriter(file, append)))输出内容到文件中。

二.grep命令

类似传统的grep命令。

文件位于com.taobao.arthas.core.shell.command.internal.GrepHandler.java

参数名称参数缩写参数说明必填项示例
pattern表达式必填sysprop | grep java
--regex-e启用正则表达匹配可选
--ignore-case-i忽略大小写,默认大小写敏感可选sysprop | grep -i java
--invert-match-v筛选出未匹配的行可选sysprop | grep -v java
--line-number-n显示行数可选sysprop | grep -n java
--trim-end移除每行结尾空格,默认开启可选
--before-context-B显示符合样式的那一行之外,并显示该行之前的内容(感觉没区别)可选
--after-context-A除了显示符合样式的那一列之外,并显示该行之后的内容可选
--context-C除了显示符合样式的那一行之外,并显示该行之前后的内容可选
--max-count-m显示指定的行数可选sysprop | grep -m 6 java

将获取到的内容按换行分割。循环该数组,若trimEnd为true即参数--trim-end存在时,将会处理每一行结尾空行。

invertMatch判断为未匹配上的进入if判断 appendLine(StringBuilder output, int lineNum, String line)中根据showLineNumber即参数-n来判断是否要输出行首显示加上行数。