Это Perl, есть много способов сделать это.Вероятно, самое простое:
#!/usr/bin/perl
use strict;
use warnings;
my $regex = shift;
print grep { /$regex/ } `cat ~/.bash_history`;
. При этом запускается команда оболочки cat ~/.bash_history
, которая возвращает вывод в виде списка строк.Список строк затем используется функцией grep
.Функция grep
запускает блок кода для каждого элемента и возвращает только те из них, которые имеют истинное возвращаемое значение, поэтому она будет возвращать только те строки, которые соответствуют регулярному выражению.
Этот код имеет несколько ошибок в этом (он запускает оболочку для запуска cat
, он хранит весь файл в памяти, $regex
может содержать опасные вещи и т. д.), но в безопасной среде, где скорость / память не проблема, это не всеэто плохо.
Лучший сценарий будет
#!/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
может содержать вредоносное регулярное выражение, но до тех пор, пока вы выполняете его, вы сами виноваты (но я бы не позволил внешним пользователям передавать аргументы такой команде, как эта,скажем, веб-приложение).