2011-12-14 224 views
2

我想讓這個腳本過濾一條來自ps的線.. 它幾乎完成的腳本,只有這條線丟失。Linux:sed命令如何過濾除第一個和最後一個之外的所有字段?

例如,這裏有一條線,我需要進行過濾:

803 ? (many spaces here) 00:00:00 atd 

我需要這個看上去像這樣:

803 atd 

我用盡了一切辦法,但似乎一個簡單的sed參數不能這樣做..如果sed檢測到一些必須被擦除的東西,它會刪除它後面的整行。 如果我錯了,並且謝謝你的時間,請糾正我。

回答

2

嘗試使用sed的這個命令:

sed 's/ .*//' 

它採用第一空間,儘可能多儘可能,然後是最後一個空間,並用一個空格替換它們。

如果在字符串的開頭或結尾可以有空格,那麼您需要對sed命令更加小心。這裏幾乎沒有那麼優雅:

sed 's/^ *\([^ ]\+\).* *\([^ ]\+\) *$/\1 \2/' 

這會捕獲非空格字符並將它們放入輸出流中。如果沒有像GNU sed這樣的擴展sed,則需要用[^ ][^ ]*來替換[^ ]\+

這就是說,awk顯然是這個工作最優雅的工具。

5

好像你正在尋找一個awk

awk '{print $1 " " $NF}'打印每個輸入行的第一個字段和最後一個字段。 NF實際上是一些領域。

$> echo "803 ? (many spaces here) 00:00:00 atd" | awk '{print $1 " " $NF}' 
803 atd 
+0

不錯,比我糟糕的`awk`建議更好; Dmitrij明確地抓住了最後一個字段,無論字段的數量如何。 – BRFennPocock 2011-12-14 20:21:23

+0

簡而言之...... +1(雖然`awk'{print $ 1,$ NF}'`會很好):) – 2011-12-14 22:20:54

2

實際上,你可以用Perl或awk的或許更容易做到這一點,...

perl -ane 'print "$F[0] $F[-1]\n"' # first and last field 

    awk '{print $1 " " $6}'   # first and sixth field 
相關問題