Comand Line Perl
Использование опции perl -e позволяет вам установить права скрипта
при его выполнении в командной строке.
Перловые опции для командной строки позволяют использовать его
в качестве таких утилит , как sed, awk, vi.
Опция -p делает Perl потоковым редактором , похожим на sed и awk.
При редактировании больших файлов часто бывает выгоднее выполнить команду perl -pe,
чем вызывать для них какой-то редактор.
Редактирование гигабайтных файлов обычным редактором - нонсенс ,
в то время как команда perl -p может оказаться для вас сюрпризом.
Опция p выполняет в таких случаях следующее : берет строку со стандартного входа (STDIN),
присваивает ей имя переменной $_ и выполняет скрипт над ней.
$_ - это специальная переменная , которая при каждой итерации инициализируется по-новой.
По завершению работы скрипт выводит значение $_ на стандартный вывод (STDOUT).
Опция -n работает аналогично опции -p , за исключением того ,
что не выводит на стандартный вывод.
Например , если у вас есть 2 текстовых файла - 123 и 456 , то команда
perl -pe '' 123 456
выведет их друг за другом на экран, т.е. сделает то же самое , что и команда
cat 123 456.
Если в файле 123 нужно заменить кусок , можно выполнить команду
perl -pe 's/искомый текст/заменяемый текст/g' < 123 > 12345
Параметр g говорит перлу заменять все вхождения подстроки,без нее замена произойдет 1 раз.
Порядок использования двойных и одинарных кавычек таков :
вместо одинарных кавычек можно использовать формат
q/Hello world/
вместо двойных
qq/Hello world/
Сравните результат выполнения 2-х команд :
perl -e "$a = qq/Hello World/; print $a" # ошибка
perl -e '$a = qq/Hello World/; print $a' # напечатает "Hello World"
В случае с perl -pe для потоковых операций типа perl -pe 's/here is a typi/here is a typo/g' < inputfile > outputfile, Perl позволяет редактировать файл и делать откат.
Опция -i такой откат делать не позволит - в этом случае лучше иметь где-то
копию оригинального файла.
Можно использовать вместо нее опцию -i.bak для файла , который например называется foo,
при этом старая сохранится как foo.bak
Например :
perl -p -i.old -e 's/oldstring/newstring/g' file
Или так
perl -p -i.old -e 's/oldstring/newstring/g' file*
Рекурсивная замена всех строк :
find . | xargs perl -p -i.old -e 's/oldstring/newstring/g'
Опция -a и -F позволяет разбивать строки на слова и копировать их в массив @F .
В следующем примере будут печататься первые 4 слова из каждой строки ,
при этом будут игнорироваться комментарии - строки , начинающиеся с диеза :
perl -naF 'next if /^#/; print "$F[3]\n"'
Следующий пример извлекает всех пользователей из /etc/passwd.
perl -na -F: -e 'print "$F[0]\n"' < /etc/passwd
Пусть у вас есть несколько HTTP log-файлов , которые называются по шаблону типа
access_log.2005-1-1 ...... access_log.2005-12-31 и вам нужно скопировать их в access_log.old.2005-1-1 ..... access_log.old.2005-12-31:
perl -e 'for(<access_log.*>){$a = $_; s/log/log.old/; `cp $a $_`}'
В этом скрипте конструкция <access_log.*> используется для создания цикла.
В каждом цикле присваивается переменная $_.
В переменной $a сначала сохраняется старый файл ,
затем он копируется в новую переменную $_ .
В следующем примере копируется на машины B,C,D скрипт command.pl и выполняется там :
perl -e 'for("B","C","D"){`scp command.pl $_:`; `ssh $_ command.pl`; }'
|