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