我只需使用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
有一点是解决方案应该是通用的,这意味着它应该适用于所有具有标题的命令
答案 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)
我如何grep标题和模式
你可以试试这个
ps | grep -e 'PID\|32463'
解决方案应该是通用的,这意味着它应该适用于所有具有标题的命令
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.