Linux Bash:用SED提取ps -ef输出中指定内容后的进程名
用SED提取hostname\process1之后的进程名
当然可以用sed来解决这个问题!刚好sed在处理这种基于字符串匹配的内容截取时非常灵活,完美避开ps输出格式不一致导致awk -f 选项不好用的问题。
核心解决方案
根据你要提取的内容(仅进程名,还是完整的后续命令行),有两种常用写法:
1. 仅提取hostname\process1之后的第一个单词(进程名)
ps -ef | sed -n '/hostname\\process1/s/.*hostname\\process1 *//; s/ .*//p'
2. 提取hostname\process1之后的完整命令行
如果你需要保留进程名后面的所有参数,去掉第二个替换操作即可:
ps -ef | sed -n '/hostname\\process1/s/.*hostname\\process1 *//p'
命令拆解(帮你理解每一步)
-n:告诉sed只打印我们明确指定要输出的行,避免输出所有无关的ps结果/hostname\\process1/:只筛选包含hostname\process1的行(注意sed里反斜杠需要转义成\\才能匹配字面量的\)s/.*hostname\\process1 *//:把行开头到hostname\process1的所有内容,以及后面的多余空格全部删除,直接定位到目标内容的起始位置s/ .*//(仅第一种写法):删除第一个空格之后的所有内容,只保留第一个单词(也就是进程名)p:打印处理后的结果行
示例演示
假设ps -ef输出中有这样一行:
john 4567 1234 1 14:32 ? 00:00:02 /usr/local/bin/hostname\process1 nginx -g daemon off;
用第一种命令会输出:
nginx
用第二种命令会输出:
nginx -g daemon off;
为什么这个方法比awk靠谱?
ps的输出格式在不同系统(比如Linux vs BSD)、不同终端环境下可能存在字段数或分隔符的差异,awk的-f依赖固定的字段拆分规则,很容易失效。而sed是基于目标字符串的位置来截取,不管前面的字段怎么变,只要能找到hostname\process1,就能准确提取后面的内容,兼容性更强。
内容的提问来源于stack exchange,提问作者theuniverseisflat
相关产品推荐
相关产品推荐

