❶ 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指南
❷ 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等命令提示許可權。
❸ linux下如何運行可執行文件
1、打開kali linux的終端。創建一個文件並命名為test.c。在終端輸入:touch test.c。

❹ linux下 如何用perl腳本給程序傳參(argv)
把執行perl腳本的指令放在反引號之間
./test `perl -e 'print "A"x128'`
`這個符號在鍵盤tab的上邊,1的左邊
還可以放在$()中
./test $(perl -e 'print "A"x128')
這個test是一個linux命令,最好不要用作程序名
❺ 總結linux替換字元串的幾種方法
一)通過vi編輯器來替換。
vi/vim 中可以使用 :s 命令來替換字元串。
:s/well/good/ 替換當前行第一個 well 為 good
:s/well/good/g 替換當前行所有 well 為 good
:n,$s/well/good/ 替換第 n 行開始到最後一行中每一行的第一個 well 為 good
:n,$s/well/good/g 替換第 n 行開始到最後一行中每一行所有 well 為 good
n 為數字,若 n 為 .,表示從當前行開始到最後一行
:%s/well/good/(等同於 :g/well/s//good/) 替換每一行的第一個 well 為 good
:%s/well/good/g(等同於 :g/well/s//good/g) 替換每一行中所有 well 為 good
可以使用 # 作為分隔符,此時中間出現的 / 不會作為分隔符
:s#well/#good/# 替換當前行第一個 well/ 為 good/
:%s#/usr/bin#/bin#g 可以把文件中所有路徑/usr/bin換成/bin
(二)直接替換文件中的字元串。(此法不用打開文件即可替換字元串,而且可以批量替換多個文件。)
1.perl命令替換,參數含義如下:
-a 自動分隔模式,用空格分隔$_並保存到@F中。相當於@F = split 」。分隔符可以使用-F參數指定
-F 指定-a的分隔符,可以使用正則表達式
-e 執行指定的腳本。
-i<擴展名> 原地替換文件,並將舊文件用指定的擴展名備份。不指定擴展名則不備份。
-l 對輸入內容自動chomp,對輸出內容自動添加換行
-n 自動循環,相當於 while(<>) { 腳本; }
-p 自動循環+自動輸出,相當於 while(<>) { 腳本; print; }
用法示例:
perl -p -i.bak -e 's/foo/bar/g' *.c
將所有C程序中的foo替換成bar,舊文件備份成.bak
perl -p -i -e "s/shan/hua/g" ./lishan.txt ./lishan.txt.bak
將當前文件夾下lishan.txt和lishan.txt.bak中的「shan」都替換為「hua」
perl -i.bak -pe 's/(d+)/ 1 + $1 /ge' file1 file2
將每個文件中出現的數值都加一
2.sed命令下批量替換文件內容
格式: sed -i "s/查找欄位/替換欄位/g" `grep 查找欄位 -rl 路徑` 文件名
-i 表示inplace edit,就地修改文件
-r 表示搜索子目錄
-l 表示輸出匹配的文件名
s表示替換,d表示刪除
示例:sed -i "s/shan/hua/g" lishan.txt
把當前目錄下lishan.txt里的shan都替換為hua 各個Linux詳細命令介紹及應用可如下進行查找

❻ perl是怎樣執行linux命令的
perl中的文件判斷 -s file 返回的就是文件大小,單位Byte。你這個可以這么寫:
#!/usr/bin/perl
opendir DF,"/home/perl" or die "$!";
for (readdir DF){
next if -d $_; #遇到目錄就跳到下一次循環
if (-s $_ > 100000) { #100K
unlink; #相當於shell里的rm
}
}
closedir DF;
我也是才學perl。希望對你有所幫助。