程序員在編寫程序的時候都要執(zhí)行Perl命令,今天這篇文章是武林技術(shù)頻道小編為大家整理的詳解Perl命令行應(yīng)用程序,希望對大家學(xué)習(xí)這方面知識有幫助!
命令行調(diào)用
?
[開關(guān)項描述]
-0
規(guī)定記錄分隔符。
-0<數(shù)字>
(用8進(jìn)制表示)指定記錄分隔符($/變量),默認(rèn)為換行
-00
段落模式,即以連續(xù)換行為分隔符
-0777
禁用分隔符,即將整個文件作為一個記錄
-a
與 -n 或者 -p 一起使用,負(fù)責(zé)打開自動拆分模式,用于對空白字符進(jìn)行隱式拆分,用空格分隔$_并保存到@F中,相當(dāng)于@F=split ''。分隔符可以使用-F參數(shù)指定例如:
?
-c
只檢查 Perl 腳本語法,而不執(zhí)行腳本。
-d
對腳本打開 Perl調(diào)試器。
-D
設(shè)置 Perl 的調(diào)試標(biāo)記(請先檢查 Perl 的安裝情況,確保已經(jīng)安裝了調(diào)試器),若要觀察 Perl 是如何執(zhí)行腳本的,可使用 -D14。
-e command
用于再命令行而不是在腳本中執(zhí)行 Perl 命令。
-F pattern
規(guī)定拆分輸入行時使用的模式。模式是位于斜杠、單引號或雙引號之間的正則表達(dá)式。例如,-F/:+/ 表示在一個或多個冒號上拆分輸入行,如果 -a 仍然起作用的話,則打開它。
-h
打印 Perl 的命令選項列表。
-i extension
在使用 <> 循環(huán)遍歷文件時啟用原位編輯模式。 如果沒有規(guī)定擴(kuò)展名的話,則原位修改各行內(nèi)容,否則使用擴(kuò)展名來修改輸入文件名(以便充當(dāng)備份文件),并使用原位編輯的原文件名創(chuàng)建輸出文件。 這也是所有 print 語句選擇的文件句柄。
-I directory
與 -P選項一起使用,負(fù)責(zé)告訴 C 預(yù)處理程序查找包含的文件,其默認(rèn)目錄包括 /usr/included、/usr/lib/perl 以及當(dāng)前目錄。
-1 digits
啟用自動行結(jié)束處理。如果使用了 -n 或者 -p 選項,則去掉終止符。把位數(shù)(八進(jìn)制) 賦值給 $/ ,并將行終止符添加到 print 語句中。如果沒有規(guī)定位數(shù)的話,則將 $/ 設(shè)置為 $/ 的當(dāng)前值。
-l
對輸入內(nèi)容自動chomp,對輸出內(nèi)容自動添加換行。使用 -l 有兩個效果,第一自動 chomp 輸入分隔號,第二 把$/ 值付給 $/ (這樣 print 的時候就會自動在末尾加 /n)
?
?
在執(zhí)行 Perl 腳本之前執(zhí)行 use 方法。
-M module
再執(zhí)行 Perl 腳本之前執(zhí)行 use 方法。如果添加附加的文本,則可使用引號。方括號中的短橫線表示把 use 指令替換為 no。
-n
使 Perl 隱式地循環(huán)遍歷指定的文件,并只打印規(guī)定的行。自動循環(huán),相當(dāng)于 while(<>) { 腳本; }
-p
使 Perl 隱式地循環(huán)遍歷指定的文件,同時打印所有的行。自動循環(huán)+自動輸出,相當(dāng)于 while(<>) { 腳本; print; }
-P
使要運行的腳本在 Perl 編譯之前通過 C 預(yù)處理程序。
-s
再腳本名之后、文件名參數(shù)之前啟用開關(guān)項解析,并從@ARGV 數(shù)組中刪除所有找到的開關(guān)項。將開關(guān)項設(shè)置為同名的標(biāo)量型變量,并將標(biāo)量賦值為 1 。例如,-abc 在腳本中將轉(zhuǎn)換為 $abc。
-S
如果不支持 #!/usr/bin/perl 行,則讓 Perl 在 PATH 環(huán)境變量中搜索腳本。
-T
強(qiáng)制打開“污染“ 檢查,用于測試腳本,一般只用在 setuid 或 setgid 程序上。推薦自行檢查 CGI 腳本。
-u
編譯后產(chǎn)生腳本的核心轉(zhuǎn)儲(基于 UNIX 系統(tǒng))。
-U
允許 Perl 執(zhí)行不安全的操作,如果是超級用戶的話,則斷開目錄鏈接。
-v
打印 Perl 的版本信息。
-V
打印最重要的 Perl 配置項和數(shù)組 @INC 中當(dāng)前值的匯總。
-V:NAME
打印 NAME 的值,其中 NAME 是配置變量。
-w
打印警告信息,包括錯誤使用保留字、文件句柄、子例程等情況。
-W
啟用所有警告,而不論是否已經(jīng)用 no warnings 關(guān)閉了本地警告。
-x directory
忽略 #!/usr/bin/perl 行之前的任何文本。如果將目錄名當(dāng)作 -x 開關(guān)的參數(shù),則 Perl 會在開始執(zhí)行腳本之前自動切換到該目錄。
-X
關(guān)閉所有警告。
每一行將缺省保存在 $_,-p 和 -n 一樣,但是還會打印 $_ 的內(nèi)容。
請注意:-p 開關(guān)和 -n 開關(guān)的使用。當(dāng)您想顯式打印數(shù)據(jù)時,使用 -n 開關(guān)。-p 開關(guān)隱式地將 print $_ 語句插入到 -n 開關(guān)所產(chǎn)生的循環(huán)中。因此,-p 開關(guān)更適用于對文件進(jìn)行的完全處理,而 -n 開關(guān)更適用于選擇性文件處理,這樣的處理只需打印特定數(shù)據(jù)。
安全網(wǎng)參數(shù)
有三個參數(shù)我認(rèn)為可以起到“安全網(wǎng)”的作用,因為它們可以讓你避免犯錯,特別是當(dāng)你在使用 Perl 嘗試一些特別聰明(或這愚蠢)的想法時,錯誤難免會發(fā)生。有經(jīng)驗的 Perl 程序員常常使用這三個參數(shù)來提前找到錯誤所在。
-c 是第一個。這個參數(shù)編譯 Perl 程序但并不真正運行它,由此檢查所有語法錯誤,每次修改 perl 程序之后我都會立刻使用它來找到任何語法錯誤。
?
?
這保證了程序依然可以編譯。很顯然,當(dāng)你輸入一小段代碼之后立即進(jìn)行檢查,比起一下子輸入幾百行代碼然后開始 debug 要容易很多。
-W 是第二個參數(shù)。它會提示你任何潛在的bug。Perl 5.6.0 之后的版本已經(jīng)用 use warnings; 替換了-w。你應(yīng)該使用 use warnings 因為它要比 -w 更靈活。
-T 是第三個參數(shù)。它讓 perl 出于了 taint 模式中。在這個模式里,Perl 會質(zhì)疑任何程序外傳來的數(shù)據(jù)。例如從命令行讀取,外部文件里讀取或是 CGI 程序里傳來的數(shù)據(jù)。這些數(shù)據(jù)在 -T 模式里都會被 Tainted(污染),Tainted 數(shù)據(jù)不可以被用來和外部交互。例如使用在 system 調(diào)用和用作 open 的文件名,關(guān)于什么數(shù)據(jù)會被Tainted,請參閱perlsec 文檔,那里有一個完整的列表。
要想使用 Tainted 的數(shù)據(jù)就必須 untaint這個數(shù)據(jù)。untaint是通過正則表達(dá)式來實現(xiàn)的,關(guān)于 taint 本身的內(nèi)容足夠?qū)懸黄獑为毜奈恼拢赃@里我不會太多的講述 taint 模式。如果你要編寫的程序(例如 CGI 程序)需要從從用戶那里接受不可知的輸入,我推薦使有 taint 模式。
還有一個值得一提的參數(shù)是 -d,它將讓 Perl 處于 Debugger 模式。這個話題內(nèi)容非常多,我推薦閱讀文檔 ‘perldoc perldebug'或 Richard Foley 的 Perl Debugger Pocket Reference 一書.
使用模塊
下面的幾個 Perl 參數(shù)可以讓短小的 Perl 程序很容易的在命令行上運行,-e 可以讓 Perl代碼在命令行上被編譯器直接執(zhí)行。例如,我們可以直接在命令行上運行“Hello World” 程序而不用把它寫稱 Perl 程序。
?
多個 -e 也可以同時使用,運行順序根據(jù)它出現(xiàn)的位置。
?
象所有的 Perl 程序一樣,只有程序的最后一行不需要以 ; 結(jié)尾,你也可以用 -e 來引用模塊,但 -M 讓它變得更容易。
?
?
-M模塊名和use 模塊名一樣。有些模塊有默認(rèn)的模塊導(dǎo)入,如果你不想導(dǎo)入它們,你可以使用-m。-m模塊名和 use module() 一樣,關(guān)閉了默認(rèn)的導(dǎo)入。例如下面這個例子,因為 head 函數(shù)是默認(rèn)導(dǎo)入,而使用-m 時就不會執(zhí)行,結(jié)果是沒有輸出。
?
?
-m 和 -M 有很多方便的語法來幫助你使用它們,你可以在 = 后面列出對 use 的各種參數(shù)。
?
?
在這里,CGI.pm 的 :standard 被引入,header 函數(shù)因此可以使用。要引入多個參數(shù)可以通過使用引號和逗號。
?
?
這里我們引入了 header 和 start_html 函數(shù)。
Implicit Loops
-n 和 -p 增加了循環(huán)的功能,使你可以一行一行來處理文件。
?
?
這與下面的程序一樣.
LINE:
?
注意:打開命令行里的文件,一行行的讀取,每一行將缺省保存在 $_。
?
?
上面的這一行可以寫成 LINE: while () { print ”$. – $_” } 輸出當(dāng)前行數(shù) $. 和當(dāng)前行 $_,-p可以讓上面的程序變得更容易,-p 會輸出 $_ 的內(nèi)容,就像這樣:
?
?
?
?
continue 在這里保證 print 在每次循環(huán)都會被調(diào)用。使用 -p,我們的打印行數(shù)程序可以改為
?
?
?
?
這種情況下我們就不需要要明確地調(diào)用 print 函數(shù)了,因為 -p 選項已經(jīng)調(diào)用了它。注意,LINE: 標(biāo)簽可以讓我們直接跳到下一個輸入記錄,而不管你進(jìn)入了多少層循環(huán),使用 next LINE。
?
?
?
?
當(dāng)然,也可以這樣寫:
?
?
在更復(fù)雜的情況里,next LINE可以讓你的代碼更容易理解。如果想在循環(huán)的前后做些處理,可以使用 BEGIN或END block,下面的這一行代碼可以計算 text 文件里的字?jǐn)?shù):
?
?
每一行所有匹配的字放入數(shù)組 @w,然后把 @w 的元素數(shù)目遞加到$t,END block 里的 print 最后輸出文件總字?jǐn)?shù)。
還有兩個參數(shù)可以讓這個程序變得更簡單,-a 打開自動分離 (split) 模式,空格是缺省的分離號,輸入根據(jù)分離號被分離然后放入缺省數(shù)組 @F。由此,我們可以把上面的程序改寫為:
?
?
你也可以通過 -F 把缺省的分離號改為你想要的.例如把分離號定為非字符:
?
?
下面通過 Unix password 文件來介紹一個復(fù)雜的例子。Unix password 是文本文件,每一行是一個用戶記錄,由冒號 ':'分離。第6列是用戶的登錄 shell 路徑,我們可以得出每一個不同 shell 路徑被多少個用戶使用:
?
?
有如下輸出:
?
?
數(shù)據(jù)分隔符
我以前的文章里提到過 $/ 和 $/—輸入,輸出分隔號。$/ 用來分隔從文件句柄里讀出的數(shù)據(jù),缺省 $/ 分隔號是 /n,這樣每次從文件句柄里就會一行行的讀取。$/ 缺省是空字符,用來自動加到要 print 的數(shù)據(jù)尾端。這就是為什么很多時候 print 都要在末尾加上 /n,$/ 和 $/ 可與 -n -p 一起使用。在命令行上相對應(yīng)為 -0 (零) 和 -l (這是 L)。-0 后面可以跟一個16 進(jìn)制或8進(jìn)制數(shù)值,這個值用來賦給 $/。-00 打開段落模式,-0777 打開slurp 模式(即可以一次把整個文件讀入),這與把 $/ 設(shè)為空字符和 undef 一樣效果。
單獨使用 -l 有兩個效果,第一自動 chomp 輸入分隔號,第二 把$/ 值付給 $/ (這樣 print 的時候就會自動在末尾加 /n)我個人常常使用 -l 參數(shù),用來給每一個輸出加 /n,例如:
?
?
原位編輯
使用已有的參數(shù)我們可以寫出很有效的命令行程序. 常見的Unix I/O 重定向:
?
?
這個程序從 input.txt 讀取數(shù)據(jù),然后做一些處理再輸出到 output.txt. 你當(dāng)然也可以把輸出重定向到同一個文件里。上面的程序可以通過 -i 參數(shù)做的更簡單些。-i 把源文件更名然后從這個更名的源文件里讀取,最后把處理后的數(shù)據(jù)寫入源文件。如果 -i 后跟有其他字符串,這個字符串與源文件名合成后來生成一個新的文件名,此文件會被用來儲存原始文件以免被 -i 參數(shù)覆蓋。
這個例子把所有php字符替換為perl :
?
?
程序讀取文件的每一行,然后替換字符,處理后的數(shù)據(jù)重新寫入(即覆蓋) 源文件. 如果不想覆蓋源文件,可以使用$perl -i.bak -
?
?
這里處理過的數(shù)據(jù)寫入 file.txt ,file.txt.bak 是源文件的備份。
打開Perl的taint模式
1、該程序的輸入數(shù)據(jù)來自外部數(shù)據(jù)源。
2、該程序所調(diào)用sub-shell或者函數(shù)影響到該程序之外其它東西。
你可以用“-T”開關(guān)來打開Perl的taint模式。當(dāng)打開taint模式時,Perl就會進(jìn)行執(zhí)行檢查以確保你的數(shù)據(jù)未被taint,如果不安全的使用了被taint的數(shù)據(jù),就會發(fā)出嚴(yán)重錯誤。為了使你的數(shù)據(jù)不被taint,執(zhí)行正則表達(dá)式來匹配數(shù)據(jù)并提取匹配部分。這樣你就必須描述出你所期望的數(shù)據(jù)的內(nèi)容以及格式,并只接受符合這一要求的數(shù)據(jù)。
例如,假設(shè)你期望收到一個單詞字符(word characters,即字母數(shù)字以及下劃線),那么下面的代碼通過一個正則表達(dá)式(它只通過全部由單詞字符組成字符串)會“蒸餾出”你的數(shù)據(jù)來:
?
?
Perl命令行調(diào)試
缺省的Perl調(diào)試器就是perl解釋器本身,另外還有圖形界面的調(diào)試器。圖形界面的調(diào)試器推薦ptkdb,這里不再進(jìn)行介紹,下載安裝以后用兩次便會。所以這里主要介紹一下缺省的命令行調(diào)試器的用法,一般的調(diào)試,用下面這些命令已經(jīng)足夠了,這些命令說明也來自網(wǎng)上整理而成。
用 -d 命令行選項啟動Perl解釋器,例如:
perl -d test.pl 即進(jìn)入Perl調(diào)試器的交互界面。
調(diào)試命令列表如下:(所有命令都在調(diào)試提示符下頂格輸入,命令大小寫有關(guān))
h:顯示調(diào)試器的幫助信息。
|h:以分頁形式顯示調(diào)試器的幫助信息。
h h:顯示一個壓縮的幫助信息。
h 調(diào)試命令:顯示某個調(diào)試命令的幫助。
p 表達(dá)式:顯示變量或表達(dá)式的值,不顯示復(fù)雜變量嵌入的結(jié)構(gòu)和數(shù)據(jù)。
x 表達(dá)式:顯示變量或表達(dá)式的值,對較為復(fù)雜的變量,以一種可讀形式顯示嵌入的結(jié)構(gòu)和數(shù)據(jù)。
V 包名 變量名列表:顯示指定包內(nèi)的所有(或部分)變量的值。(缺省的包名為 main)
X 變量名列表:顯示當(dāng)前包內(nèi)所有(或部分)變量的值。
注:V、X命令中的變量名列表以空格分隔且變量名前應(yīng)去掉$、@或%。
T:程序的調(diào)用棧回退一級。
s 表達(dá)式:單步執(zhí)行,進(jìn)入子函數(shù)。(step into)如果提供一個表達(dá)式并且表達(dá)式中包括函數(shù)調(diào)用,則單步進(jìn)入該函數(shù)內(nèi)。
n 表達(dá)式:單步執(zhí)行,越過子函數(shù)。(step over)
c 行號/函數(shù)名:執(zhí)行到某一行或某一個函數(shù)。
l:顯示未執(zhí)行的一窗(一屏)文件內(nèi)容。
l min-max:顯示第min到第max行的文件內(nèi)容。
l 行號:顯示指定行的內(nèi)容。
l 函數(shù)名:顯示指定函數(shù)的一窗(一屏)文件內(nèi)容。
w 行號:顯示某行周圍一窗(一屏)文件內(nèi)容。
f 文件名:切換到另一個文件。
/模式:在當(dāng)前文件中向前(文件尾)查找匹配的字符串。
?模式:在當(dāng)前文件中向后(文件頭)查找匹配的字符串。
L:顯示所有斷點和附加操作。
S 模式:顯示匹配(或不匹配,在模式前加!)的函數(shù)名。
t:切換跟蹤模式。
t 表達(dá)式:跟蹤執(zhí)行表達(dá)式過程。
b 行號 條件:在某一行設(shè)置一個斷點,當(dāng)程序執(zhí)行到該行并且條件滿足時,產(chǎn)生中斷。
b 函數(shù)名 條件:在某函數(shù)上設(shè)置一個斷點,當(dāng)程序執(zhí)行到該函數(shù)并且條件滿足時,產(chǎn)生中斷。
b load 文件名:在某個文件的第一個可執(zhí)行語句上設(shè)置一個斷點。
d 行號:刪除某一行的斷點。
D:刪除所有斷點。
a 行號 命令:給程序的某一行加一個附加操作。在執(zhí)行該行語句前先執(zhí)行附加的操作。
A:刪除所有已安裝的附加操作。
W 表達(dá)式:增加一個監(jiān)視項。
W:刪除所有監(jiān)視項。
O 選項名?:查詢調(diào)試器可選項的值。
O 選項名=選項值:設(shè)置調(diào)試器可選項的值。
lt Perl語句:設(shè)置一個操作顯示調(diào)試提示符前執(zhí)行的操作。
ltlt Perl語句:增加一個顯示調(diào)試提示符前執(zhí)行的操作。
gt Perl語句:設(shè)置一個離開調(diào)試提示符(轉(zhuǎn)入運行態(tài))時執(zhí)行的操作。
gtgt Perl語句:增加一個離開調(diào)試提示符(轉(zhuǎn)入運行態(tài))時執(zhí)行的操作。
{ 調(diào)試命令:設(shè)置一個操作顯示調(diào)試提示符前執(zhí)行的操作。
{{ 調(diào)試命令:設(shè)置一個操作顯示調(diào)試提示符前執(zhí)行的操作。
注:上述Perl語句和調(diào)試命令均可輸入多行,行尾以/轉(zhuǎn)義。
!number:重新執(zhí)行以前第number次執(zhí)行的調(diào)試命令。
!-number:重新執(zhí)行現(xiàn)在以前number次執(zhí)行的調(diào)試命令。
!模式:重新執(zhí)行以前執(zhí)行過的與模式匹配的調(diào)試命令。
!!命令:不退出調(diào)試器執(zhí)行一個shell命令。
H-number:顯示以前執(zhí)行的number條調(diào)試命令。如果省略number,則顯示所有執(zhí)行過的調(diào)試命令。
R:重新啟動正在調(diào)試的程序。
q或^D:退出調(diào)試器。
|調(diào)試命令:將調(diào)試命令的輸出分頁顯示。
||調(diào)試命令:類似|調(diào)試命令,適于有大量輸出的調(diào)試命令,例如:|V main。
= 別名 值:給某個調(diào)試命令一個別名,例如:= quit q。
所有未識別的命令:當(dāng)作插入的一條Perl語句執(zhí)行。(使用eval)
Perl調(diào)試器的功能還有很多,可以設(shè)置很多選項來定制調(diào)試器的環(huán)境,它本身也是用Perl開發(fā)的,并且Perl發(fā)布中還有接口讓你能開發(fā)其它的Perl調(diào)試器。如果要用Perl開發(fā)大的項目,有必要詳細(xì)了解這些細(xì)節(jié)。使用調(diào)試器和設(shè)置調(diào)試器選項的例子請參考Perl發(fā)布中關(guān)于perldebug的文檔。
更多信息
Perl有大量的命令行參數(shù),這篇文章只是列舉了最有用的一小部分,更詳細(xì)的信息請參考“perlrun” 文檔。
命令行的運用
用perl做命令行的一些簡單的介紹,來替代sed、awk之類的軟件。
Perl作為命令行實用程序,可以度參考ibm的這篇文章。作者提到的很重要的一點是:有經(jīng)驗的程序員不應(yīng)回避快速而又難看的解決方案。
Perl單行命令示例
我們先看看perl如何接收用戶的參數(shù)。如下,Dumper模塊不用理會,只是它會給數(shù)據(jù)結(jié)構(gòu)打印出來,shell給接收到的參數(shù)都放到了@ARGV這個數(shù)組。
?
?
如上,perl可以直接接收到shell命令行的參數(shù)。“-e”后的任何內(nèi)容并將它當(dāng)作腳本來運行。“-M”參數(shù)表示獲取其后的任何內(nèi)容并將該內(nèi)容作為模塊導(dǎo)入,類似于正規(guī)腳本中的“use ModuleName”。我們可以看到象所有的 Perl 程序一樣,只有程序的最后一行不需要以 ; 結(jié)尾。
注:-e在單行命令中非常的重要,做單行命令時一定要加入在使用perl的單行命令時要注意使用”,不要使用"",其實sed和awk也是一樣,當(dāng)然這只是一個建議,看下面的例子就能明白:
?
?
'$$'在perl中表示當(dāng)前的pid,如果使用的是單引號,其中還可以放雙引號,還有變量,重要的是,這些變量不用擔(dān)心被shell轉(zhuǎn)義。
?
?
修改當(dāng)前file文件中的文件,不生成中間文件,速度很快.記住 -i 開關(guān),因為它讓你原地編輯文件。
?
?
象grep一樣過濾文件中需要的內(nèi)容。這個地方,使用了-n,所以一次是做一行的操作,直到整個文件讀完。另外,在管道時,-n也會一樣,來遍歷管道送過來的內(nèi)容。
?
?
這個例子中的,沒用-ne,只是命令寫成了-n -e,其實一樣,這個例子中,是給當(dāng)前文件中的內(nèi)容都加一個行號打印出來.注:$.表示當(dāng)前行號。
?
?
這個其實和上面一樣,分別只是使用了-p替換了-n,這個有個什么好處啦,別的地方都一樣,但-p按行來遍歷完文件后,會給$_打印出來。相當(dāng)于awk分割域(awk‘{i = NF – 1; print $1 + $i}')。
?
?
這個神奇的地方在于-a,使用-a后.因為-n分行讀進(jìn)來,然后-a給數(shù)據(jù)分割成@F的數(shù)組。
?
?
打印正則中從$start到$end的地方
?
?
有效地打印數(shù)字范圍中的行
?
?
原地修改 -i 開關(guān)的神奇之處在于它對 @ARGV 中的每個文件都用該腳本對該文件輸出所產(chǎn)生的文件版本進(jìn)行替代。
?
?
給文件中的內(nèi)容反向排序,比如文件中有fukai,就會變成iakuf.
替換
將所有C程序中的foo替換成bar,舊文件備份成.bak
?
?
很強(qiáng)大的功能,特別是在大程序中做重構(gòu)。記得只有在UltraEdit用過,如果你不想備份,就直接寫成 perl -p -i -e 或者更簡單 perl -pie
將每個文件中出現(xiàn)的數(shù)值都加一
?
?
將換行符/r/n替換成/n
?
同dos2unix命令。
將換行符/n替換成/r/n
?
同unix2dos命令。
取出文件的一部分
顯示字段0-4和字段6,字段的分隔符是空格
?
同 awk 'print $1, $2, $3, $4, $5, $7'。參數(shù)名稱lane也很好記。
如果字段分隔符不是空格而是冒號,則用
?
?
?
?
顯示START和END之間的部分
?
?
相反,不顯示START和END之間的部分
?
?
顯示開頭50行:
?
同命令 head -n 50
不顯示開頭10行:
?
?
顯示15行到17行:
?
?
每行取前80個字符:
?
?
每行丟棄前10個字符:
?
?
搜索
查找comment字符串:
?
這個就是普通的grep命令了。
查找不含comment字符串的行:
?
反向的grep,即grep -v。
查找包含comment或apple的行:
?
相同的功能就要用到egrep了,語法比較復(fù)雜……
計算
計算字段4和倒數(shù)第二字段之和:
?
要是用awk,就得寫成 awk '{i=NF-1;print $5+$i}'
排序和反轉(zhuǎn)
文件按行排序:
?
相當(dāng)于簡單的sort命令。
文件按段落排序:
?
?
?
?
多個文件按文件內(nèi)容排序,并返回合并后的文件:
?
?
文件按行反轉(zhuǎn):
?
?
相應(yīng)的命令有嗎?有,tac(cat的反轉(zhuǎn))
數(shù)值計算
10進(jìn)制轉(zhuǎn)16進(jìn)制:
?
?
10進(jìn)制轉(zhuǎn)8進(jìn)制:
?
?
16進(jìn)制轉(zhuǎn)10進(jìn)制:
?
?
8進(jìn)制轉(zhuǎn)10進(jìn)制:
?
?
簡易計算器
?
?
批量重命名文件
以下是在verycd網(wǎng)站下載的資料,現(xiàn)對其改名的例子:
?
?
$ ls
李斯傳奇 - 第001回.mp3
$ perl -MFile::Find -e 'find sub{ rename $_,$1.".mp3" if /(/d+)(.*)/.mp3$/;}, "." '
$ ls
001.mp3
$ ls
十二生肖妙品欣賞系列 01 子鼠精靈.pdf
$ perl -MFile::Find -e 'find sub{ rename $_,"$2$3".".pdf" if /(.*)/s(/d+)/s(.*)/.pdf$/;}, "." '
$ ls
01子鼠精靈.pdf
中文標(biāo)點符號替換(中文在此占3個字符位)
女人當(dāng)國$ ls
女人當(dāng)國01:選秀入宮.mp3????? 女人當(dāng)國16:“議政王”的奧妙.mp3
將'mp3'文件修改為:01.選秀入宮.mp3,像如下格式:
perl -MFile::Find -E 'find sub{ rename $_,"$1.$3".".mp3" if /(/d{2})([^u4E00-u9FA5]{3})(.*).mp3$/;}, "." '
女人當(dāng)國$ ls
01.選秀入宮.mp3???????? 13.京城風(fēng)云動.mp3
...
秦瓊:“戰(zhàn)將”最終成“門神”(上).mp3
將'“”)'引號去掉
perl -MFile::Find -E 'find sub{ my $o=$_; s/“|”|)//g;rename $o,$_}, "." '
秦瓊:戰(zhàn)將最終成門神(上).mp3
將':('替換為'.'
perl -MFile::Find -E 'find sub{ my $o=$_; s/:|(|,//./g;rename $o,$_}, "." '
秦瓊.戰(zhàn)將最終成門神.上.mp3
在數(shù)字編號后加入'.'
01石頭里生出美猴王.mp3
perl -MFile::Find -E 'find sub{my $o=$_;s/(^/d+)/$1/./;rename $o,$_},"."'
01.石頭里生出美猴王.mp3
將前置中文字符去掉
獨立書店_01.臺北.書店之城.1.mp3
perl -MFile::Find -E 'find sub{ my $o=$_; s/([^u4E00-u9FA5]{12}_)//g;rename $o,$_}, "." '
01.臺北.書店之城.1.mp3
?
在命令行下查看當(dāng)前目錄下的目錄
用于列出當(dāng)前目錄的目錄:一級目錄和所有目錄。
使用內(nèi)置的File::Find模塊
?
?
這將會列出所有的目錄,目前還寫不出僅列出當(dāng)前目錄下一級目錄。
使用File::Find::Rule模塊實現(xiàn)起來最比較容易
?
?
對目錄下的文件進(jìn)行大小寫修改
?
?
只是使用File::Find模塊的find子例程來實現(xiàn)目錄遍歷,對符合條件的文件作重命名而已。
統(tǒng)計相關(guān)的tcp連接情況
查看ip尾數(shù)為9且端口為80的所有連接
?
?
查看ip尾數(shù)為9且端口為80的所有連接,按連接數(shù)從多到少排列,顯示前20個ip
?
?
查看ip尾數(shù)為9且端口為80的所有連接,統(tǒng)計連接狀態(tài)信息
?
?
統(tǒng)計一文本文件有多少行:
?
?
wc -l file_name
cat file_name |wc -l
more file_name |wc -l
?
注:經(jīng)對一個包含六百多萬行的文件進(jìn)行處理,發(fā)現(xiàn)'wc -l'的效率是最好的。
其他
啟動交互式perl:
?
?
查看包含路徑的內(nèi)容:
?
?
perl 生成隨機(jī)密碼
主要還是借用'rand'函數(shù)來實現(xiàn)。
?
?
下面的示例將會輸出25-75之間的隨機(jī)數(shù):
?
?
The rand function returns a fractional number, from (and including) 0 up to (but not including) its argument. We give it an argument of 51 to get a number that can be 0 or more, but never 51 or more. We take the integer portion of this to get a number from 0 to 50, inclusive (50.99999.... will be turned
into 50 by int). We then add 25 to it to get a number from 25 to 75, inclusive.
?
從數(shù)組中隨機(jī)返回元素
?
?
生成8位包含特殊的隨機(jī)密碼
?
?
可以據(jù)用戶
?
?
生成42位長度的密碼
?
?
my $password="";
foreach(1..42){
? my $char=$chars[int(rand(@chars))];
? $char=uc($char) if rand() <0.5;
? $password.=$char;
}
print $password . "/n";
-------------------------------
my @chars = ('0'..'9', 'a'..'z', 'A'..'Z');
my $passwd =
?? join '',
??? map $chars[rand(@chars)],
???? 1..42;
?
調(diào)用String::Random模塊來實現(xiàn):
?
?
print random_regex('[a-zA-Z]{42}'), "/n";
?
使用perl in one line來完成:
?
?
perl -le 'print map { ("a".."z")[rand 26] } 1..8'
perl -le 'print map { ("a".."z", 0..9)[rand 36] } 1..8'
perl -le 'print map { (q(a)..q(z))[rand(26)] } 1 .. 10'
?
相關(guān)問題參考:
--------------------------------------------------------------------------
Perl one-liner with single quote-perl命令行里處理單引號
示例如下:
?
?
echo "a,b" | perl -F',' -lane 'print qq('$F[0]');'
[0]
echo "a,b" | perl -F',' -lane 'print q('$F[0]');'
[0]
?
以上三種方法都不能達(dá)到預(yù)期,可以使用'-w'參數(shù)來進(jìn)行控制,但其在變量環(huán)境無法使用。
?
?
perl -lwe "$b=q( didn't ); print $b"
?
這里卻沒有了輸出。
解決辦法:
1、使用'/''轉(zhuǎn)義。
?
?
2、使用'''的ASCII碼
?
?
echo "a,b" | perl -F',' -lane '$sq="/047"; print "$sq$F[0]$sq";'
以上就是關(guān)于詳解Perl命令行應(yīng)用程序,相信大家已經(jīng)有了清晰的了解了吧?建議大家好好收藏武林技術(shù)頻道網(wǎng),學(xué)習(xí)到更多的知識。
|
新聞熱點
疑難解答
圖片精選