Perl 一句话命令

Perl程序一行命令,可以替代grep+sed+awk;

一行式选项
-e 表示后面接perl的一行式表达式; -p 表示print操作,即对每一读入的行在经过表达式操作后都默认输出; -n 表示处理文件但默认不输出处理后的行; -p -n都存在 -n和-p两个选项会自动读取文件,-p会覆盖-n; -l 在结合-n或-p使用的时,会自动对读入的行移除尾随换行符,然后在输出的时候自动追加尾随输出分隔符; -i 原地修改、拷贝副本,类似sed的"-i"; 特殊字符 $ 输出行分隔符,类似awk的ORS,它默认为undef; $. 当前处理行的行号。

例子

  1. 打印出符合要求的行

    例子1

    如果文件只有一列,也可以直接使用$_ perl -ne 'print if $_>1.3' disease.ratio.txt

  2. 全局将文件中的 you 替换为 me:
    perl -pi -e "s/you/me/g" file

/g 表示全局替换
-e 参数允许执行 Perl 代码
-p 参数确保处理文本的每一行并且将处理后的结果打印出来
-i 参数将修改的结果应用到文件中(所以看不到 -p 打印的内容了)
-i[extension] edit <> files in place (makes backup if extension supplied)

注意,实际测试 -i 参数必须提供扩展名以备份文件,否则提示:Can't do inplace edit without backup.
perl -pi.bak -e "s/you/me/g" file

处理多个文件:
perl -pi.bak -e "s/you/me/g" file1 file2 file3

仅处理含有"we"的行:
perl -pi.bak -e "s/you/me/g if /we/" file

打印文件中重复出现的行:
perl -ne "print if a{_}++" file

$_ 表示当前遍历的行的内容
-n 表示遍历所有行(类似 -p 但不负责打印结果)

执行后将自动建立字典 %a,当 _ 对应的值第一次出现的时候,a{$_} 还是 undef(同0),+1在下次生效。再次出现时为1,打印输出,以此类推。

添加并打印行号:
perl -ne "print "._"" file

在 Perl 中,. 是一个特殊变量,表示当前行数。这个例子也可以改用 -p perl -pe "_ = "._"" file

带行号,但仅显示重复行
perl -ne "print "." if a{}++" f.txt

借用 List::Util 模块统计每行中出现的数字的和
perl -MList::Util=sum -alne 'print sum @F' f.txt

说明:
-MList::Util 导入 List::Util 模块
=sum 表示导入 List::Util 的 sum 函数
-a 参数,自动按空格划分行的内容并保存到 @F,使单词、数字独立出来
注 -F/pattern/ 参数可指定其他划分规则
-l 参数确保每一次输出都换行,省了手动 "\n"

让时间回退到 1299 天前:
perl -MPOSIX -le "@t = localtime; $t[3] -= 1299; print scalar localtime mktime @t"

实际时间:
Wed Apr 26 19:31:22 2017
输出:
Sat Oct 5 19:31:22 2013

这个过程实际就是 用 @t 获取 localtime 的返回结果(数组环境),将日期减1299(在数组成员中会变成负数),再使用 mktime 将其封装,返回给 localtime,再用标量环境打印 localtime 的返回值

如何生成8位随机字符密码?map 走起:
perl -le "print map { ('a'..'z')[rand 26] } 1..8"

1..8 产生数组数字从 1-8,关键是产生8次循环
('a'..'z') 产生数组元素a-z,而 [rand 26] 随机产生数组下标,也就是随机选取字母
map 返回每一次循环的处理结果

要我写的话可能会用 grep ,逐个 print
perl -e "grep { print (('a'..'z')[rand 26]) } (1..8)"

发现 print ('a'..'z')[rand 26] 会提示语法问题,必须外加括号。

累计文本中每行的首列数字的和
perl -lane "sum +=F[0]; END { print $sum }" f.txt

END {} 定义了一个代码块,该代码块在脚本结束时运行

如果对 perl 的任一项参数有疑惑,可以参考
perldoc perlrun

其他参考
perldoc perlvar - 关于 Perl 的特殊变量
perldoc perlop - 操作符
perldoc perlfunc - 函数

Chapter 2 - 换行和间隔符
在每行的末尾增加空白行
perl -pe "$="\n"" f.txt

之前对 -p 和 -e 参数做过简要的说明,以上代码相当于:

while (<>) {
\ = "\n"; } continue { print or die "-p failed:!\n";
}
构成
-p 参数建立 while (<>) {} continue { print } 循环结构
在 while 循环内默认用 _ 存储当前读入的行,而 print 的缺省参数为_

-e "代码" 对应 while 循环内的代码。

continue 语句块在 while 的每次循环末尾继续执行,
特点是 continue {} 的代码不会因为 next 而跳过

特殊变量 \ 相当于 AWK 中的 ORS 变量 (Output Record S eparator) 。\ 的内容将自动追加到 _ 的末尾。循环地为\ 赋相同的值是不必要的,
将其放在 BEGIN 代码块可以节省开销(BEGIN代码块优先执行):
perl -pe "BEGIN { $="\n" } " f.txt

相当于:

BEGIN { \ = "\n" } while (<>) { } continue { print or die "-p failed:!\n";
}
其他方案
通过 "." 操作符添加换行:
perl -pe "$_ .= "\n"" f.txt

或者使用s///正则替换:
perl -pe 's/$/\n/' f.txt

甚至可以利用 say 操作符的特性(Perl 5.10 或以上):
perl -nE 'say' f.txt

-E 参数允许打开所有 Perl 的可选特性(为了支持 say 操作符)
-n 参数类似 -p ,遍历所有读入的行但不主动 print(前面介绍过了)
say 操作符类似 print,但 say 总是在每行的末尾添加 "\n"

最后,别忘了多用 perldoc, 执行 perldoc perlrun 查看perl命令行参数的详细说明

换行加倍,空行除外
perl -pe "_ .= \"\n\" unless /^/" f.txt

unless 在 perl 中是 if not 的意思
/^$/ 表示行的开头和末尾之间没有其他字符

也可以用 \S 筛选:
perl -pe "$_ .= "\n" if /\S/" f.txt

\s 代表一系列空白符号
\S 表示空白以外的字符
如果一行中包含空给以外的字符,则追加 \n

三倍换行符
相信各位已经能举一反三,不解释了(后面的命令行示例省去文件名部分)
perl -pe "$\ = "\n\n""

perl -pe "$_ .= "\n\n""

perl -pe "s/$/\n\n/"

N倍换行符
Perl 使用 "字符"x数字 的方式对字符串翻倍叠加,例如7个换行符:"\n"x7

在每行之前添加空行
使用正则替换向文件开头插入\n:
perl -pe 's/^/\n/'wc

删除空白行
perl -ne 'print unless /^$/'

由于这里要自己判断(筛选)输出,所以使用 -n 而非 -p

链接:
https://www.cnblogs.com/paktc/p/6855005.html
https://www.jb51.net/article/55264.htm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容