1. linux下怎麼運行perl程序
1、perl解釋器基本在所有的linux平台上都是自帶的,用戶可以通過如下命令判斷是否有perl解釋器:
which perl
2、如果自己的linux系統上沒有perl解釋器,可以去其官網下載安裝。
3、在具備perl解釋器的情況下,可以參考如下運行步驟:
1)、用vim編寫test.pl,代碼如下:
#!/usr/local/bin/perl
print "HellonWorld!
";
2、編寫完成後,直接執行如下命令即可:
perl test.perl
3、有時候需要一些許可權,自己可以通過su、sudo等命令提示許可權。
2. Linux下的並行神器——parallel
GNU Parallel的輸入源支持文件、命令行和標准輸入(stdin或pipe)。
當然,若不想像上面那樣進行組合,可使用 --xapply 參數從每一個源獲取一個參數(或文件一行),這個參數有些類似R中的函數,具有廣播作用——如果其中一個輸入源的長度比較短,它的值會被重復。
GNU Parallel可以通過 --arg-sep 和 --arg-file-sep 指定分隔符替代 ::: 或 ::::,當這兩個符號被其它命令佔用的時候會特別有用。
GNU Parallel默認把一行做為一個參數:使用 \n 做為參數定界符。可以使用 -d 改變:
GNU Parallel支持通過 -E 參數指定一個值做為結束標志:
GNU Parallel使用 --no-run-if-empty 來跳過空行:
如果parallel之後沒有給定命令,那麼這些參數會被當做命令:
此外,命令還可以是一個腳本文件,一個二進制可執行文件或一個bash的函數(須用 export -f 導出函數)
GNU Parallel支持多種替換字元串,默認使用 {},使用 -I 改變替換字元串符號 {}。其最常見的字元串替換包括以下幾種: {.} ,去掉擴展名; {/} ,去掉路徑,只保留文件名; {//} ,只保留路徑; {/.} ,同時去掉路徑和擴展名; {#} ,輸出任務編號。同時對於每一個字元串替換都可以自己指定符號: -I 對應 {} ; --extensionreplace 替換 {.} ; --basenamereplace 替換 {/} ; --dirnamereplace 替換 {//} ; --basenameextensionreplace 替換 {/.} ; --seqreplace 替換 {#} 。
同時,如果有多個輸入源時,可以通過 {編號} 指定某一個輸入源的參數:
使用 --header 把每一行輸入中的第一個值做為參數名。
使用 --colsep 把文件中的行切分為列,做為輸入參數。
--xargs 會在一行中輸入盡可能多的參數(與參數字元串長度有關),通過 -s 可指定一行中參數的上限。
為了獲得更好的並發性,GNU Parallel會在文件讀取結束後再分發參數。
GNU Parallel 在讀取完最後一個參數之後,才開始第二個任務,此時會把所有的參數平均分配到4個任務(如果指定了4個任務)。
第一個任務與上面使用 --xargs 的例子一樣,但是第二個任務會被平均的分成4個任務,最終一共5個任務。(奇怪的是我的結果與官網教程的結果不一樣)
替換字元串可以是輸出字元的一部分,使用 -m 參數表示每個job不重復輸出「背景」(context), -X 則與 -m 相反,會重復輸出「背景文本」,具體通過下面幾個例子進行理解:
使用 -N 限制每行參數的個數,其中 -N0 表示一次只讀取一個參數,且不輸入這個參數(作為計數器來使用)。
如果命令行中包含特殊字元,就需要使用引號保護起來。
perl腳本 'print "@ARGV\n"' 與linux的 echo 的功能一樣。
使用GNU Parallel運行這條命令的時候,perl命令需要用引號包起來,也可以使用 -q 保護perl命令:
使用 --trim 去除參數兩頭的空格:
使用 --tag 以參數做為輸出前綴,使用 --tagstring 修改輸出前綴:
--dryrun 作用類似於echo:
--verbose 則在運行之前先列印命令:
一般來說,GNU Parallel 會延遲輸出,直到一組命令執行完成。使用 --ungroup ,可立刻列印輸出已完成部分。
使用 --ungroup 會很快,但會導致輸出錯亂,一個任務的行輸出可能會被另一個任務的輸出截斷。像上例所示,第二行輸出混合了兩個任務: '4-middle' '2-start'。使用 --linebuffer 避免這個問題(稍慢一點):
強制使輸出與參數保持順序 --keep-order/-k :
GNU Parallel可以把每一個任務的輸出保存到文件中,臨時文件默認保存在 /tmp 中,可以使用 --tmpdir改變(或者修改 $TMPDIR):
輸出文件可以有結構的保存 --results ,輸出文件不僅包含標准輸出(stdout)也會包含標准錯誤輸出(stderr):
在使用多個變數的時候會顯示很有用:
使用 --jobs/-j 指定並行任務數。
通過使用 --interactive 在一個任務執行之前讓用戶決定是否執行。
當job有大量的IO操作時,為避免 「驚群效應」 ,可使用 --delay 參數指定各個job開始的時間間隔。
若已知任務超過一定時間未反應則為失敗則可以通過 --timeout 指定等待時間避免無謂的等待。GNU parallel能計算所有任務運行時間的中位數,因此可以指定時間為中位數的倍數關系。
GNU parallel有多種方式可用來動態的顯示任務進度信息,如:
使用 --joblog 參數能夠生成各個任務的日誌文件:
通過 --resume-failed 參數可以重新運行失敗的任務; --retry-failed 的作用與 --resume-failed 類似,只是 --resume-failed 從命令行讀取失敗任務,而 --retry-failed 則是從日誌文件中讀取失敗任務:
GNU parallel支持在某一情況下(如第一個失敗或成功時,或者20%任務失敗時)終止任務,終止任務又有兩種類型,其一為立即終止(通過 --halt now 指定),殺死所有正在運行的任務並停止生成新的任務,其二為稍後終止(通過 --halt soon 指定),停止生成新任務並等待正在運行任務完成。
GNU parallel還支持在任務失敗後重試運行 --retries :
關於終止信號的高級用法參考 官方入門文檔 。
GNU parallel能夠在開始一個新的任務前檢查系統的負載情況防止過載(通過 --load 可指定負載),同時還能檢查系統是否使用了交換空間(swap)(通過 --noswap 限制使用swap)。
同時,對於某些佔用內存較多的程序,parallel會檢查內存只有內存滿足時才啟動任務(通過 --memfree 指定需要內存大小),而且在啟動任務後內存不夠50%時會殺掉最新開始的任務,直到這個任務完成再重新開始那些殺死的任務。
還可以通過 --nice 來指定任務的優先順序。
可使用 -S host 來進行遠程登陸:
parallel -S username@$SERVER1 echo running on ::: username@$SERVER1
GNU parallel 文件傳輸使用的是rsync。
更多遠程操作參見入門文檔。
--pipe 參數使得我們可以將輸入(stdin)分為多塊(block),然後分配給多個任務多個cpu以達到負載均衡,最後的結果順序與原始順序一致。使用 --block 參數可以指定每塊的大小,默認為1M。
如果不關心結果順序,只想要快速的得到結果,可使用 --round-robin 參數。沒有這個參數時每塊文件都會啟動一個命令,使用這個參數後會將這些文件塊分配給job數任務(通過 --jobs 進行指定)。若想分配更為均勻還可同時指定 --block 參數。
參考:
官方文檔
GNU Parallel指南
3. perl腳本中怎麼樣執行linux命令
Linux下perl文件的執行
#! /usr/bin/perl
第一個「#」表示是這一行是注釋
第二個「!」表示這一行不是普通注釋,而是解釋器路徑的聲明行
後面的「/usr/bin/perl」是perl解釋器的安裝路徑,也有可能是:「/usr/local/bin/perl」,如果那個不行,就換這個。
這樣修改後,文件就是這個模樣:
#!/usr/bin/perl
#test.pl
print "test message! \n";
然後,給文件加上可執行的屬性:
$ chmod 755 test.pl 或者 $ chmod +x test.pl
這兩個命令用哪一個都可以。
現在執行吧: $ ./test.pl
4. Linux(Mac)下怎樣用命令行刪除和重命名多個文件夾下的文件
樓主試試這個腳本,如能達到效果,請採納
#!/bin/bash
find . ! -name "*fs8.png" -name "*.png" -exec rm -rf {} \;
for i in `find . -name "*.png"`
do
newname=`echo $i|sed -e 's/-fs8//g'`
`mv $i $newname`
done
5. perl命令行參數怎麼捕獲
perl命令行參數怎麼捕獲? perl 獲取命令行參數方法,以在windows操作系統為例,當我們在命令行中調用PERL程序的時候,我們往往會跟隨一些參數,比如輸入文件名,和輸出文件名之類的信息。這些信息PERL會將它們存儲在@ARGV數組中(和C語言一樣)。比如在cmd中輸入如下命令:
pp.pl -opcamfile opcamfile.ini -rcfile rcfile.txt -swapfile swapfile.tmp -outfile outfile.txt
PERL會建立一個數組@ARGV=qw/-opcamfile opcamfile.ini -rcfile rcfile.txt -swapfile swapfile.tmp -outfile outfile.txt/;然後我們想把這些信息做何用出就對應的處理數組,從數組中分離我們想要的數據就可以了。如下面的代碼所示。shift的默認參數是@ARGV。
while($#ARGV>-1){
if($ARGV[0]=~/-opcamfile/i){
if($ARGV[1]!~/-/){
$opcamfile=$ARGV[1];
shift;
}
shift;
}elsif($ARGV[0]=~/-rcfile/i){
if($ARGV[1]!~/-/){
$rcfile=$ARGV[1];
shift;
}
shift;
}elsif($ARGV[0]=~/-swapfile/i){
if($ARGV[1]!~/-/){
$swapfile=$ARGV[1];
shift;
}
shift;
}elsif($ARGV[0]=~/-outfile/i){
if($ARGV[1]!~/-/){
$outfile=$ARGV[1];
$outfile=~s/_sim//g;
shift;
}
shift;
}else{
die'Unrecognizedargument,Exiting...';
}
}
6. 求教,怎樣用perl 讀命令行傳進來的參數,
最簡單的是用@ARGV獲得命令後面的參數表
如執行「perl ppp.pl 1 2 3 4 5」
ppp.pl後面跟著5個參數,在程序中可以直接通過調用$ARGV[0],$ARGV[1],$ARGV[2],$ARGV[3],$ARGV[4]來分別調取。