我有一个格式化的进程列表(顶部输出),我想删除不必要的信息。例如,如何删除每行的第二个单词+空格。
例子:
1 a hello
2 b hi
3 c ahoi
我想删除 ab 和 c。
你可以使用cut
命令。
cut -d' ' -f2 --complement file
--complement
做相反的事情。即-f2
选择了第二个字段。并使用--complement
if 打印除第二个以外的所有字段。当您有可变数量的字段时,这很有用。
GNU 的 cut 有选项--complement
. 如果,--complement
则不可用,则以下操作相同:
剪切 -d' ' -f1,3- 文件
含义:打印第一个字段,然后从第三个字段打印到末尾,即排除第二个字段并打印其余字段。 编辑:
如果你愿意awk
,你可以这样做:awk {$2=""; print $0}' file
这会将第二个设置为空并打印整行(一个接一个)。
用于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
选项将结果保存回file
,-r
用于扩展正则表达式,检查man
可能-E
取决于实现。
或用于awk
仅打印指定的列:
$ awk '{print $1, $3}' file
1 hello
2 hi
3 ahoi
两种解决方案都有优点,该awk
解决方案适用于少量固定数量的列,但您需要使用临时文件来存储更改awk '{print $1, $3}' file > tmp; mv tmp file
,因为该sed
解决方案更灵活,因为列不是问题,并且-i
选项在地方。
一种使用方式sed
:
sed 's/ [^ ]*//' file
结果:
1 hello
2 hi
3 ahoi
使用重击:
$ while read f1 f2 f3
> do
> echo $f1 $f3
> done < file
1 hello
2 hi
3 ahoi
这可能对您有用(GNU sed):
sed -r 's/\S+\s+//2' file