Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...3146 
 Clickhouse...369 
 Go Web ...348 
 Ethreal 4...326 
 Trees...325 
 C++ Patterns 3...309 
 Ext4 FS...293 
 William Gropp...284 
 Максвелл 3...282 
 Steve Pate 1...272 
 Secure Programming for Li...269 
 Ethreal 1...269 
 Rodriguez 6...268 
 Ethreal 3...261 
 Gary V.Vaughan-> Libtool...261 
 Стивенс 9...258 
 DevFS...251 
 Assembler...250 
 Ulrich Drepper...248 
 Стивенс 10...244 
 
  01.01.2024 : 3621733 посещений 

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

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

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

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