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
$