Bash 如何使用简单的命令将两行(head+;filtered content)作为输出?

Bash 如何使用简单的命令将两行(head+;filtered content)作为输出?,bash,grep,Bash,Grep,我想得到输出中的头部 ps lax |head -n 1 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 和过滤后的行: ps lax |grep openbox |grep -v grep 0 1000 1608 1513 20 0 206408 20580 SyS_po S ? 0:00 openbox --config-file /home/d

我想得到输出中的头部

ps  lax |head -n 1
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
和过滤后的行:

ps  lax |grep openbox |grep -v grep
0  1000  1608  1513  20   0 206408 20580 SyS_po S    ?          0:00 openbox --config-file /home/debian9/.config/openbox/lxde-rc.xml
我希望得到的是以下两行:

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1608  1513  20   0 206408 20580 SyS_po S    ?          0:00 openbox --config-file /home/debian9/.config/openbox/lxde-rc.xml
如何用一个简单的命令将两行(head+过滤内容)作为输出

ps lax | grep -e '^F' -e '[o]penbox'


对于复合条件,您使用awk,而不是grep:

ps  lax | awk 'NR==1 || /[o]penbox/'

请注意,@Cyrus and my answers中惯用的
[o]
用法,因此regexp与该命令本身不匹配,因此您不需要使用regexp显式删除该命令名。

Ed使用
awk
加上
NR==1
条件的答案是最佳解决方案

为了完整起见,让我展示一下
tee
>(command)
的用法

例如:要显示除bash以外的当前进程(使用
ps
),同时保留
ps
标题行,请按以下方式使用
tee

$ ps | tee >(sed -n 1p) >(sed 1d | grep -v bash) > /dev/null
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     5782    2514    3792       1940  cons2    1415878 12:21:38 /usr/bin/ps
     9998       2    9708       9708  ?        1415878 12:38:41 /usr/bin/ssh-agent
$
此处
tee
将输出重定向到两个进程:

  • 一个用于显示第一行(第一个
    sed-n 1p
  • 然后另一个过滤第一行(另一个
    sed 1d
    ),并使用
    grep
    进行额外过滤

最后,为了防止
tee
转储原始的
ps
输出,stdout被重定向到
/dev/null

查看更新的答案,关于编辑,请尝试
printf
而不是
echo
IMHO,因为通过某些内容区分第一行有点限制(在这种情况下,匹配开头的“F”)。例如,
ps
输出和列因系统而异,甚至因我们自己选择的列而异。我建议采用更通用的解决方案。感谢您的提示。以下内容可以避免此问题,因为第一行不是以数字开头:
ps-lax | grep'^[^0-9]\\[o]penbox
$ ps | tee >(sed -n 1p) >(sed 1d | grep -v bash) > /dev/null
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     5782    2514    3792       1940  cons2    1415878 12:21:38 /usr/bin/ps
     9998       2    9708       9708  ?        1415878 12:38:41 /usr/bin/ssh-agent
$