2012-12-06 73 views
5

我有一個格式化的進程列表(頂部輸出),我想刪除不必要的信息。我如何刪除例如每行的第二個單詞+空格。如何刪除top(1)輸出每行的第二個單詞?

實施例:

1 a hello 
2 b hi 
3 c ahoi 

Id喜歡刪除b和c。

+2

使用'ps'並使用'--format'自定義輸出 – artbristol

+0

這也是可行的,謝謝 –

+0

事實上,減少頂級輸出而不是使用ps似乎是一種愚蠢的現在 –

回答

10

您可以使用cut命令。

cut -d' ' -f2 --complement file 

--complement是相反的。即與-f2第二場被選中。與--complement如果打印除第二個以外的所有字段。當你有可變數量的字段時,這很有用。

GNU的切割有選項--complement。在情況下,--complement不可用的話,下面的做同樣的:

切-d」'-f1,3-文件

含義:打印第一場,然後打印從第三到結束,即不包含第二字段並打印剩下的部分。 編輯:

如果你喜歡awk你可以這樣做:awk {$2=""; print $0}' file

這臺第二清空並打印整行(一個接一個)。使用sed

+0

好的解決方案+1。 –

+2

'awk'{$ 2 =「」; print}'file'會留下額外的空間。 –

+0

@sudo_O沒錯。我猜只要字段被空格分開,這對於字段用於任何目的都是可以的。 –

5

使用sed替代第二列:

sed -r 's/(\w+\s+)\w+\s+(.*)/\1\2/' file 
1 hello 
2 hi 
3 ahoi 

說明:

(\w+\s+) # Capture the first word and trailing whitespace 
\w+\s+ # Match the second word and trailing whitespace 
(.*)  # Capture everything else on the line 

\1\2  # Replace with the captured groups 

注:使用-i選項保存結果反饋給file-r是擴展的正則表達式,檢查man,因爲它可能是-E取決於實施。

或者使用awk僅打印指定的列:

$ awk '{print $1, $3}' file 
1 hello 
2 hi 
3 ahoi 

這兩種解決方案都存在優點,該awk解決方案是一個小的固定數列的不錯,但你需要使用一個臨時文件來存儲更改awk '{print $1, $3}' file > tmp; mv tmp file其中sed解決方案更靈活,因爲列不是問題,並且-i選項執行了編輯。

+0

很好的解釋,awk似乎是更容易使用的人。 –

+0

我最初以爲awk。但是,對於可變數量的字段,可能需要使用「NF」循環。已經爲此+1了:) –

+0

@KingsIndian我已經爲兩者的優點添加了一些額外的信息。 –

3

方式一:

sed 's/ [^ ]*//' file 

結果:

1 hello 
2 hi 
3 ahoi 
+0

這一個很好,但我認爲sed比例如慢。 awk –

3

使用bash:

$ while read f1 f2 f3 
> do 
> echo $f1 $f3 
> done < file 
1 hello 
2 hi 
3 ahoi 
+1

手指越過你的文件不包含+,?​​,*或任何其他shell匹配的字符,或者如果它沒有,你的目錄中沒有任何匹配模式的文件。除非你有充分的理由,否則一定要引用你的變量。手指也劃過你的文件不包含任何反斜槓。除非你有很好的理由,否則總是把你的循環寫成'while IFS = read -r line'。最後 - 編寫shell循環很少是正確的答案。 –

3

這可能會爲你工作(GNU SED):

sed -r 's/\S+\s+//2' file 
+0

+1教我,你可以指定'sed'中發生了什麼 –

相關問題