У меня есть файл, someFile
, как это:
$cat someFile
hdisk1 active
hdisk2 active
Я использую этот сценарий оболочки для проверки:
$cat a.sh
#!/usr/bin/ksh
for d in 1 2
do
grep -q "hdisk$d" someFile && echo "$d : ok"
done
Я пытаюсь преобразовать его в Perl:
$cat b.sh
#!/usr/bin/ksh
export d
for d in 1 2
do
cat someFile | perl -lane 'BEGIN{$d=$ENV{'d'};} print "$d: OK" if /hdisk$d\s+/'
done
Я экспортирую переменную d
в сценарии оболочки и получают использование значения %ENV
в Perl. Существует ли лучший способ передать это значение остроте Perl?
Вы можете включить рудиментарные аргументы командной строки с помощью переключателя "s". Для каждого аргумента, начинающегося с тире, определяется переменная. --
указывает, где начинаются ваши аргументы командной строки.
for d in 1 2 ; do
cat someFile | perl -slane ' print "$someParameter: OK" if /hdisk$someParameter\s+/' -- -someParameter=$d;
done
См: perlrun
Передайте его в командной строке, и он будет доступен в @ARGV
:
for d in 1 2
do
perl -lne 'BEGIN {$d=shift} print "$d: OK" if /hdisk$d\s+/' $d someFile
done
Обратите внимание, что оператор shift
в данном контексте удаляет первый элемент @ARGV
, который в данном случае является $d
.
Если у вас возникли проблемы с написанием однострочника, возможно, это немного сложно для одной строки (только мое мнение). Я бы согласился с предложением @FM и все сделал бы на Perl. Прочтите весь файл, а затем проверьте его:
use strict;
local $/ = '' ; # Read in the whole file
my $file = <> ;
for my $d ( 1 .. 2 )
{
print "$d: OK\n" if $file =~ /hdisk$d\s+/
}
Вы можете сделать это циклически, но это займет больше времени. Конечно, это в некоторой степени зависит от размера файла.
Обратите внимание, что все примеры Perl до сих пор выводят сообщение для каждого совпадения - можете ли вы быть уверены, что нет дубликатов?
Это выглядит хорошо, но я бы использовал:
for d in $(seq 1 2); do perl -nle 'print "hdisk$ENV{d} OK" if $_ =~ /hdisk$ENV{d}/' someFile; done
Комбинируя некоторые из предыдущих предложений и добавляя свой собственный сахар, я бы сделал это так:
perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d='[value]' [file]
[value] может быть числом (например, 2), диапазоном (например, 2-4), списком различных чисел (например, 2|3|4) (или почти чем угодно другим, что является допустимым шаблоном) или даже переменной bash, содержащей одно из них, например:
d='2-3'
perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d=$d someFile
и [file] - имя вашего файла (то есть, someFile
).