过滤Linux命令输出

时间:2011-01-17 11:14:11

标签: linux

我需要根据列值获取一行,就像查询数据库一样。我有这样的命令输出,

  

名称ID Mem VCPU状态
  时间(s)

     

Domain-0 0 15485 16 r -----   1779042.1

     

prime95-01 512 1
  -b ---- 61.9

这里我只需要列出状态为“r”的那些行。像这样的东西,

  

Domain-0 0 15485 16
  r ----- 1779042.1

我尝试过使用“grep”和“awk”,但我仍然无法成功。

请帮我解决这个问题。

此致 Raaj

5 个答案:

答案 0 :(得分:9)

可以使用各种工具进行过滤。

如果你只想要带有“r -----”grep的行绰绰有余:

command | grep "r-----"

或者

cat filename | grep "r-----"

引号是可选的,但可能会阻止grep跳过-'s

答案 1 :(得分:2)

尝试:

awk '$5 ~ /^r.*/ { print }' 

像这样:

cat file | awk '$5 ~ /^r.*/ { print }' 

答案 2 :(得分:2)

grep可以为您处理:

yourcommand | grep -- 'r-----'

将(完整)输出保存到文件以便以后分析通常很有用。为此,我使用tee

yourcommand | tee somefile | grep 'r-----'

如果您希望稍后在不重新运行yourcommand的情况下找到包含“-b ----”的行,您可以使用:

grep -- '-b----' somefile

此处不需要cat

我建议在调用--之后设置grep,因为您的模式包含减号,如果减号位于模式的开头,这看起来像{的选项参数{1}}而不是模式的一部分。

答案 3 :(得分:1)

grep解决方案:

command | grep -E "^([^ ]+ ){4}r"

这是做什么的(-E在扩展的正则表达式上切换):

第一个插入符号(^)匹配行的开头。 [^]恰好匹配非空格字符的一个出现,以下修饰符(+)允许它也匹配更多的出现。

与([^] +)中的尾随空格一起分组,它匹配任何非空格字符序列,后跟单个空格。修饰符{4}要求此构造恰好匹配四次。

单个“r”就是您要搜索的文字字符。

简单来说,这可以写成“如果行开始< ^>有四个字符串,后跟一个空格<([^] +){4}>并且下一个字符是,那么这条线匹配。“

Jan Goyvaerts(http://www.regular-expressions.info/quickstart.html)撰写了关于正则表达式的非常好的介绍。

答案 4 :(得分:0)

在linux中通过awk cmd过滤:

首先找到此cmd的列并存储file2: -

  

awk' / Domain-0 0 15485 /' file1> file2

<强>输出: -

Domain-0 0 15485 16  r ----- 1779042.1

在文件2中的awk cmd之后

: -

  

awk&#39; {打印$ 1,$ 2,$ 3,$ 4,&#34; \ n&#34;,$ 5,$ 6}&#39; file2的

最终输出: -

Domain-0 0 15485 16

r ----- 1779042.1