Linux

「よく使うコマンドランキングの表示」を1つのコマンドにする

投稿日:2018年12月7日 更新日:

1. はじめに

UNIX系のOSで、よく使うコマンドを表示するには、以下のコマンドを実行することで実現できます(一例です)。

$ history | awk '{print $2}' | sort | uniq -c | sort -nr

これは、以下の処理をパイプ「|」でつないで実現しています。

  • history コマンドでコマンド実行履歴一覧を出力し、
  • awk '{print $2}' で2列目のみを抽出し、
  • sort でアルファベット順に並び替え、
  • uniq -c で出現回数を行の前に出力しつつ、重複した行は1つにまとめ、
  • sort -nr で、出現回数の降順に並び替える

2. 入力が面倒なコマンドを新たなコマンド(今回は関数)にする

毎回これだけの文字を入力するのは面倒なので、これを 1つのコマンドにしてみましょう。

できれば 表示する行数を引数として指定したいですが、この場合、コマンドエイリアス (alias) だと面倒そうなので、bash の関数にします。

例えば、~/.bashrc ファイルに以下の関数を書きます。

function freq-used-cmd()
{
  local COUNT=10
  local RE='^[0-9]+$'
  if [ $# -eq 1 ] && [[ $1 =~ $RE ]]; then
    COUNT=$1
  fi
  # awk の引数は、historyのフォーマットにより変える
  history | awk '{print $2}' | sort | uniq -c | sort -nr | head -n $COUNT
}
  • (引数が1つ存在する)且つ(引数が数値である)が成り立てば、その引数値を、表示する行数として使用します。
  • 引数が指定されていなかったり、数値でない場合は、デフォルトの10行になります。

3. 作成した関数の実行

これは関数名がコマンド名になるので、以下のように実行することができます。

引数なし

$ freq-used-cmd

引数あり

$ freq-used-cmd 20

4. コマンドの引数も合わせて調べたい

コマンドの引数もつけた状態を調査対象としたいは、例えば awk の部分を以下のように書くと、コマンドの後ろにスペース1文字をはさんで、1つ目の引数($3 の部分です)までが抽出され、処理の対象となります。

awk '{print $2" "$3}'

5. 履歴のフォーマットが異なる場合

今までの例は、実は履歴のフォーマットがデフォルト状態で保存されていることを想定しています。

この場合、history コマンドを実行すると以下のような出力になります。

$ history
    1 pwd
    2 list -a
    3 which python
    4 python -V
    5 grep -n '(' a.txt
    :

しかし、例えば シェル変数 HISTTIMEFORMAT が以下のように設定されていると、

export HISTTIMEFORMAT="%Y-%m-%d (%a) %T "

history コマンドの出力に日付情報が追加されます。

$ history
    1 2018-11-05 (水) 19:45:51 pwd
    2 2018-11-05 (水) 19:45:55 list -a
    3 2018-11-05 (水) 19:46:02 which python
    4 2018-11-05 (水) 19:46:29 python -V
    5 2018-11-05 (水) 19:46:43 grep -n '(' a.txt
    :

こうなると、awk の部分を対応させなければいけません。

上記の出力がされるのであれば、スペースを区切り文字であると考え、左から5番目がコマンドになるため、awk の部分は以下のようになります。

awk '{print $5}'

6. まとめ

入力が面倒なコマンドがあったら、今回の方法でシンプルなコマンドにして使いましょう。

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

xdebug

Ubuntu 16.04.3 LTS + PHP 7.2 の環境に Xdebug をインストールする

2018年1月29日に、Xdebug 2.6.0 (stable版) がリリースされました。 Homestead にもまた Xdebug がデフォルトでインストールされるようになるのではないかと思いま …

Linux

pip install でインストールしたパッケージを使おうとするエラーが発生する

目次1. はじめに2. 環境3. 対処方法4. おわりに 1. はじめに 以下のコマンドで、Python のパッケージをシステムにインストールしたとします。 $ sudo pip install {パ …

CentOS

CentOS Stream release 8 で「Configuration: OptionBinding with id “failovermethod” does not exist」というエラーが表示される

CentOS Stream release 8 で「Configuration: OptionBinding with id “failovermethod” does not exist」というエラーが表示される場合の対応についてです。

Linux

Ubuntu ではユーザー名に大文字が使えません(デフォルトでは)

Ubuntu で ユーザーを追加するには adduser というコマンドを使います。 例えば、”foo” という名前のユーザーを追加するには、以下のコマンドになります。 $ a …

CentOS

CentOS Stream 8 の PHP 7.2 を 7.4 に変更する

CentOS Stream 8 の PHP 7.2 を 7.4 に変更する作業について説明します。