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. まとめ
入力が面倒なコマンドがあったら、今回の方法でシンプルなコマンドにして使いましょう。