背景:有时我使用ps aux | grep process_name
来找出某个进程的某些统计信息。但我不记得ps输出的标题。所以,我需要做的:将输出重定向到两个进程并合并
ps aux | tee 1.txt | grep process_name > 2.txt
cat 1.txt | head -1 | cat - 2.txt
所以我的问题是:有没有办法做到这一点没有两个临时文件,最好使用一个命令行而不是两行呢?
背景:有时我使用ps aux | grep process_name
来找出某个进程的某些统计信息。但我不记得ps输出的标题。所以,我需要做的:将输出重定向到两个进程并合并
ps aux | tee 1.txt | grep process_name > 2.txt
cat 1.txt | head -1 | cat - 2.txt
所以我的问题是:有没有办法做到这一点没有两个临时文件,最好使用一个命令行而不是两行呢?
最简单的方法就是使用比grep
更聪明的东西。例如:
ps aux | perl -ne 'print if $. == 1 || m/process_name/'
将打印ps aux
的第一行的输出,加匹配process_name
任何线(这是一个Perl正则表达式—比POSIX BRE的更强大的,因此也更复杂,但我不如果你只是寻找一个进程的名字,你会发现任何惊喜)。
编辑补充:对于这个问题,因为ps aux
的标题是不可能运行之间改变,你可以写:
ps aux | head -1 ; ps aux | grep process_name
虽然我不知道是否仍算作“一个命令行“。 :-)
更多选项:由于您不喜欢上述内容,因此还有更多。这人会直接读取和打印第一线,然后离开,其余为grep
读取和处理:
ps aux | ((read -r LINE ; echo "$LINE") ; grep process_name)
这一个会导致每行写入两个标准输出(文件描述符1
)和一个自定义文件描述符(3
);然后head
得到标准输出,而grep
得到什么写入到自定义文件描述:
((ps aux | while read -r LINE ; do echo "$LINE" ; echo "$LINE" 1>&3 ; done | head -1 1>&4) 3>&1 | grep process_name) 4>&1
那一个是我知道的做你问什么—至少是最普遍的方式,只用Bash内置函数和特性—,但正如你所看到的那样,它很笨拙,这就是为什么当你不需要这种方法的全部功能时,我推荐更简单的方法。而且,最后一个不再保证标题首先出现;在我的系统上,head
的输出似乎始终在之后输出grep
。 (我想这可以通过交换head
和grep
命令的位置来解决,但就我所知,这仍然不可靠,而且当我刚刚尝试时,它似乎有奇怪的效果。)
或者,因为我从来不记得Perl或awk的不看它:
ps aux | head -n 1 && ps aux |grep process_name
这种情况在这种情况下可行,但如果它不是'ps aux'但是其他一些命令不能运行两次,或者只是产生两次运行的不同结果呢? – 2012-03-23 20:56:41
当你说“......不能运行两次”时,我不确定你的意思。如果第一部分失败了,你的意思是?第一部分的意图只是吐出标题(应该使用lsof之类的东西) - 它不应该失败,除非我错过了某些东西... – rutgersmike 2012-03-23 21:25:01
另一个肮脏的伎俩是要记住的是,头部与'USER'
开始做
ps aux | grep -E 'USER | process_name'
这也将显示grep
命令本身:)
...或者ps aux | grep -E'^ USER | 。{40,} process_name'' ...不应该碰到任何虚假的其他行,因为它们将以用户名开头。除非你有一个名为USER的用户。 。{40,}应该(在我知道的任何'ps'上)错过了名字与该过程相匹配的用户的错误肯定(COMMAND列一直在我的经验的第40列) – BRFennPocock 2012-03-23 21:15:31
或
ps aux | egrep "(^USER +PID)|^process_name"
sed
将不正是你想要什么:
ps aux | sed -n -e '1 p; /PROCESS_NAME/p'
的sed
命令行:
-n
只打印指定的行
-e
执行以下脚本
1 p
打印第一
含PROCESS_NAME
使用过程中的姓名(或名称)与-C
ps u -C java -C totem
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
stefan 16878 0.1 10.5 429036 107868 pts/7 Sl+ 12:51 0:24 /opt/java/bin/java -Xmx256M -Xms32M -Xbootclasspa
stefan 25791 0.5 3.8 202800 38984 ? Sl 17:45 0:16 totem file:///home/stefan/Desktop/scala/dritte/dl
我希望这不会在Linux上唯一的工作个;
命令分隔
/PROCESS_NAME/p
打印行。 :)
我总是很难过,看到有多少人不知道(或使用)的选项ps - 也许有太多?它总是ps | grep x
。 :)
这看起来不错,我会接受它,如果没有其他答案。但是还有其他一些情况我想将输出分成两个或多个进程,并希望稍后合并输出。我想知道是否有更多BASH的方式来做到这一点。 – 2012-03-23 20:55:09
@icando:我添加了更多选项,其中包括将输出分成两个或多个进程的选项。 。 。但它有点混乱! – ruakh 2012-03-23 21:08:24
这个很棒! – 2012-03-23 21:23:14