grepをパイプしてヘッダを維持する方法は?

grepをパイプしてヘッダを維持する方法は?

以下の例では正しい項目を選択しましたが、タイトルはなく、その逆も同様です。どのように両方を持つことができますか?

$ ps aux | grep 'gpart'
erwann    200603  0.0  0.0   2608    72 pts/3    S    12:57   0:00 /bin/sh /usr/sbin/gparted
root      200608  0.0  0.0   2608  1056 pts/3    S    12:57   0:00 /bin/sh /usr/sbin/gparted
root      200693  0.0  0.0   2608    68 pts/3    S    12:57   0:00 /bin/sh /usr/lib/udisks2/udisks2-inhibit /usr/sbin/gpartedbin
root      200700  1.9  0.2 264960 18620 pts/3    SLl  12:57   8:31 /usr/sbin/gpartedbin
root      202327 99.8  0.0   2520    64 pts/3    R    13:36 400:07 gpart -s 512 /dev/sdc
erwann    214723  0.0  0.0   9032   716 pts/4    S+   20:17   0:00 grep --color=auto gpart
$ ps aux | tee >(head -n1) >(grep 'gpart') > /dev/null
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

ベストアンサー1

固定文字列を検索するには、gpartmultimatch バリアントを使用して、grep最初の行自体だけでなく、一致する行を選択できます。

ps aux | grep -E '^USER|[g]part'

awkまたは、最初の行とパターンに一致するすべての行を出力するソリューションを使用してください。

ps aux | awk 'NR==1 || /[g]part/'

どちらの場合も、最初の文字は角gpart括弧で囲まれています。これはそれ自体grepがブロックまたは一致するawkためです。 (正規表現では、単一の文字を含む角括弧は実際には機能せず、単に単一の文字自体を表します。)

はい(ps質問に表示される出力に基づいています)

ps aux | grep -E '^USER|[g]part'
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
erwann    200603  0.0  0.0   2608    72 pts/3    S    12:57   0:00 /bin/sh /usr/sbin/gparted
root      200608  0.0  0.0   2608  1056 pts/3    S    12:57   0:00 /bin/sh /usr/sbin/gparted
root      200693  0.0  0.0   2608    68 pts/3    S    12:57   0:00 /bin/sh /usr/lib/udisks2/udisks2-inhibit /usr/sbin/gpartedbin
root      200700  1.9  0.2 264960 18620 pts/3    SLl  12:57   8:31 /usr/sbin/gpartedbin
root      202327 99.8  0.0   2520    64 pts/3    R    13:36 400:07 gpart -s 512 /dev/sdc

おすすめ記事