回答:
それはむしろあなたが「コマンド」によって何を意図するかに依存します。1つの観点から見ると、コマンドはコマンドラインから呼び出される実行可能ファイルにすぎないためls
、ls -alh /tmp/foo/bar/*tar.bz
どちらもコマンドls
です。別の見方では、コマンドはその部分の合計であり、上記の例は2つの異なるコマンドであることを意味します。
履歴内で完全に一意のコマンドを数えることが目的である場合は、次のコマンドを実行できます。 history | cut -d' ' -f4- | uniq -c | sort -n
これはDebianシステムでテストされていることに注意してください。historyコマンドの出力構文は少し異なる場合があります。コマンドの数値「4」を調整して、代替列を選択します。
引数なしの最初のコマンドのみを検討する場合は、次のコマンドを実行できます。 history | cut -d' ' -f4- | cut -d' ' -f1 | uniq -c | sort -n
引数を含めるが、その後に続くチェーンまたはパイプされたコマンドは含めない場合は、次のコマンドを実行できます。 history | cut -d ' ' -f4- | cut -d'|' -f1 | uniq -c | sort -n
これらの各コマンドは、最後に出現する頻度が最も高いコマンドの数を数値順に並べ替えます。
sort
前uniq
:のみをチェックし、隣接するラインそれ以来、正確なカウントを取得するにはhistory | cut -d' ' -f4- | cut -d' ' -f1 | sort | uniq -c | sort -n
もう1つのアプローチは、Linuxでも使用可能なBSDプロセスアカウンティングを使用することです(ただし、デフォルトで有効になっているかどうかはわかりません)。基本的に、アカウンティングがアクティブである限り、実行されるすべてのプログラム(およびCPU消費時間などの他のいくつかの測定)のタブを保持します。そこから、いくつかの集約された統計が利用可能です。とりわけ、システムでこれまでに実行されたすべてのプログラムのリストのようなもので、ソートされています。
検索するコマンドはlastcomm
、実行中のログsa
用と集計された統計用です。元の質問に戻ります。問題のシステムがインストールされてからアカウンティングが有効になっていると仮定すると、システムでsa -n
これまでに実行されたすべてのコマンドのリストが(すべてのユーザーに対して)頻度順に表示されます。パイプラインの場合、各部分は分岐する新しいプロセスを構成するため、パイプラインの各部分は個別にカウントされます。
詳細については、Linuxジャーナルにその仕組みを説明する記事があります。私自身、NetBSDガイドからアイデアを得ました。そこにあるより一般的な管理のヒントの多くはNetBSDに固有のものではなく、他のUnixシステムにも当てはまります。