Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

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`; }'

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье