使用sed或awk删除除每行特定索引的内容之外的所有内容

时间:2012-06-09 02:37:49

标签: bash sed indexing awk

例如,

当我输入ps -wef时,

在bash中我会得到:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 20:06 ?        00:00:01 /sbin/init
root         2     0  0 20:06 ?        00:00:00 [kthreadd]
root         3     2  0 20:06 ?        00:00:00 [ksoftirqd/0]
root         6     2  0 20:06 ?        00:00:00 [migration/0]
root         7     2  0 20:06 ?        00:00:02 [watchdog/0]
root         8     2  0 20:06 ?        00:00:00 [cpuset]
root         9     2  0 20:06 ?        00:00:00 [khelper]
root        10     2  0 20:06 ?        00:00:00 [kdevtmpfs]
root        11     2  0 20:06 ?        00:00:00 [netns]
root        12     2  0 20:06 ?        00:00:00 [sync_supers]
root        13     2  0 20:06 ?        00:00:00 [bdi-default]
root        14     2  0 20:06 ?        00:00:00 [kintegrityd]
root        15     2  0 20:06 ?        00:00:00 [kblockd]
root        16     2  0 20:06 ?        00:00:00 [ata_sff]
root        17     2  0 20:06 ?        00:00:00 [khubd]
root        18     2  0 20:06 ?        00:00:00 [md]
root        21     2  0 20:06 ?        00:00:00 [khungtaskd]

我知道要保留哪一列,例如我想保留第二列是PID列,最终结果将是:

1 2 3 6 7 8 9 10 11 12 13 14 15 16 17 18 21

ps的原始结果的第一行将被删除。

如何使用sed或awk获取最终结果?

谢谢。

3 个答案:

答案 0 :(得分:4)

 ps -wef | awk 'NR>1 {printf("%s ", $2)}END{printf("\n")'

我希望这会有所帮助。

答案 1 :(得分:3)

您也可以使用-o选项仅获取PID列:

ps --no-headers -eo pid

我放弃了-w-f,因为您认为他们会丢弃对输出的贡献,并使用--no-headers删除了标题。

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed '1d;s/\S*\s*\(\S*\).*/\1/' file

更灵活的方法:

sed '1d;s/\(\(\S*\)\s*\)\{2\}.*/\2/' file

因此,如果您想要TIME列:

sed '1d;s/\(\(\S*\)\s*\)\{7\}.*/\2/' file