2012-03-23 35 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。 :)

相關問題