Unix 如何删除top(1)输出每行的第二个字?

Unix 如何删除top(1)输出每行的第二个字?,unix,sed,Unix,Sed,我有一个格式化的进程列表(顶部输出),我想删除不必要的信息。例如,如何删除每行的第二个单词+空格 例如: 1 a hello 2 b hi 3 c ahoi 我想删除b和c。使用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 seco

我有一个格式化的进程列表(顶部输出),我想删除不必要的信息。例如,如何删除每行的第二个单词+空格

例如:

1 a hello
2 b hi
3 c ahoi

我想删除b和c。

使用
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
选项将结果保存回
文件
-r
用于扩展正则表达式,检查
man
,因为它可能是
-E
,具体取决于实现

或使用
awk
仅打印指定列:

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

这两种解决方案都有各自的优点,
awk
解决方案适合固定数量的小列,但您需要使用临时文件来存储更改
awk'{print$1,$3}'文件>tmp;mv tmp文件
其中作为
sed
解决方案更为灵活,因为列不是问题,
-i
选项进行在位编辑。

您可以使用
剪切
命令

 cut -d' ' -f2 --complement file
--补码
的作用是相反的。i、 e.使用
-f2
选择第二个字段。如果打印除第二个字段外的所有字段,则使用
--complete
。当字段数量可变时,这非常有用

GNU的cut有一个选项
——complete
。如果,
--complete
不可用,则以下操作相同:

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

含义:打印第一个字段,然后从第三个字段打印到最后,即排除第二个字段并打印其余字段。 编辑:

如果您喜欢
awk
您可以这样做:
awk{$2=”“;打印$0}'文件


这会将第二行设置为空并打印整行(一行一行)。

使用
sed
单向打印:

sed 's/ [^ ]*//' file
结果:

1 hello
2 hi
3 ahoi
使用Bash:

$ while read f1 f2 f3
> do
>  echo $f1 $f3
> done < file
1 hello
2 hi
3 ahoi
读取f1和f3时,
$
>做
>回声$f1$f3
>完成<文件
你好
2嗨
3阿霍伊
这可能适合您(GNU-sed):


使用
ps
并使用
--format
自定义输出,这也是可行的,谢谢。事实上,减少顶部输出而不是使用ps似乎有点愚蠢。很好的解释,awk似乎更容易使用。我最初想到的是awk。但对于可变字段数,可能需要使用
NF
进行循环。已经+1'd:)@KingsIndian我已经添加了一些关于两者优点的额外信息。sed的
-I
选项确实创建了一个临时文件。但是,用户不能直接看到它。使用GNU awk,您可以使用gensub(),使用方式与上面的sed命令相同。
awk'{$2=”“;print}'文件
留下了额外的空间。@sudo_O没错。我想只要字段之间用空格隔开,不管字段用于什么目的都可以。是的,只是需要注意一下。我从来没有听说过补码,这是GNU吗?使用常规剪切,您只需执行
cut-d'-f1,3-
@EdMorton是的,
--complete
在GNU/Linux中。不确定其他操作系统中是否有等效选项。无论如何,我用这个更新了我的答案。感谢您指出:)+1教我您可以指定在
sed
Fingers crossed中出现的文件不包含+、?、*或任何其他shell全局字符,或者如果包含,您的目录中没有任何与模式匹配的文件。总是引用你的变量,除非你有充分的理由。祈祷你的文件不包含任何反斜杠。当IFS=read-r line时,请始终将循环编写为
,除非您有充分的理由不这样做。最后,编写shell循环很少是正确的答案。
sed -r 's/\S+\s+//2' file