Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
NEWS
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 Go Web ...604 
 Trees...344 
 Ethreal 4...279 
 Python...256 
 2.0-> Linux IP Networking...252 
 Secure Programming for Li...245 
 Steve Pate 3...242 
 Mike Perry...223 
 Rubni-Corbet -> Глав...212 
 TCP 3...211 
 Stewens -> IPC 7...202 
 Rubni-Corbet -> Глав...200 
 TCP 2...197 
 Rodriguez 6...194 
 Rubni-Corbet -> Глав...193 
 Stevens-> Глава 25...189 
 C++ Templates 4...186 
 Стивенс 9...181 
 William Gropp...180 
 Rubni-Corbet -> Глав...180 
 
  01.11.2017 : 2330974 посещений 

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

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

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

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