Created
July 20, 2012 15:11
-
-
Save stvkoch/3151248 to your computer and use it in GitHub Desktop.
Perl 1 line
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Useful One-Line Scripts for Perl Jan 28 2012 | version 1.08 | |
-------------------------------- ----------- ------------ | |
Compiled by Peteris Krumins ([email protected], @pkrumins on Twitter) | |
http://www.catonmat.net -- good coders code, great reuse | |
Latest version of this file is always at: | |
http://www.catonmat.net/download/perl1line.txt | |
This file is also available in other languages: | |
(None at the moment.) | |
Please email me [email protected] if you wish to translate it. | |
Perl One-Liners on Github: | |
https://github.com/pkrumins/perl1line.txt | |
You can send me pull requests over GitHub! I accept bug fixes, | |
new one-liners, translations and everything else related. | |
I have also written "Perl One-Liners Explained" ebook that's based on | |
this file. It explains all the one-liners here. Get it at: | |
http://www.catonmat.net/blog/perl-book/ | |
These one-liners work both on UNIX systems and Windows. Most likely your | |
UNIX system already has Perl. For Windows get the Strawberry Perl at: | |
http://www.strawberryperl.com/ | |
Table of contents: | |
1. File Spacing | |
2. Line Numbering | |
3. Calculations | |
4. String Creation and Array Creation | |
5. Text Conversion and Substitution | |
6. Selective Printing and Deleting of Certain Lines | |
7. Handy Regular Expressions | |
8. Perl tricks | |
FILE SPACING | |
------------ | |
# Double space a file | |
perl -pe '$\="\n"' | |
perl -pe 'BEGIN { $\="\n" }' | |
perl -pe '$_ .= "\n"' | |
perl -pe 's/$/\n/' | |
# Double space a file, except the blank lines | |
perl -pe '$_ .= "\n" unless /^$/' | |
perl -pe '$_ .= "\n" if /\S/' | |
# Triple space a file | |
perl -pe '$\="\n\n"' | |
perl -pe '$_.="\n\n"' | |
# N-space a file | |
perl -pe '$_.="\n"x7' | |
# Add a blank line before every line | |
perl -pe 's//\n/' | |
# Remove all blank lines | |
perl -ne 'print unless /^$/' | |
perl -lne 'print if length' | |
perl -ne 'print if /\S/' | |
# Remove all consecutive blank lines, leaving just one | |
perl -00 -pe '' | |
perl -00pe0 | |
# Compress/expand all blank lines into N consecutive ones | |
perl -00 -pe '$_.="\n"x4' | |
# Fold a file so that every set of 10 lines becomes one tab-separated line | |
perl -lpe '$\ = $. % 10 ? "\t" : "\n"' | |
LINE NUMBERING | |
-------------- | |
# Number all lines in a file | |
perl -pe '$_ = "$. $_"' | |
# Number only non-empty lines in a file | |
perl -pe '$_ = ++$a." $_" if /./' | |
# Number and print only non-empty lines in a file (drop empty lines) | |
perl -ne 'print ++$a." $_" if /./' | |
# Number all lines but print line numbers only non-empty lines | |
perl -pe '$_ = "$. $_" if /./' | |
# Number only lines that match a pattern, print others unmodified | |
perl -pe '$_ = ++$a." $_" if /regex/' | |
# Number and print only lines that match a pattern | |
perl -ne 'print ++$a." $_" if /regex/' | |
# Number all lines, but print line numbers only for lines that match a pattern | |
perl -pe '$_ = "$. $_" if /regex/' | |
# Number all lines in a file using a custom format (emulate cat -n) | |
perl -ne 'printf "%-5d %s", $., $_' | |
# Print the total number of lines in a file (emulate wc -l) | |
perl -lne 'END { print $. }' | |
perl -le 'print $n=()=<>' | |
perl -le 'print scalar(()=<>)' | |
perl -le 'print scalar(@foo=<>)' | |
perl -ne '}{print $.' | |
perl -nE '}{say $.' | |
# Print the number of non-empty lines in a file | |
perl -le 'print scalar(grep{/./}<>)' | |
perl -le 'print ~~grep{/./}<>' | |
perl -le 'print~~grep/./,<>' | |
perl -E 'say~~grep/./,<>' | |
# Print the number of empty lines in a file | |
perl -lne '$a++ if /^$/; END {print $a+0}' | |
perl -le 'print scalar(grep{/^$/}<>)' | |
perl -le 'print ~~grep{/^$/}<>' | |
perl -E 'say~~grep{/^$/}<>' | |
# Print the number of lines in a file that match a pattern (emulate grep -c) | |
perl -lne '$a++ if /regex/; END {print $a+0}' | |
perl -nE '$a++ if /regex/; END {say $a+0}' | |
CALCULATIONS | |
------------ | |
# Check if a number is a prime | |
perl -lne '(1x$_) !~ /^1?$|^(11+?)\1+$/ && print "$_ is prime"' | |
# Print the sum of all the fields on a line | |
perl -MList::Util=sum -alne 'print sum @F' | |
# Print the sum of all the fields on all lines | |
perl -MList::Util=sum -alne 'push @S,@F; END { print sum @S }' | |
perl -MList::Util=sum -alne '$s += sum @F; END { print $s }' | |
# Shuffle all fields on a line | |
perl -MList::Util=shuffle -alne 'print "@{[shuffle @F]}"' | |
perl -MList::Util=shuffle -alne 'print join " ", shuffle @F' | |
# Find the minimum element on a line | |
perl -MList::Util=min -alne 'print min @F' | |
# Find the minimum element over all the lines | |
perl -MList::Util=min -alne '@M = (@M, @F); END { print min @M }' | |
perl -MList::Util=min -alne '$min = min @F; $rmin = $min unless defined $rmin && $min > $rmin; END { print $rmin }' | |
# Find the maximum element on a line | |
perl -MList::Util=max -alne 'print max @F' | |
# Find the maximum element over all the lines | |
perl -MList::Util=max -alne '@M = (@M, @F); END { print max @M }' | |
# Replace each field with its absolute value | |
perl -alne 'print "@{[map { abs } @F]}"' | |
# Find the total number of fields (words) on each line | |
perl -alne 'print scalar @F' | |
# Print the total number of fields (words) on each line followed by the line | |
perl -alne 'print scalar @F, " $_"' | |
# Find the total number of fields (words) on all lines | |
perl -alne '$t += @F; END { print $t}' | |
# Print the total number of fields that match a pattern | |
perl -alne 'map { /regex/ && $t++ } @F; END { print $t }' | |
perl -alne '$t += /regex/ for @F; END { print $t }' | |
perl -alne '$t += grep /regex/, @F; END { print $t }' | |
# Print the total number of lines that match a pattern | |
perl -lne '/regex/ && $t++; END { print $t }' | |
# Print the number PI to n decimal places | |
perl -Mbignum=bpi -le 'print bpi(n)' | |
# Print the number PI to 39 decimal places | |
perl -Mbignum=PI -le 'print PI' | |
# Print the number E to n decimal places | |
perl -Mbignum=bexp -le 'print bexp(1,n+1)' | |
# Print the number E to 39 decimal places | |
perl -Mbignum=e -le 'print e' | |
# Print UNIX time (seconds since Jan 1, 1970, 00:00:00 UTC) | |
perl -le 'print time' | |
# Print GMT (Greenwich Mean Time) and local computer time | |
perl -le 'print scalar gmtime' | |
perl -le 'print scalar localtime' | |
# Print local computer time in H:M:S format | |
perl -le 'print join ":", (localtime)[2,1,0]' | |
# Print yesterday's date | |
perl -MPOSIX -le '@now = localtime; $now[3] -= 1; print scalar localtime mktime @now' | |
# Print date 14 months, 9 days and 7 seconds ago | |
perl -MPOSIX -le '@now = localtime; $now[0] -= 7; $now[4] -= 14; $now[7] -= 9; print scalar localtime mktime @now' | |
# Prepend timestamps to stdout (GMT, localtime) | |
tail -f logfile | perl -ne 'print scalar gmtime," ",$_' | |
tail -f logfile | perl -ne 'print scalar localtime," ",$_' | |
# Calculate factorial of 5 | |
perl -MMath::BigInt -le 'print Math::BigInt->new(5)->bfac()' | |
perl -le '$f = 1; $f *= $_ for 1..5; print $f' | |
# Calculate greatest common divisor (GCM) | |
perl -MMath::BigInt=bgcd -le 'print bgcd(@list_of_numbers)' | |
# Calculate GCM of numbers 20 and 35 using Euclid's algorithm | |
perl -le '$n = 20; $m = 35; ($m,$n) = ($n,$m%$n) while $n; print $m' | |
# Calculate least common multiple (LCM) of numbers 35, 20 and 8 | |
perl -MMath::BigInt=blcm -le 'print blcm(35,20,8)' | |
# Calculate LCM of 20 and 35 using Euclid's formula: n*m/gcd(n,m) | |
perl -le '$a = $n = 20; $b = $m = 35; ($m,$n) = ($n,$m%$n) while $n; print $a*$b/$m' | |
# Generate 10 random numbers between 5 and 15 (excluding 15) | |
perl -le '$n=10; $min=5; $max=15; $, = " "; print map { int(rand($max-$min))+$min } 1..$n' | |
# Find and print all permutations of a list | |
perl -MAlgorithm::Permute -le '$l = [1,2,3,4,5]; $p = Algorithm::Permute->new($l); print @r while @r = $p->next' | |
# Generate the power set | |
perl -MList::PowerSet=powerset -le '@l = (1,2,3,4,5); for (@{powerset(@l)}) { print "@$_" }' | |
# Convert an IP address to unsigned integer | |
perl -le '$i=3; $u += ($_<<8*$i--) for "127.0.0.1" =~ /(\d+)/g; print $u' | |
perl -le '$ip="127.0.0.1"; $ip =~ s/(\d+)\.?/sprintf("%02x", $1)/ge; print hex($ip)' | |
perl -le 'print unpack("N", 127.0.0.1)' | |
perl -MSocket -le 'print unpack("N", inet_aton("127.0.0.1"))' | |
# Convert an unsigned integer to an IP address | |
perl -MSocket -le 'print inet_ntoa(pack("N", 2130706433))' | |
perl -le '$ip = 2130706433; print join ".", map { (($ip>>8*($_))&0xFF) } reverse 0..3' | |
perl -le '$ip = 2130706433; $, = "."; print map { (($ip>>8*($_))&0xFF) } reverse 0..3' | |
STRING CREATION AND ARRAY CREATION | |
---------------------------------- | |
# Generate and print the alphabet | |
perl -le 'print a..z' | |
perl -le 'print ("a".."z")' | |
perl -le '$, = ","; print ("a".."z")' | |
perl -le 'print join ",", ("a".."z")' | |
# Generate and print all the strings from "a" to "zz" | |
perl -le 'print ("a".."zz")' | |
perl -le 'print "aa".."zz"' | |
# Create a hex lookup table | |
@hex = (0..9, "a".."f") | |
# Convert a decimal number to hex using @hex lookup table | |
perl -le '$num = 255; @hex = (0..9, "a".."f"); while ($num) { $s = $hex[($num%16)&15].$s; $num = int $num/16 } print $s' | |
perl -le '$hex = sprintf("%x", 255); print $hex' | |
perl -le '$num = "ff"; print hex $num' | |
# Generate a random 8 character password | |
perl -le 'print map { ("a".."z")[rand 26] } 1..8' | |
perl -le 'print map { ("a".."z", 0..9)[rand 36] } 1..8' | |
# Create a string of specific length | |
perl -le 'print "a"x50' | |
# Create a repeated list of elements | |
perl -le '@list = (1,2)x20; print "@list"' | |
# Create an array from a string | |
@months = split ' ', "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" | |
@months = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/ | |
# Create a string from an array | |
@stuff = ("hello", 0..9, "world"); $string = join '-', @stuff | |
# Find the numeric values for characters in the string | |
perl -le 'print join ", ", map { ord } split //, "hello world"' | |
# Convert a list of numeric ASCII values into a string | |
perl -le '@ascii = (99, 111, 100, 105, 110, 103); print pack("C*", @ascii)' | |
perl -le '@ascii = (99, 111, 100, 105, 110, 103); print map { chr } @ascii' | |
# Generate an array with odd numbers from 1 to 100 | |
perl -le '@odd = grep {$_ % 2 == 1} 1..100; print "@odd"' | |
perl -le '@odd = grep { $_ & 1 } 1..100; print "@odd"' | |
# Generate an array with even numbers from 1 to 100 | |
perl -le '@even = grep {$_ % 2 == 0} 1..100; print "@even"' | |
# Find the length of the string | |
perl -le 'print length "one-liners are great"' | |
# Find the number of elements in an array | |
perl -le '@array = ("a".."z"); print scalar @array' | |
perl -le '@array = ("a".."z"); print $#array + 1' | |
TEXT CONVERSION AND SUBSTITUTION | |
-------------------------------- | |
# ROT13 a string | |
'y/A-Za-z/N-ZA-Mn-za-m/' | |
# ROT 13 a file | |
perl -lpe 'y/A-Za-z/N-ZA-Mn-za-m/' file | |
# Base64 encode a string | |
perl -MMIME::Base64 -e 'print encode_base64("string")' | |
perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' file | |
# Base64 decode a string | |
perl -MMIME::Base64 -le 'print decode_base64("base64string")' | |
perl -MMIME::Base64 -ne 'print decode_base64($_)' file | |
# URL-escape a string | |
perl -MURI::Escape -le 'print uri_escape($string)' | |
# URL-unescape a string | |
perl -MURI::Escape -le 'print uri_unescape($string)' | |
# HTML-encode a string | |
perl -MHTML::Entities -le 'print encode_entities($string)' | |
# HTML-decode a string | |
perl -MHTML::Entities -le 'print decode_entities($string)' | |
# Convert all text to uppercase | |
perl -nle 'print uc' | |
perl -ple '$_=uc' | |
perl -nle 'print "\U$_"' | |
# Convert all text to lowercase | |
perl -nle 'print lc' | |
perl -ple '$_=lc' | |
perl -nle 'print "\L$_"' | |
# Uppercase only the first word of each line | |
perl -nle 'print ucfirst lc' | |
perl -nle 'print "\u\L$_"' | |
# Invert the letter case | |
perl -ple 'y/A-Za-z/a-zA-Z/' | |
# Camel case each line | |
perl -ple 's/(\w+)/\u$1/g' | |
perl -ple 's/(?<!['])(\w+)/\u\1/g' | |
# Strip leading whitespace (spaces, tabs) from the beginning of each line | |
perl -ple 's/^[ \t]+//' | |
perl -ple 's/^\s+//' | |
# Strip trailing whitespace (space, tabs) from the end of each line | |
perl -ple 's/[ \t]+$//' | |
# Strip whitespace from the beginning and end of each line | |
perl -ple 's/^[ \t]+|[ \t]+$//g' | |
# Convert UNIX newlines to DOS/Windows newlines | |
perl -pe 's|\n|\r\n|' | |
# Convert DOS/Windows newlines to UNIX newlines | |
perl -pe 's|\r\n|\n|' | |
# Convert UNIX newlines to Mac newlines | |
perl -pe 's|\n|\r|' | |
# Substitute (find and replace) "foo" with "bar" on each line | |
perl -pe 's/foo/bar/' | |
# Substitute (find and replace) all "foo"s with "bar" on each line | |
perl -pe 's/foo/bar/g' | |
# Substitute (find and replace) "foo" with "bar" on lines that match "baz" | |
perl -pe '/baz/ && s/foo/bar/' | |
# Binary patch a file (find and replace a given array of bytes as hex numbers) | |
perl -pi -e 's/\x89\xD8\x48\x8B/\x90\x90\x48\x8B/g' file | |
SELECTIVE PRINTING AND DELETING OF CERTAIN LINES | |
------------------------------------------------ | |
# Print the first line of a file (emulate head -1) | |
perl -ne 'print; exit' | |
# Print the first 10 lines of a file (emulate head -10) | |
perl -ne 'print if $. <= 10' | |
perl -ne '$. <= 10 && print' | |
perl -ne 'print if 1..10' | |
# Print the last line of a file (emulate tail -1) | |
perl -ne '$last = $_; END { print $last }' | |
perl -ne 'print if eof' | |
# Print the last 10 lines of a file (emulate tail -10) | |
perl -ne 'push @a, $_; @a = @a[@a-10..$#a]; END { print @a }' | |
# Print only lines that match a regular expression | |
perl -ne '/regex/ && print' | |
# Print only lines that do not match a regular expression | |
perl -ne '!/regex/ && print' | |
# Print the line before a line that matches a regular expression | |
perl -ne '/regex/ && $last && print $last; $last = $_' | |
# Print the line after a line that matches a regular expression | |
perl -ne 'if ($p) { print; $p = 0 } $p++ if /regex/' | |
# Print lines that match regex AAA and regex BBB in any order | |
perl -ne '/AAA/ && /BBB/ && print' | |
# Print lines that don't match match regexes AAA and BBB | |
perl -ne '!/AAA/ && !/BBB/ && print' | |
# Print lines that match regex AAA followed by regex BBB followed by CCC | |
perl -ne '/AAA.*BBB.*CCC/ && print' | |
# Print lines that are 80 chars or longer | |
perl -ne 'print if length >= 80' | |
# Print lines that are less than 80 chars in length | |
perl -ne 'print if length < 80' | |
# Print only line 13 | |
perl -ne '$. == 13 && print && exit' | |
# Print all lines except line 27 | |
perl -ne '$. != 27 && print' | |
perl -ne 'print if $. != 27' | |
# Print only lines 13, 19 and 67 | |
perl -ne 'print if $. == 13 || $. == 19 || $. == 67' | |
perl -ne 'print if int($.) ~~ (13, 19, 67)' | |
# Print all lines between two regexes (including lines that match regex) | |
perl -ne 'print if /regex1/../regex2/' | |
# Print all lines from line 17 to line 30 | |
perl -ne 'print if $. >= 17 && $. <= 30' | |
perl -ne 'print if int($.) ~~ (17..30)' | |
perl -ne 'print if grep { $_ == $. } 17..30' | |
# Print the longest line | |
perl -ne '$l = $_ if length($_) > length($l); END { print $l }' | |
# Print the shortest line | |
perl -ne '$s = $_ if $. == 1; $s = $_ if length($_) < length($s); END { print $s }' | |
# Print all lines that contain a number | |
perl -ne 'print if /\d/' | |
# Find all lines that contain only a number | |
perl -ne 'print if /^\d+$/' | |
# Print all lines that contain only characters | |
perl -ne 'print if /^[[:alpha:]]+$/ | |
# Print every second line | |
perl -ne 'print if $. % 2' | |
# Print every second line, starting the second line | |
perl -ne 'print if $. % 2 == 0' | |
# Print all lines that repeat | |
perl -ne 'print if ++$a{$_} == 2' | |
# Print all unique lines | |
perl -ne 'print unless $a{$_}++' | |
# Print the first field (word) of every line (emulate cut -f 1 -d ' ') | |
perl -alne 'print $F[0]' | |
HANDY REGULAR EXPRESSIONS | |
------------------------- | |
# Match something that looks like an IP address | |
/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ | |
/^(\d{1,3}\.){3}\d{1,3}$/ | |
# Test if a number is in range 0-255 | |
/^([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/ | |
# Match an IP address | |
my $ip_part = qr|([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|; | |
if ($ip =~ /^($ip_part\.){3}$ip_part$/) { | |
say "valid ip"; | |
} | |
# Check if the string looks like an email address | |
/\S+@\S+\.\S+/ | |
# Check if the string is a decimal number | |
/^\d+$/ | |
/^[+-]?\d+$/ | |
/^[+-]?\d+\.?\d*$/ | |
# Check if the string is a hexadecimal number | |
/^0x[0-9a-f]+$/i | |
# Check if the string is an octal number | |
/^0[0-7]+$/ | |
# Check if the string is binary | |
/^[01]+$/ | |
# Check if a word appears twice in the string | |
/(word).*\1/ | |
# Increase all numbers by one in the string | |
$str =~ s/(\d+)/$1+1/ge | |
# Extract HTTP User-Agent string from the HTTP headers | |
/^User-Agent: (.+)$/ | |
# Match printable ASCII characters | |
/[ -~]/ | |
# Match unprintable ASCII characters | |
/[^ -~]/ | |
# Match text between two HTML tags | |
m|<strong>([^<]*)</strong>| | |
m|<strong>(.*?)</strong>| | |
# Replace all <b> tags with <strong> | |
$html =~ s|<(/)?b>|<$1strong>|g | |
# Extract all matches from a regular expression | |
my @matches = $text =~ /regex/g; | |
PERL TRICKS | |
----------- | |
# Print the version of a Perl module | |
perl -MModule -le 'print $Module::VERSION' | |
perl -MLWP::UserAgent -le 'print $LWP::UserAgent::VERSION' | |
PERL ONE-LINERS EXPLAINED E-BOOK | |
-------------------------------- | |
I have written an ebook based on the one-liners in this file. If you wish to | |
support my work and learn more about these one-liners, you can get a copy | |
of my ebook at: | |
http://www.catonmat.net/blog/perl-book/ | |
The ebook is based on the 7-part article series that I wrote on my blog. | |
In the ebook I reviewed all the one-liners, improved explanations, added | |
new ones, and added two new chapters - introduction to Perl one-liners | |
and summary of commonly used special variables. | |
You can read the original article series here: | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-one/ | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-two/ | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-three/ | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-four/ | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-five/ | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-six/ | |
http://www.catonmat.net/blog/perl-one-liners-explained-part-seven/ | |
CREDITS | |
------- | |
Andy Lester http://www.petdance.com | |
Shlomi Fish http://www.shlomifish.org | |
Madars Virza http://www.madars.org | |
caffecaldo https://github.com/caffecaldo | |
Kirk Kimmel https://github.com/kimmel | |
avar https://github.com/avar | |
rent0n | |
FOUND A BUG? HAVE ANOTHER ONE-LINER? | |
------------------------------------ | |
Email bugs and new one-liners to me at [email protected]! | |
HAVE FUN | |
-------- | |
I hope you found these one-liners useful. Have fun! | |
#---end of file--- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment