Linux:sed命令如何过滤除first和last之外的所有字段?

时间:2011-12-14 20:13:44

标签: linux bash unix sed awk

我正在尝试制作这个过滤来自ps的行的脚本.. 它几乎完成的脚本,只缺少这一行。

例如,这是我需要过滤的一行:

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

我需要这样看起来像这样:

803 atd

我已经尝试了所有的东西,但似乎一个简单的sed参数不能这样做..如果sed检测到必须被删除的东西,它会删除它后面的整行。 如果我错了,请纠正我,谢谢你的时间..

3 个答案:

答案 0 :(得分:5)

好像您正在寻找awk

awk '{print $1 " " $NF}'打印每个输入行的第1个字段和最后一个字段。 NF实际上是一些字段。

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

答案 1 :(得分:2)

实际上,你可以用perl或awk更轻松地做到这一点,......

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

    awk '{print $1 " " $6}'            # first and sixth field

答案 2 :(得分:2)

对sed:

尝试此命令
sed 's/ .* / /'

尽可能采用第一个空格,然后是最后一个空格,并用一个空格替换它们。

如果你可以在字符串的开头或结尾有空格,那么你需要更加小心你的sed命令。它在这里并不那么优雅:

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

这会捕获非空格字符并将它们放在输出流中。如果没有像GNU sed这样的扩展sed,则需要将[^ ]\+的出现位替换为[^ ][^ ]*

话虽如此,awk显然是这项工作最优雅的工具。