這是Perl,有很多方法可以做到這一點。最簡單的大概是:
#!/usr/bin/perl
use strict;
use warnings;
my $regex = shift;
print grep { /$regex/ } `cat ~/.bash_history`;
這將運行shell命令cat ~/.bash_history
和返回輸出線路的列表。行列表然後被grep
函數使用。 grep
函數爲每個項目運行代碼塊並僅返回具有真實返回值的代碼塊,因此它只會返回與正則表達式匹配的行。
此代碼有幾件事情錯了,(它產生一個shell來運行cat
,它在內存中保存整個文件,$regex
可能包含危險的事情,等),但在一個安全的環境中,速度/內存ISN」這個問題並不是那麼糟糕。
一個更好的劇本是
#!/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;
}
此腳本使用constant
,使其更容易改變它在後一日期使用哪個歷史文件。它直接打開歷史文件並逐行讀取它。這意味着整個文件永遠不會在內存中。如果文件非常大,這可能非常重要。它仍然有問題,$regex
可能包含一個有害的正則表達式,但只要你是運行它的人,你只能責怪自己(但我不會讓外部用戶通過這樣的命令傳遞參數,比如說Web應用程序)。
爲什麼使用perl腳本來自動執行unix命令?爲什麼不是一個shell腳本?或者一個簡單的別名。雖然你所節省的只是寫「歷史| grep」,所以我看到它的方式,價值是有限的。 – TLP