Chapter 1: Introduction to Perl One-Liners


perl 一行流


Perl 命令行一句话代码 翻译+总结

Chapter 1: Introduction to Perl One-Liners

Perl one-liners will make you a shell warrior: what took you minutes (or even hours) to solve will now take you only seconds!

  • 改变行距,

  • 编号线,

  • 执行计算,

  • 转换和替换文字,

  • 删除和打印特定的行,

  • 解析日志,

  • 在原地编辑文件,

  • 计算统计,

  • 执行系统管理任务,

  • 一次更新一堆文件。

     perl -pi -e 's/you/me/g' file 
-p argument ensures that the code is executed on every line of input and
that the line is printed after execution
-i argument ensures that file
is edited in-place
  perl -pi.bak -e 's/you/me/g' file
Now Perl creates a file.bak backup file first and only then changes the
contents of file.
    perl -pi -e 's/you/me/g if /we/' file

The regular expression can be anything. Say you want to execute the substitution only on lines with digits in them. You could use the /\d/ regular expression to match numbers:

    perl -pi -e 's/you/me/g if /\d/' file

How about finding all lines in a file that appear more than once?打印重复出现的行:

    perl -ne 'print if $a{$_}++' file

This one-liner also uses the -n command-line argument to
loop over the input, but unlike -p, it doesn’t print the lines automatically.

How about numbering lines? Super simple! Perl’s $. special variable
maintains the current line number. Just print it together with the line:显示行序号:

   perl -ne 'print "$. $_"' file       

You can do the same thing by using the -p argument and modifying
the $_ variable:同上:

    perl -pe '$_ = "$. $_"' file

You can also combine the previous two one-liners to create one that numbers only the repeated lines:显示重复的行号:

  perl -ne 'print "$. $_" if $a{$_}++'  file

Another thing you can do is sum the numbers in each line using thesum function from the List::Util CPAN module. CPAN (ComprehensivePerl Archive Network; is an archive of over 100,000 4 Chapter 1reusable Perl modules. List::Util is one of the modules on CPAN, and itcontains various list utility functions. You don’t need to install this module
because it comes with Perl. (It’s in Perl core.)

  perl -MList::Util=sum -alne 'print sum @F'   file  

How about finding the date 1299 days ago? Try this:

  perl -MPOSIX -le '@t = localtime; $t[3] -= 1299; print scalar localtime mktime @t'   

How about generating an eight-letter password? Here you go: 随机密码生成:

    perl -le 'print map { ("a".."z")[rand 26] } 1..8'

Or suppose you want to find the decimal number that corresponds to an IP address. You can use unpack to find it really quickly:

    perl -le 'print unpack("N",'

What about calculations? Let’s find the sum of the numbers in the first column in a table:列求和

    perl -lane '$sum += $F[0]; END { print $sum }'

Now let’s find out how many packets have passed through iptables rules:

      iptables -L -nvx | perl -lane '$pkts += $F[0]; END { print $pkts }' 

How about getting a list of all users on the system?

    perl -a -F: -lne 'print $F[4]' /etc/passwd

Perl one-liners let you accomplish many tasks quickly. You’ll find over 130 one-liners in this book. Read them, try them, and soon enough you’ll be the local shell wizard. ( Just don’t tell your friends—unless you want competition.)