这是我参与更文挑战的第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的构造方法中的真正实现逻辑。
根据获取的文件路径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来判断是否要输出行首显示加上行数。