我想讓這個腳本過濾一條來自ps的線.. 它幾乎完成的腳本,只有這條線丟失。Linux:sed命令如何過濾除第一個和最後一個之外的所有字段?
例如,這裏有一條線,我需要進行過濾:
803 ? (many spaces here) 00:00:00 atd
我需要這個看上去像這樣:
803 atd
我用盡了一切辦法,但似乎一個簡單的sed參數不能這樣做..如果sed檢測到一些必須被擦除的東西,它會刪除它後面的整行。 如果我錯了,並且謝謝你的時間,請糾正我。
我想讓這個腳本過濾一條來自ps的線.. 它幾乎完成的腳本,只有這條線丟失。Linux:sed命令如何過濾除第一個和最後一個之外的所有字段?
例如,這裏有一條線,我需要進行過濾:
803 ? (many spaces here) 00:00:00 atd
我需要這個看上去像這樣:
803 atd
我用盡了一切辦法,但似乎一個簡單的sed參數不能這樣做..如果sed檢測到一些必須被擦除的東西,它會刪除它後面的整行。 如果我錯了,並且謝謝你的時間,請糾正我。
嘗試使用sed的這個命令:
sed 's/ .*//'
它採用第一空間,儘可能多儘可能,然後是最後一個空間,並用一個空格替換它們。
如果在字符串的開頭或結尾可以有空格,那麼您需要對sed命令更加小心。這裏幾乎沒有那麼優雅:
sed 's/^ *\([^ ]\+\).* *\([^ ]\+\) *$/\1 \2/'
這會捕獲非空格字符並將它們放入輸出流中。如果沒有像GNU sed這樣的擴展sed,則需要用[^ ][^ ]*
來替換[^ ]\+
。
這就是說,awk
顯然是這個工作最優雅的工具。
好像你正在尋找一個awk
。
awk '{print $1 " " $NF}'
打印每個輸入行的第一個字段和最後一個字段。 NF
實際上是一些領域。
$> echo "803 ? (many spaces here) 00:00:00 atd" | awk '{print $1 " " $NF}'
803 atd
實際上,你可以用Perl或awk的或許更容易做到這一點,...
perl -ane 'print "$F[0] $F[-1]\n"' # first and last field
awk '{print $1 " " $6}' # first and sixth field
不錯,比我糟糕的`awk`建議更好; Dmitrij明確地抓住了最後一個字段,無論字段的數量如何。 – BRFennPocock 2011-12-14 20:21:23
簡而言之...... +1(雖然`awk'{print $ 1,$ NF}'`會很好):) – 2011-12-14 22:20:54