Linux 如何将top命令返回的PID值转换为十六进制?
我正在运行top命令,希望将PID十进制值转换为相应的十六进制值 我试图捕获JVM进程产生的JAVA子进程或线程,作为标准诊断过程的一部分,以解决应用程序服务器实例(如WebLogic)的问题 诊断包括运行一些命令,如top、lsof、jcmd来捕获堆/线程转储等。线程转储提供了该服务器上当前运行的线程堆栈列表。每个线程由其十六进制的“nid”标识 另一方面,top命令out将列出在该服务器上运行的LWP(轻量级进程),这些进程按CPU/内存使用情况排序。我希望PID在top命令输出中以十六进制值返回。然后可以在线程堆栈转储中隔离具有与十六进制值匹配的nid的线程Linux 如何将top命令返回的PID值转换为十六进制?,linux,shell,Linux,Shell,我正在运行top命令,希望将PID十进制值转换为相应的十六进制值 我试图捕获JVM进程产生的JAVA子进程或线程,作为标准诊断过程的一部分,以解决应用程序服务器实例(如WebLogic)的问题 诊断包括运行一些命令,如top、lsof、jcmd来捕获堆/线程转储等。线程转储提供了该服务器上当前运行的线程堆栈列表。每个线程由其十六进制的“nid”标识 另一方面,top命令out将列出在该服务器上运行的LWP(轻量级进程),这些进程按CPU/内存使用情况排序。我希望PID在top命令输出中以十六进制
top -Hbn3 -p 10258 |sed -n '/PID/,/^$/p' | awk '{print $1}' | sed '/PID/d' > pids.txt
( echo "obase=16" ; cat pids.txt ) | bc
top-Hbn3-p10258返回由进程id 10258生成的所有PID。结果被捕获三次。请参阅top命令的-n3选项
使用sed和awk的组合,我成功地提取了第一列“PID”,并将值转换为十六进制。但我需要top命令返回的所有原始信息。换句话说,CPU/Mem usage columns timestamp等。只有PID列需要十六进制
实际结果:
$ top -Hbn3 -p 17941
top - 16:47:31 up 267 days, 19:09, 1 user, load average: 0.13, 0.03, 0.01
Tasks: 88 total, 0 running, 88 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.8%us, 0.5%sy, 0.0%ni, 98.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3925316k total, 3671784k used, 253532k free, 169504k buffers
Swap: 8388604k total, 214948k used, 8173656k free, 1482452k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18186 dsadmwl 20 0 2313m 787m 11m S 2.0 20.6 82:17.19 java
17941 dsadmwl 20 0 2313m 787m 11m S 0.0 20.6 0:00.00 java
17943 dsadmwl 20 0 2313m 787m 11m S 0.0 20.6 0:01.25 java
我希望PID值是十六进制的。所有其他信息都需要保留。下面的bash脚本一次读取一行输出,如果以数字序列开头,则将其转换为十六进制。所有其他信息都直接反映出来
#!/bin/bash
while read -r zLine || [ -n "$zLine" ]; do
declare zDeci="$(sed -nE 's/^([0-9]*).*/\1/p' <<< "$zLine")"
[ -n "$zDeci" ] \
&& printf '%x%s\n' "$zDeci" "${zLine:${#zDeci}}" \
|| printf '%s\n' "$zLine"
done < <(your-command-which-makes-output)
!/bin/bash
在阅读时-r zLine | |[-n“$zLine”];做
declare zDeci=“$(sed-nE's/^([0-9]*)./\1/p)”这太棒了。它完全按照我的预期工作。非常感谢您在注释中提供的指针。