Perl 一句話命令

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

一行式選項(xiàng)
-e 表示后面接perl的一行式表達(dá)式哎迄; -p 表示print操作谭贪,即對(duì)每一讀入的行在經(jīng)過表達(dá)式操作后都默認(rèn)輸出蜡励; -n 表示處理文件但默認(rèn)不輸出處理后的行令花; -p -n都存在 -n和-p兩個(gè)選項(xiàng)會(huì)自動(dòng)讀取文件阻桅,-p會(huì)覆蓋-n; -l 在結(jié)合-n或-p使用的時(shí)兼都,會(huì)自動(dòng)對(duì)讀入的行移除尾隨換行符嫂沉,然后在輸出的時(shí)候自動(dòng)追加尾隨輸出分隔符; -i 原地修改、拷貝副本扮碧,類似sed的"-i"趟章; 特殊字符 $ 輸出行分隔符,類似awk的ORS慎王,它默認(rèn)為undef蚓土; $. 當(dāng)前處理行的行號(hào)。

例子

  1. 打印出符合要求的行

    例子1

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

  2. 全局將文件中的 you 替換為 me:
    perl -pi -e "s/you/me/g" file

/g 表示全局替換
-e 參數(shù)允許執(zhí)行 Perl 代碼
-p 參數(shù)確保處理文本的每一行并且將處理后的結(jié)果打印出來
-i 參數(shù)將修改的結(jié)果應(yīng)用到文件中(所以看不到 -p 打印的內(nèi)容了)
-i[extension] edit <> files in place (makes backup if extension supplied)

注意蜀漆,實(shí)際測(cè)試 -i 參數(shù)必須提供擴(kuò)展名以備份文件,否則提示:Can't do inplace edit without backup.
perl -pi.bak -e "s/you/me/g" file

處理多個(gè)文件:
perl -pi.bak -e "s/you/me/g" file1 file2 file3

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

打印文件中重復(fù)出現(xiàn)的行:
perl -ne "print if a{_}++" file

$_ 表示當(dāng)前遍歷的行的內(nèi)容
-n 表示遍歷所有行(類似 -p 但不負(fù)責(zé)打印結(jié)果)

執(zhí)行后將自動(dòng)建立字典 %a漫蛔,當(dāng) _ 對(duì)應(yīng)的值第一次出現(xiàn)的時(shí)候嗜愈,a{$_} 還是 undef(同0),+1在下次生效莽龟。再次出現(xiàn)時(shí)為1蠕嫁,打印輸出,以此類推毯盈。

添加并打印行號(hào):
perl -ne "print "._"" file

在 Perl 中剃毒,. 是一個(gè)特殊變量,表示當(dāng)前行數(shù)搂赋。這個(gè)例子也可以改用 -p perl -pe "_ = "._"" file

帶行號(hào)赘阀,但僅顯示重復(fù)行
perl -ne "print "." if a{}++" f.txt

借用 List::Util 模塊統(tǒng)計(jì)每行中出現(xiàn)的數(shù)字的和
perl -MList::Util=sum -alne 'print sum @F' f.txt

說明:
-MList::Util 導(dǎo)入 List::Util 模塊
=sum 表示導(dǎo)入 List::Util 的 sum 函數(shù)
-a 參數(shù),自動(dòng)按空格劃分行的內(nèi)容并保存到 @F脑奠,使單詞基公、數(shù)字獨(dú)立出來
注 -F/pattern/ 參數(shù)可指定其他劃分規(guī)則
-l 參數(shù)確保每一次輸出都換行,省了手動(dòng) "\n"

讓時(shí)間回退到 1299 天前:
perl -MPOSIX -le "@t = localtime; $t[3] -= 1299; print scalar localtime mktime @t"

實(shí)際時(shí)間:
Wed Apr 26 19:31:22 2017
輸出:
Sat Oct 5 19:31:22 2013

這個(gè)過程實(shí)際就是 用 @t 獲取 localtime 的返回結(jié)果(數(shù)組環(huán)境)宋欺,將日期減1299(在數(shù)組成員中會(huì)變成負(fù)數(shù))轰豆,再使用 mktime 將其封裝,返回給 localtime齿诞,再用標(biāo)量環(huán)境打印 localtime 的返回值

如何生成8位隨機(jī)字符密碼酸休?map 走起:
perl -le "print map { ('a'..'z')[rand 26] } 1..8"

1..8 產(chǎn)生數(shù)組數(shù)字從 1-8,關(guān)鍵是產(chǎn)生8次循環(huán)
('a'..'z') 產(chǎn)生數(shù)組元素a-z祷杈,而 [rand 26] 隨機(jī)產(chǎn)生數(shù)組下標(biāo)斑司,也就是隨機(jī)選取字母
map 返回每一次循環(huán)的處理結(jié)果

要我寫的話可能會(huì)用 grep ,逐個(gè) print
perl -e "grep { print (('a'..'z')[rand 26]) } (1..8)"

發(fā)現(xiàn) print ('a'..'z')[rand 26] 會(huì)提示語(yǔ)法問題但汞,必須外加括號(hào)。

累計(jì)文本中每行的首列數(shù)字的和
perl -lane "sum +=F[0]; END { print $sum }" f.txt

END {} 定義了一個(gè)代碼塊,該代碼塊在腳本結(jié)束時(shí)運(yùn)行

如果對(duì) perl 的任一項(xiàng)參數(shù)有疑惑,可以參考
perldoc perlrun

其他參考
perldoc perlvar - 關(guān)于 Perl 的特殊變量
perldoc perlop - 操作符
perldoc perlfunc - 函數(shù)

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

之前對(duì) -p 和 -e 參數(shù)做過簡(jiǎn)要的說明,以上代碼相當(dāng)于:

while (<>) {
\ = "\n"; } continue { print or die "-p failed:!\n";
}
構(gòu)成
-p 參數(shù)建立 while (<>) {} continue { print } 循環(huán)結(jié)構(gòu)
在 while 循環(huán)內(nèi)默認(rèn)用 _ 存儲(chǔ)當(dāng)前讀入的行闷哆,而 print 的缺省參數(shù)為_

-e "代碼" 對(duì)應(yīng) while 循環(huán)內(nèi)的代碼。

continue 語(yǔ)句塊在 while 的每次循環(huán)末尾繼續(xù)執(zhí)行忧侧,
特點(diǎn)是 continue {} 的代碼不會(huì)因?yàn)?next 而跳過

特殊變量 \ 相當(dāng)于 AWK 中的 ORS 變量 (Output Record S eparator) 年枕。\ 的內(nèi)容將自動(dòng)追加到 _ 的末尾。循環(huán)地為\ 賦相同的值是不必要的懊纳,
將其放在 BEGIN 代碼塊可以節(jié)省開銷(BEGIN代碼塊優(yōu)先執(zhí)行):
perl -pe "BEGIN { $="\n" } " f.txt

相當(dāng)于:

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 參數(shù)允許打開所有 Perl 的可選特性(為了支持 say 操作符)
-n 參數(shù)類似 -p 揉抵,遍歷所有讀入的行但不主動(dòng) print(前面介紹過了)
say 操作符類似 print,但 say 總是在每行的末尾添加 "\n"

最后嗤疯,別忘了多用 perldoc, 執(zhí)行 perldoc perlrun 查看perl命令行參數(shù)的詳細(xì)說明

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

unless 在 perl 中是 if not 的意思
/^$/ 表示行的開頭和末尾之間沒有其他字符

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

\s 代表一系列空白符號(hào)
\S 表示空白以外的字符
如果一行中包含空給以外的字符,則追加 \n

三倍換行符
相信各位已經(jīng)能舉一反三茂缚,不解釋了(后面的命令行示例省去文件名部分)
perl -pe "$\ = "\n\n""

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

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

N倍換行符
Perl 使用 "字符"x數(shù)字 的方式對(duì)字符串翻倍疊加戏罢,例如7個(gè)換行符:"\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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脚囊,一起剝皮案震驚了整個(gè)濱河市龟糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悔耘,老刑警劉巖讲岁,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衬以,居然都是意外死亡缓艳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門看峻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阶淘,“玉大人,你說我怎么就攤上這事互妓∠希” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵车猬,是天一觀的道長(zhǎng)霉猛。 經(jīng)常有香客問我,道長(zhǎng)珠闰,這世上最難降的妖魔是什么惜浅? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伏嗜,結(jié)果婚禮上坛悉,老公的妹妹穿的比我還像新娘伐厌。我一直安慰自己,他們只是感情好裸影,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布挣轨。 她就那樣靜靜地躺著,像睡著了一般轩猩。 火紅的嫁衣襯著肌膚如雪卷扮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天均践,我揣著相機(jī)與錄音晤锹,去河邊找鬼。 笑死彤委,一個(gè)胖子當(dāng)著我的面吹牛鞭铆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焦影,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼车遂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了斯辰?” 一聲冷哼從身側(cè)響起舶担,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椒涯,沒想到半個(gè)月后柄沮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡废岂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年祖搓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湖苞。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拯欧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出财骨,到底是詐尸還是另有隱情镐作,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布隆箩,位于F島的核電站该贾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捌臊。R本人自食惡果不足惜杨蛋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逞力,春花似錦曙寡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至揩抡,卻和暖如春户侥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捅膘。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工添祸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寻仗。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凡壤,于是被迫代替她去往敵國(guó)和親署尤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容