工作中的線上環境有很多的perl命令列的類似一句話的命令,今天總結下perl的命令列編程的一些東西。
-e 後面緊跟著引號裡面的字串是要執行的命令:
複製代碼 代碼如下:
king@king:~$ perl -e ‘print “hello world \n”‘
hello world
如果是多個命令就可以使用多個-e,這裡是不是想到了sed呢?但是要注意的是中間的哪個“;”.
複製代碼 代碼如下:
king@king:~$ perl -e ‘print “hello world \n” ;' -e ‘print “my first perl command line script \n”‘
hello world
my first perl command line script
-M 匯入要使用的模組:
複製代碼 代碼如下:
king@king:~$ perl -MLWP::Simple -e'print head “http://www.chinacache.com”,”\n”‘
text/html; charset=utf-81337525116978307200Apache/2.2.3 (CentOS)
另外-M可以判斷某個模組是不是已經安裝了
-m 的功能和-M類似,區別在於-M 模組名等同於use 模組名,這樣會把一些預設的函數或者其它東西引進過來,-m 模組名 則會關閉這些預設值,這樣可以引入一些你只使用的函數;例如上面的例子:
換成-m的話就不會有任何輸出;-m 和 -M 通過 = 來引入某個模組的特別函數.
複製代碼 代碼如下:
perl -MCGI='header,start_html' -e ‘print header, start_html'
-w 等同於use warnings
-n -p 都會使用 <> 將所有 @ARGV 參數當作檔案來逐行運行(有迴圈的意思哦,經常和其它參數一起處理檔案),會將讀入的內容隱式的逐一按行來遍曆檔案.每一行將預設儲存在 $_;但-p 會將內容“重複”列印出來,而-n更傾向與列印滿足某種條件的行(這這裡還有一些有用的變數比如$. 表示當前行的行數):
複製代碼 代碼如下:
king@king:~$ cat file.txt
A 1
B 2
C 3
king@king:~$ perl -p -e ‘print ‘ file.txt
A 1
A 1
B 2
B 2
C 3
C 3
king@king:~$ perl -n -e ‘print ‘ file.txt
A 1
B 2
C 3
看到這裡是不是想到了sed的-n 的特性:
複製代碼 代碼如下:
king@king:~$ sed -ne ‘p' file.txt
A 1
B 2
C 3
king@king:~$ sed -e ‘p' file.txt
A 1
A 1
B 2
B 2
C 3
C 3
-i 將修改直接的寫入檔案,這個和sed也是一樣的哦;
複製代碼 代碼如下:
king@king:~$ cat file.txt
A 1
B 2
C 3
king@king:~$ perl -pi -e ‘s/A/a/' file.txt
king@king:~$ cat file.txt
a 1
B 2
C 3
-a 開啟自動分離 (split) 模式. 空格是預設的分離號. 輸入根據分離號被分離然後放入預設數組 @F.
複製代碼 代碼如下:
king@king:~$ perl -na -e ‘print $F[1],”\n”‘ file.txt
1
2
3
和awk是不是很像?還有更像的,那就是-F,和awk一樣更改欄位之間的分割符,預設是空格和tab;
複製代碼 代碼如下:
king@king:~$ perl -F':' -alne ‘print $F[0],” “,$F[-1] if /bash$/' /etc/passwd
root /bin/bash
king /bin/bash
guest-b0SIey /bin/bash
看到上面的那個-l的參數沒?它的最主要的作用就是chomp欄位和在每個輸出的後面加上“\n”,讓輸出換行;是不是挺有用的呢?
有沒有其它和awk有類似的地方呢?答案是肯定的,
BEGIN{},END{} 是不是也很熟悉呢?
以下是一些常用的簡單一實例
#perl -pi -e's/aaa/bbb/' filename 修改當前file檔案中的檔案,不產生中間檔案,速度很快.記住 -i 開關,因為它讓你原地編輯檔案.
#perl -ne ‘print if /^aaaaa/' filename 象grep一樣過濾檔案中需要的內容.這個地方,使用了-n,所以一次是做一行的操作,直到整個檔案讀完.另外,在管道時,-n也會一樣,來遍曆管道送過來的內容.
#perl -n -e ‘print “$. – $_”‘ filename 這個例子中的,沒用-ne,只是命令寫成了-n -e,其實一樣,這個例子中,是給當前檔案中的內容都加一個行號列印出來.注:$.表示當前行號
#perl -pe ‘$_ = “$. $_”‘ filename 這個其實和上面一樣,分別只是使用了-p替換了-n,這個有個什麼好處啦,別的地方都一樣,但-p按行來遍曆完檔案後,會給$_列印出來.
大家還記得awk分割域(awk ‘{i = NF – 1; print $1 + $i}')啊,是不是很方便,下面我們來看看perl
複製代碼 代碼如下:
#perl -lane ‘print $F[0] + $F[-2]‘ 這個神奇的地方在於-a,使用-a後.因為-n分行讀進來,然後-a給資料分割成@F的數組.
#perl -ne ‘print if /^START$/ .. /^END$/' 列印正則中從$start到$end的地方
#perl -ne ‘print if $. >= 15; exit if $. >= 17;' 有效地列印數字範圍中的行
#perl -p -i.bak -e ‘s/\bfoo\b/bar/g' *.c 原地修改 -i 開關的神奇之處在於它對 @ARGV 中的每個檔案都用該指令碼對該檔案輸出所產生的檔案版本進行替代
#perl -ne ‘print scalar reverse $_' test 給檔案中的內容反向排序,比如檔案中有abc,就會變成cba