如何使用grep grep标题和模式

时间:2014-03-06 08:57:53

标签: linux bash

我只需使用grep,

来grep标题和特定模式

例如

命令“ps” 输出

  PID TTY          TIME CMD
10280 pts/16   00:00:00 ps
32463 pts/16   00:00:00 bash 

我怎么能像32463一样grep标题和模式,所以输出应该是

  PID TTY          TIME CMD
32463 pts/16   00:00:00 bash 

有一点是解决方案应该是通用的,这意味着它应该适用于所有具有标题的命令

5 个答案:

答案 0 :(得分:1)

像这样:

ps | ( read -r head; printf '%s\n' "$head"; grep bash )

这可以推广到其他命令,例如

( read -r head; printf '%s\n' "$head"; sort -k4n ) <input.csv >input-sorted-4n.csv

您可以将其封装到名为keepheader的脚本中:

#!/bin/sh
read -r head
printf '%s\n' "$head"
exec "$@"

使用

ps | keepheader grep bash
keepheader sort -k4n <input.csv >input-sorted-4n.csv

或者甚至

keepheader keepheader grep foo <<HERE
Header with underlines
------ ---- ----------
Cat    food Whiskas
Mouse  bait Cheese
HERE

(实际上可能会让脚本接受一个最佳数字参数来指定要保留的标题行数;我将此作为练习留给读者。)

答案 1 :(得分:1)

  1.   

    我如何grep标题和模式

    你可以试试这个

    ps | grep -e 'PID\|32463'
    
  2.   

    解决方案应该是通用的,这意味着它应该适用于所有具有标题的命令

    grep几乎不可能满足此要求,因为不同的命令具有不同的标题,因此无法分配正则表达式来匹配所有标题。

    但您可以使用以下命令来实现目标:

    command | perl -e 'while(<STDIN>) { print if $. == 1 or m/$ARGV[0]/ }' pattern
    

    如果日常使用过于繁琐,可以将其放在自定义脚本中,例如my-grep,然后将该脚本放在$PATH中,然后就可以像正常一样使用该脚本命令:

    command | my-grep pattern
    

答案 2 :(得分:0)

我建议sed

sed -n "1p;/$pattern/p"

答案 3 :(得分:0)

试试这个:

ps | head -1; ps | grep bash

答案 4 :(得分:0)

如果不使用grep,您可以获得ps选项

的输出
  $ps -p 32463

     -p  Select by PID.
         This selects the processes whose process ID numbers appear in pidlist. Identical to p and --pid.