ksh cmd one-liner 一次grep多个PID

问题描述

我有一堆需要检查 cpu 亲和力的进程,所以我得到了一个 liner:

for i in `ps -Fae | grep proc_name| awk '{print $2}'`; do taskset -acp $i;done

但是我有一个问题,taskset 也显示了所有子进程的 pid,所以我得到了大量的数字以及它们的 cpu 亲和性。

我想将上述行通过管道传输到 egrep 'pid1|pid2' 中,以便过滤掉所有子进程。

我尝试这样做: for i in `ps -Fae | grep proc_name| awk '{print $2}'`; do taskset -acp $i;done | xargs egrep 'ps -Fae | grep proc_name| awk '{print $2}''

但我的 ksh shell 根本不喜欢 awk 括号。

所以我有两个问题:

  1. 可以将任务集更改为仅显示父 pid 吗?
  2. 如何写最后一点,我只对父 pid 进行 egrep?

解决方法

如果它是 bash 的话,听起来你是在要求这种语法(请参阅 https://mywiki.wooledge.org/BashFAQ/001,我不确定 ksh 的等效稳健读取循环语法是什么):

while IFS= read -r i; do
    taskset -acp "$i"
done < <(ps -Fae | awk '/proc_name/{print $2}') |
grep -E 'pid1|pid2'

但这很脆弱,例如如果 pid1 出现为某个其他 pid 的子字符串。如果您编辑问题以提供简洁、可测试的示例输入(即 ps -Fae 的输出和 taskset 的相关输出)以及预期输出,那么我们可以提供更多帮助。

,

循环内的过滤器:

for i in $(ps -Fae | grep proc_name| grep -v grep | awk '{print $2}'); do
   taskset -acp "$i" | grep "$i"
done