你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

工作中疑难问题处理常用工具分享及Linux命令tail、grep、awk详解

发布时间:2025-04-29

浏览次数:0

前言

在日常工作里常常会遇到诸多疑难问题需要处理。解决问题时,有一些工具发挥了很大作用。现将这些工具记录下来,其一作为笔记,以便自己后续忘记时能快速翻阅;其二用于分享intellij idea 快捷键,期望看到此文的同学们能拿出日常觉得很有帮助的工具,大家共同进步。

闲话不多说,开搞。

Linux命令类

tail

最常用的tail -f

tail -300f shopbase.log #从文件末尾开始显示300行内容并进入实时监听文件写入模式

grep

grep forest f.txt #文件查找
在f.txt和cpf.txt这两个文件中查找包含forest的内容
在/home/admin目录下查找所有符合关键字“log”的文件 查找时使用递归选项 查找时显示行号
cat f.txt | grep -i shopbase 
在/home/admin目录下使用grep命令查找包含'shopbase'的内容 递归查找 显示行号 只搜索指定后缀的文件 后缀为.vm和.java
在/home/admin目录下使用grep命令查找'shopbase',递归查找,显示行号,排除所有后缀为.vm和.java的文件 #进行反匹配
seq 10 | grep 5 -A 3 #上匹配
seq 10 | grep 5 -B 3 #下匹配
#上下匹配,平时用这个就妥了
将cat f.txt的结果通过grep命令查找包含'SHOPBASE'的内容并统计出现的次数

awk

1 基础命令

awk '{print $4,$6}' f.txt
打印文件f.txt和cpf.txt的行号及每行内容
打印行号和每行内容
针对f.txt和cpf.txt文件执行此操作
处理 cpf.txt 文件
将“echo 1:2:3:4”的输出通过管道传递给“awk -F: '{print $1,$2,$3,$4}'” 其中“echo 1:2:3:4”用于输出内容  “awk -F: '{print $1,$2,$3,$4}'”用于按冒号分割并打印分割后的字段

2 匹配

匹配包含ldb的行并打印
使用awk工具 对f.txt文件进行操作 筛选出不包含ldb的行并打印
使用awk命令,在f.txt文件中匹配包含ldb和LISTEN的行并打印出来
awk命令用于处理文本文件f.txt,条件是第五列匹配ldb,满足条件时打印该行内容

3 内建变量

NR表示从awk开始执行后,按照记录分隔符读取的数据次数。默认的记录分隔符为换行符。所以默认的就是读取的数据行数。NR可以理解为of的缩写。

在awk处理多个输入文件时,处理完第一个文件后,NR不会从1开始,而是继续累加。于是出现了FNR。每当处理一个新文件,FNR就从1开始计数。FNR可理解为File of 。

NF:NF指的是当前记录中被分割的字段的数量,NF能够被理解为of Field。

find

查找的文件名为*.log
find . -iname \*.txt(大小写都匹配)
find . -type d(当前目录下的所有子目录)
查找 /usr 目录下类型为符号链接的文件
并列出其详细信息(如inode、目录等)
查找/home/admin目录下大小超过250000k的文件 当然若将+改成-则是查找小于250000k的文件
查找/home/admin目录下权限为777的文件 执行ls -l命令列出这些文件 用于按照权限查询文件
查找/home/admin目录下1天内有过访问记录的文件
查找/home/admin目录下1天内状态改变过的文件 执行查找命令 查找范围为/home/admin 查找条件是文件状态在1天内有改变
查找/home/admin目录下 1天内有过修改的文件
查找/home/admin目录下1分钟内被访问过的文件
查找/home/admin目录下状态在1分钟内改变过的文件
查找/home/admin目录下1分钟内有过修改的文件

pgm

批量查询vm-满足条件的日志

pgm -A -f vm-shopbase 执行这样的操作 从 /home/admin/shopbase/logs/shopbase.log.2017-01-17 文件中提取内容 提取的内容是包含 2069861630 的行 然后通过管道符将其传递给 grep 命令进行筛选 最终由 pgm -A -f vm-shopbase 处理筛选后的结果

tsar

tsar是公司自行研发的采集工具。它十分好用。能把历史收集的数据持久化到磁盘。借助它可快速查询历史系统数据。实时应用情况也能查询。多数机器都安装了该工具

tsar ##可以查看最近一天的各项指标

tsar --live ##可以查看实时指标,默认五秒一刷

指定查看某天的数据。似乎最多只能查看四个月的数据。

tsar --mem
tsar --load
tsar --cpu
##当然这个也可以和-d参数配合来查询某天的单个指标的情况 

top

top除了查看一些基本信息外,其余就是协助查询vm的各类问题

ps -ef | grep java
top -H -p pid

获得线程10进制转16进制后去抓看这个线程到底在干啥

其他

对统计结果按出现次数从高到低排序
比如如下

快捷键打开任务管理器_intellij idea 快捷键_快捷键大全

排查利器

首先要说的是。它确实是生产环境和预发环境排查问题的强大工具。简介部分就不赘述了。直接展示代码开始操作

查看当前是哪个调用了add方法。同时只打印线程调用栈。该线程当前的size要大于500

针对类“java.util.ArrayList”的方法“add”进行处理,位置信息为:种类是调用,类路径为“/./”,方法路径为“/./”
用 @TargetMethodOrField 注解的字符串 method
如果获取“java.util.ArrayList”的“size”字段的值并应用于实例后大于479
打印输出(“检查 ArrayList.add 方法是谁:” + 探测类 + “#” + 探测方法 + “,方法:” + 方法 + “,大小:” + 获取整型值(字段(“java.util.ArrayList”,“size”),实例))
 jstack();
 println();
打印输出“===========================”;
 println();
}
}

2、监控当前服务方法被调用时返回的值以及请求的参数

针对类“com.taobao.sellerhome.transfer.biz.impl.C2CApplyerServiceImpl”的方法“nav”,在返回处进行标注
返回值为任意类型结果
打印输出("parameter# userId:"加上用户ID加上", current:"加上当前值加上", relation:"加上关系加上", check:"加上检查值加上", redirectUrl:"加上重定向URL加上", result:"加上结果)
}

其他功能集团的一些工具或多或少都存在。这些就不再赘述了。感兴趣的人士请前往其他地方。

注意:

Greys

Greys是杜琨创作的优秀作品吧。讲几个相当不错的功能(部分功能存在重合):

sc -df xxx:输出当前类的详细情况,涵盖源码位置以及结构

trace类:特别喜欢这个功能!很早之前就能看到它。能打印出当前方法调用的耗时状况,还能细分到每个方法。在排查方法性能时很有用,像我之前那篇就是用trace命令完成的

:。

其他功能部分和重合,可以选用,感兴趣的请移步。

另外相关联的是,他是基于Greys的,感兴趣的再移步

a1z9z...32.

就说一个功能

通过修改字节码,改变了类的内容,且能即时生效。因此能够快速在某处打日志查看输出。其缺点是对代码的侵入性过大。不过要是自己清楚自己在做什么,那确实是不错的东西。

其他功能Greys和都能很轻易做的到,不说了。

可以看看我之前写的一篇的简介

官网请移步

之前认为许多问题需通过,然而如今Greys和基本都可解决。另外出问题的大多是生产环境(网络隔离),故而基本不太使用了,不过仍要标记一下。

官网请移步

大杀器

可作为的插件,也可作为单独的程序打开。

详情请移步

集团内部的开发那可是众人皆知。简单来讲就是:已经有了,还要mat做什么

详情请移步.-inc.com

java三板斧,噢不对,是七把

jps

我只用一条命令:

并附带详细信息参数

普通用法:

使用sudo命令,以admin用户身份执行,路径为/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack,进程ID为2815

intellij idea 快捷键_快捷键打开任务管理器_快捷键大全

+java栈:

针对进程ID为2815的进程进行操作

快捷键打开任务管理器_intellij idea 快捷键_快捷键大全

jinfo

可看系统启动的参数,如下

使用sudo命令,以admin用户身份执行操作。进入/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin目录。执行jinfo -flags 2815命令

快捷键大全_快捷键打开任务管理器_intellij idea 快捷键

jmap

两个用途

1.查看堆的情况

获取进程2815的堆信息

快捷键大全_快捷键打开任务管理器_intellij idea 快捷键

2.dump

文件格式为 b

或者

使用sudo命令,以admin用户身份执行操作。进入/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin目录,运行jmap工具。执行dump操作,设置格式为b,将文件保存到/tmp/heap3.bin。目标进程ID为2815

3.看看堆都被谁占了? 再配合和intellij idea 快捷键,排查问题简直是如虎添翼

将上述命令的结果通过管道传输给head -10命令取前十行

快捷键大全_intellij idea 快捷键_快捷键打开任务管理器

jstat

jstat参数众多,但是使用一个就够了

执行/opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstat -gcutil 2815 1000这条命令

快捷键大全_intellij idea 快捷键_快捷键打开任务管理器

jdb

时至今日,jdb也是经常使用的。

jdb能够用于预发debug。假设预发的路径是/opt//java/ ,远程调试端口为8000。那么

附加到端口8000进行调试

出现以上代表jdb启动成功。后续可以进行设置断点进行调试。

具体参数可见官方说明

感觉在不少情形下能见到更有趣的事物,就不详细讲述了。查询资料得知,听说和jmap等工具是以它为基础的。

执行的具体命令是sun.jvm.hotspot.CLHSDB

更详细的可见R大此贴

of idea

key

快捷键一次你记不住,多来几次你总能记住了吧?

intellij idea 快捷键_快捷键大全_快捷键打开任务管理器

maven

分析maven依赖的好帮手。

VM

1、你的类到底是从哪个文件加载进来的?

-XX:+TraceClassLoading
结果呈现为[从D:\programme\jdk\jdk8U74\jre\lib\rt.jar加载了java.lang.invoke.MethodHandleImpl$Lazy]

2、应用挂了输出dump文件

-XX参数设置堆转储文件的路径为:/home/admin/logs/java.hprof
集团的vm参数里边基本都有这个选项

jar包冲突

把这个单独设个大标题不算过分吧?每个人都或多或少处理过这种烦人的情况。我就不信下面这么多方案还搞不定你?

mvn执行dependency:tree命令并将结果输出到~/dependency.txt文件中

打出所有依赖

使用mvn dependency:tree命令 带上-Dverbose参数 带上-Dincludes=groupId:artifactId参数

只打出指定和的依赖关系

-XX:+TraceClassLoading

vm启动脚本加入。在启动脚本中可见加载类的详细信息

 -verbose

vm启动脚本加入。在启动脚本中可见加载类的详细信息

greys:sc

greys的sc命令也能清晰的看到当前类是从哪里加载过来的

tomcat-classloader-locate

通过以下url可以获知当前类是从哪里加载的

通过curl工具 向http://localhost:8006/classloader/locate发送请求 其中class参数的值为org.apache.xerces.xs.XSObject

ALI-带给我们的惊喜(感谢务观)

列出容器加载的jar列表

使用curl工具向http://localhost:8006/classloader/jars发送请求

列出当前当当前类加载的实际jar包位置,解决类冲突时有用

curl http://localhost:8006/classloader/locate?class=org.apache.xerces.xs.XSObject

快捷键打开任务管理器_快捷键大全_intellij idea 快捷键

其他

gpref

dmesg

要是发觉自己的java进程无声无息地没了,几乎没留下啥线索。那么运行dmesg,很可能会有你想要的。

sudo dmesg|grep -i kill|less

去找关键字。找到的结果类似如下:

Java调用了oom杀手:gfp掩码等于0xd0,顺序为0,oom调整值为0,oom分数调整值为0
[6710782.070639] [] ?oom_kill_process加上0x68除以0x140
/LXC011175068174中的任务被杀。原因是/LXC011175068174的限制
内存控制组内存不足:杀掉进程215701(Java),得分854,或者牺牲子进程
进程215701被终止,用户ID为679,进程为java,总虚拟内存11017300千字节,匿名共享内存7152432千字节,文件共享内存1232千字节

以上表明 对应的java进程被系统的OOM终止了 得分为854

解释一下OOM。该机制会监控机器内存资源消耗情况。在机器内存耗尽前。它会扫描所有进程。扫描时会按照一定规则计算内存占用、时间等。之后挑选出得分最高的进程。最后将其杀死。以此来保护机器

dmesg日志时间转换公式:

如有侵权请联系删除!

13262879759

微信二维码