Bash Notes for professionalshtml
ebookgit
https://blog.csdn.net/simple_the_best/article/details/52821136程序員
27個Jupyter Notebook小提示與技巧github
https://cloud.tencent.com/developer/article/1194156ajax
http://liuchengxu.github.io/pelican-blog/jupyter-notebook-tips.html shell
曉查 發自 凹非寺
量子位 報道
在機器學習的實踐過程當中,用好Shell能幫你不少節省時間。瀏覽器
最近,有位來自ETHZ的學生分享了一些Shell小技巧。對程序員來講,這些技巧更重要的是讓你的思惟從瑣碎小事中解脫出來,大大提升了工做效率。bash
下面就是他分享的4個tips。因爲本文中涉及到的shell腳本過多,你能夠去文末地址中查看全部腳本的源代碼。服務器
當你在遠程服務器上監視程序運行時,若是想把一個遠程文件抓取到本地查看,一般你會怎麼作?機器學習
記下文件路徑,打開終端,用rsync之類的工具同步到本地,再到文件瀏覽器中查看。
實際上沒必要這麼麻煩。只須要事先寫好幾個shell腳本,就能夠避免重複的機械勞動。
在這裏強烈推薦iTerm 2,它比Mac自帶的終端要強大得多,能夠指定某個觸發關鍵詞執行某個相應的命令。
先在遠程服務器上設置一個腳本t。當咱們輸入r awesome_video.mp4時,它會搜索awesome_video.mp4文件所在路徑,並連同主機名以字符串rtransfer <host> <path>的形式打印出來。
rtransfer做爲iTerm2的觸發關鍵詞,解析出主機和路徑,而後調用另外一個本地腳本t2。腳本t2將這個視頻文件傳輸到臨時目錄,而後在該目錄中打開Finder。
使用iTerm 2觸發關鍵詞功能調用腳本,能夠大大提高效率,而你要作的只是在前期花費時間定製腳本。
除了抓取遠程文件,另外一個讓人痛苦的是訪問遠程服務器上的TensorBoard實例。你能夠設置SSH端口轉發,可是哪一個端口對應哪一個服務器?它們都在Docker容器中。
ngrok可讓你把訪問本地端口變成訪問URL,好比輸入ngrok http 6006後,它會爲你生成一個URL網址http://683acac3.ngrok.io,你能夠在這個地址中查看TensorBoard實例。
結合腳本n,以更快的速度啓動ngrok,而後用腳本tb打開Web瀏覽器,啓動TensorBoard,在十秒內就能從運行目錄轉到顯示圖形。
ngrok有個缺點是它一次只能容許一個會話,所以在使用前須要殺死上一個ngork進程。若是你忘記在另一臺服務器上殺死ngrok,可能會比較麻煩。
ngrok下載地址:https://ngrok.com/
對於運行大量metrics的情形,咱們須要等待較長時間讓TensorBoard加載全部圖形。若是使用tbplot腳本,速度會快不少,而且能直接生成圖像文件。
tbplot實際上調用的是Matplotlib,缺點是目前只能生成標量圖。
tbplot下載地址:https://github.com/mrahtz/tbplot
運行代碼時,最耗費精力的事情就是是擔憂遇到了錯誤並崩潰,所以須要不斷檢查他們的運行狀況。
當程序出現問題時,經過警報自動監控能夠緩解這種擔心。通常能夠把警報發送到郵箱中,爲了不這麼麻煩,可使用sqs-alerts,它依靠AWS AWS Simple Queue服務存儲和接收消息。
在每臺遠程機器上,使用cron運行一個腳本,監控日誌並在檢測到運行中斷時向隊列發送消息。而後在本地機器上運行一個服務來監控隊列,並在收到消息時彈出警報。
sqs-alerts下載地址:https://github.com/mrahtz/sqs-alerts
最後,本文使用的全部shell腳本均可以在如下地址中找到:
https://github.com/mrahtz/dotfiles/tree/master/.local/bin
— 完 —
有那些你相見恨晚的Linux命令 - hellojukay的文章 - 知乎 https://zhuanlan.zhihu.com/p/49450665
shell中的${},##和%%的使用查看腳本語法是否有錯誤: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 1.Shell中變量的原形:${var} 但當你要顯示變量值加隨意的字符(我這裏用_AA)時,就會出錯 這時應該用變量的原形:${var},便是加一個大括號來限定變量名稱的範圍 [root@bogon sh]# aa='ajax' [root@bogon sh]# echo $aa ajax [root@bogon sh]# echo $aa_AA [root@bogon sh]# echo ${aa}_AA ajax_AA 批量修改一個目錄裏文件名 [root@bogon ~]# cat modify_suffix.sh #!/bin/bash dst_path=$1 for file in `ls $dst_path` do if [ -d $1/$file ] then echo `$0 $1/$file` elif [ -f $1/$file ] then mv $1/$file $1/${file}._mod else echo $1/${file} is unknow file type fi done; ./modify_suffix.sh ./f 將 ./f 下的全部文件文件名添加了.mod 按 Ctrl+C 複製代碼 [root@bogon ~]# file="modify_suffix.sh.tar.gz"[root@bogon ~]# echo "${file%%.*}"modify_suffix [root@bogon ~]# echo "${file%.*}" modify_suffix.sh.tar [root@bogon ~]# echo "${file#*.}" sh.tar.gz [root@bogon ~]# echo "${file##*.}" gz 按 Ctrl+C 複製代碼 2.$(cmd) [root@bogon t]# ls 1.txt 2.txt [root@bogon t]# echo $(ls) 1.txt 2.txt [root@bogon t]# var=$(cat 3.txt) cat: 3.txt: 沒有那個文件或目錄 [root@bogon t]# echo $var $var顯然是空的 三、一串的命令執行()和{} [root@bogon t]# var=test [root@bogon t]# echo $var test [root@bogon t]# (var=notest;echo $var) notest [root@bogon t]# echo $var test [root@bogon t]# { var=notest;echo $var;} notest [root@bogon t]# echo $var notest [root@bogon t]# 在{}中 第一個命令和{之間必須有空格,結束必須有; [root@bogon t]# { var1=test1;var2=test2;echo $var1>a;echo $var2;} test2 [root@bogon t]# cat a test1 [root@bogon t]# { var1=test1;var2=test2;echo $var1;echo $var2;}>a [root@bogon t]# cat a test1 test2 腳本實例 ( echo "1" echo "2" ) | awk '{print NR,$0}' 4.幾種特殊的替換結構: ${var:-string},${var:+string},${var:=string},${var:?string} (1) ${var:-string} 和 ${var:=string} 若變量var爲空或者未定義,則用在命令行中用string來替換${var:-string} [root@bogon ~]# echo $a [root@bogon ~]# echo ${a:-bcc} bcc [root@bogon ~]# echo $a [root@bogon ~]# a=ajax [root@bogon ~]# echo ${a:-bcc} ajax [root@bogon ~]# unset a [root@bogon ~]# echo $a [root@bogon ~]# echo ${a:=bbc} bbc [root@bogon ~]# echo $a bbc 發現 ${var:-string}和${var:=string} 比較 後者發現$var爲空時,把string賦值給了var (2) ${var:+string} [root@bogon ~]# a=ajax [root@bogon ~]# echo $a ajax [root@bogon ~]# echo ${a:+bbc} bbc [root@bogon ~]# echo $a ajax [root@bogon ~]# unset a [root@bogon ~]# echo $a [root@bogon ~]# echo ${a:+bbc} [root@bogon ~]# (3). ${var:?string} [root@bogon ~]# echo $a [root@bogon ~]# echo ${a:?bbc} -bash: a: bbc [root@bogon ~]# a=ajax [root@bogon ~]# echo ${a:?bbc} ajax [root@bogon ~]# a=ajax [root@bogon ~]# echo ${a:-`date`} ajax [root@bogon ~]# unset a [root@bogon ~]# echo ${a:-`date`} 2017年 02月 21日 星期二 10:13:46 CST [root@bogon ~]# echo ${a:-$(date)} 2017年 02月 21日 星期二 10:13:59 CST [root@bogon ~]# b=bbc [root@bogon ~]# echo ${a:-$b} bbc 5.$((exp)) POSIX標準的擴展計算 [root@bogon ~]# echo $(3+2) -bash: 3+2: 未找到命令 [root@bogon ~]# echo $((3+2)) 5 [root@bogon ~]# echo $((3.5+2)) -bash: 3.5+2: 語法錯誤: 無效的算術運算符 (錯誤符號是 ".5+2") [root@bogon ~]# echo $((3>2)) 1 [root@bogon ~]# echo $((3>2?'a':'b')) -bash: 3>2?'a':'b': 語法錯誤: 期待操做數 (錯誤符號是 "'a':'b'") [root@bogon ~]# echo $((3>2?a:b)) 0 [root@bogon ~]# echo $((a=3+2)) 5 [root@bogon ~]# echo $((a++)) 5 [root@bogon ~]# echo $a 6 6.四種模式匹配替換結構: ${var%pattern} ${var%%pattern} ${var#pattern} ${var##pattern} ${var%pattern},${var%%pattern} 從右邊開始匹配 ${var#pattern},${var##pattern} 從左邊開始匹配 ${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就中止,非貪婪 ${var%%pattern},${var##pattern} 是最長匹配 只有在pattern中使用了通配符纔能有最長最短的匹配,不然沒有最 長最短匹配之分 [root@bogon ~]# f=a.tar.gz [root@bogon ~]# echo ${f##*.} gz [root@bogon ~]# echo ${f%%.*} a [root@bogon ~]# var=abcdccbbdaa [root@bogon ~]# echo ${var%%d*} abc [root@bogon ~]# echo ${var%d*} abcdccbb [root@bogon ~]# echo ${var#*d} ccbbdaa [root@bogon ~]# echo ${var##*d} aa #發現輸出的內容是var去掉pattern的那部分字符串的值 假設咱們定義了一個變量爲: 能夠用${ }分別替換獲得不一樣的值: 也能夠對變量值裏的字符串做替換: ${file:?my.file.txt} :若 $file 沒設定或爲空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不做處理) ${#var} 可計算出變量值的長度: ${#file} 可獲得 27 ,由於/dir1/dir2/dir3/my.file.txt 是27個字節 轉載:https://blog.csdn.net/shmilyringpull/article/details/7631106 |