これはPerlであり、これを行う方法はたくさんあります。最も簡単なのは、おそらくです:
#!/usr/bin/perl
use strict;
use warnings;
my $regex = shift;
print grep { /$regex/ } `cat ~/.bash_history`;
これは、シェルコマンドcat ~/.bash_history
を実行し、行のリストとして出力を返します。その後、行のリストはgrep
関数によって消費されます。 grep
関数は、すべての項目に対してコードブロックを実行し、真の戻り値を持つものだけを返します。したがって正規表現と一致する行だけを返します。
このコードはそれと間違っていくつかのものを持っている(それはcat
を実行するためのシェルを起動します、それはなど、$regex
は危険なものが含まれている可能性があり、メモリ内のファイル全体を保持している)が、安全な環境での速度/メモリISN」問題は、それはすべて悪いことではありません。
優れたスクリプトは、このスクリプトは、それが簡単にそれは後日、使用している歴史のファイルに変更できるようにすることconstant
を使用しています
#!/usr/bin/perl
use strict;
use warnings;
use constant HISTORYFILE => "$ENV{HOME}/.bash_history";
my $regex = shift;
open my $fh, "<", HISTORYFILE
or die "could not open ", HISTORYFILE, ": $!";
while (<$fh>) {
next unless /$regex/;
print;
}
だろう。履歴ファイルを直接開き、1行ずつ読み込みます。つまり、ファイル全体が決してメモリに格納されません。ファイルが非常に大きい場合、これは非常に重要です。それでも、$regex
には有害な正規表現が含まれているかもしれないという問題がありますが、あなたが実行している人ならば、あなた自身が責任を負うだけです(しかし、私は外部のユーザにこのようなコマンドウェブアプリケーション)。
なぜperlスクリプトを使用してunixコマンドを自動化するのですか?なぜシェルスクリプトではないのですか?単純なエイリアス。あなたが救うのはすべて "歴史| grep"と書いてありますので、私が見ているところでは、価値は限られています。 – TLP