2012-03-23 36 views
0

背景:有时我使用ps aux | grep process_name来找出某个进程的某些统计信息。但我不记得ps输出的标题。所以,我需要做的:将输出重定向到两个进程并合并

ps aux | tee 1.txt | grep process_name > 2.txt 
cat 1.txt | head -1 | cat - 2.txt 

所以我的问题是:有没有办法做到这一点没有两个临时文件,最好使用一个命令行而不是两行呢?

回答

2

最简单的方法就是使用比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。 (我想这可以通过交换headgrep命令的位置来解决,但就我所知,这仍然不可靠,而且当我刚刚尝试时,它似乎有奇怪的效果。)

+0

这看起来不错,我会接受它,如果没有其他答案。但是还有其他一些情况我想将输出分成两个或多个进程,并希望稍后合并输出。我想知道是否有更多BASH的方式来做到这一点。 – 2012-03-23 20:55:09

+0

@icando:我添加了更多选项,其中包括将输出分成两个或多个进程的选项。 。 。但它有点混乱! – ruakh 2012-03-23 21:08:24

+0

这个很棒! – 2012-03-23 21:23:14

1

或者,因为我从来不记得Perl或awk的不看它:

ps aux | head -n 1 && ps aux |grep process_name 
+0

这种情况在这种情况下可行,但如果它不是'ps aux'但是其他一些命令不能运行两次,或者只是产生两次运行的不同结果呢? – 2012-03-23 20:56:41

+0

当你说“......不能运行两次”时,我不确定你的意思。如果第一部分失败了,你的意思是?第一部分的意图只是吐出标题(应该使用lsof之类的东西) - 它不应该失败,除非我错过了某些东西... – rutgersmike 2012-03-23 21:25:01

1

另一个肮脏的伎俩是要记住的是,头部与'USER'开始做

ps aux | grep -E 'USER | process_name' 

这也将显示grep命令本身:)

+0

...或者ps aux | grep -E'^ USER | 。{40,} process_name'' ...不应该碰到任何虚假的其他行,因为它们将以用户名开头。除非你有一个名为USER的用户。 。{40,}应该(在我知道的任何'ps'上)错过了名字与该过程相匹配的用户的错误肯定(COMMAND列一直在我的经验的第40列) – BRFennPocock 2012-03-23 21:15:31

1

ps aux | egrep "(^USER +PID)|^process_name" 
1

sed将不正是你想要什么:

ps aux | sed -n -e '1 p; /PROCESS_NAME/p' 

sed命令行:

  -n只打印指定的行
  -e执行以下脚本
  1 p打印第一
PROCESS_NAME

1

使用过程中的姓名(或名称)与-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。 :)

相关问题