履歴ファイルをgrepingするときに一意のコマンドの最後の行番号を取得する方法は?

履歴ファイルをgrepingするときに一意のコマンドの最後の行番号を取得する方法は?

私は以前のコマンド、特に長くてパラメータの多いコマンドの履歴ファイルに依存しています。コマンドとその行番号()を見つけたら、nnそれを使用して!nn実行します。私はインラインリバース検索を実行するよりも、検索の完全な出力を見るのが好きです。

そのために、私は検索を通してhistory | grep some_text

ただし、重複した項目が原因で多くの出力が発生する傾向があります(行番号のみ)。私の歴史が成長するにつれて、時間の経過とともに状況はさらに悪化します。

!呼び出しコマンド演算子で使用できる一意のコマンドのリストをどのように取得できますか?

私は歴史| uniqlo | grep some_textを試しましたが、行番号のため機能しません。

これを行い、history | cut -b8- | uniqコマンドのみを表示できます。
ところで追加すると5359\253'sortが出て行番号もなくなります、本当に欲しい命令ですね$ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were5360 x'.
!line-number

理想的には、私が仕事をするたびにこれが起こることを願っていますhistory | grep。私は多くのことをしていてエイリアスがあるので、hg='history | grep 'どんな解決策でも追加できます。

あまり理想的ではありませんが、まだ興味深いのは、実際には履歴ファイルエントリを一意にする一時プログラムを実行して(行番号の問題を処理することによって)、特定のコマンドの最新の履歴コマンドのみを維持する機能です。おそらく他の行を削​​除すると思われます。しかし、このように履歴ファイルから行を削除すると、システムがファイルを使用する方法は中断されますか?

答え1

あなたは言うことができます:

history | awk '{$1=""; sub("^ ", "", $0)}1' | sort -u

から一意の項目のリストを取得しますhistory

HISTCONTROLただし、重複を防ぐように設定することもできますhistory

HISTCONTROL=ignoredups:erasedups

から引用手動:

HISTCONTROL

コマンドが履歴リストに保存される方法を制御するコロンで区切られた値のリスト。値リストに " ignorespace"が含まれている場合、空白文字で始まる行は履歴リストに保存されません。値が " ignoredups"の場合、前の履歴エントリと一致する行は保存されません。 「値」は「」と「」ignorebothの略です。値が" "の場合、現在の行と一致するすべての前の行は、行を保存する前に履歴リストから削除されます。上記のリストにない値は無視されます。設定されていない場合、または有効な値が含まれていない場合、シェルパーサーによって読み取られたすべての行は値に従って履歴リストに保存されます。複数行の複合コマンドの2行目以降の行はテストされず、値に関係なく履歴に追加されます。ignorespaceignoredupserasedupsHISTCONTROLHISTIGNOREHISTCONTROL

答え2

.bash_historyコマンドを使用する代わりにファイルを解析できますhistory。例は次のとおりですawk

awk '!x[$0]++' .bash_history | nl

ただし、@devnullの答えと同様に、HISTCONTROL重複を避けるためにコマンドと次のコマンドを使用する必要がありますspaces

HISTCONTROL=ignoreboth

答え3

私のシステムにはuniqフィールドをスキップするオプションがあります。

history | uniq -f 1

行番号を含む一意の履歴のリストを提供します。

私のバージョン:

uniq (GNU coreutils) 8.15

ただし、これは同時冗長性を無視するため、実際に記録出力をソートしてから次のことを行いますuniq

history | sort -k 2 | uniq -f 1 | sort -n

最後のソートはオプションで、ソートされた一意の項目をコマンド番号で並べ替えます。

関連情報