Bash Notes for professionals
ebook
https://blog.csdn.net/simple_the_best/article/details/52821136
27个Jupyter Notebook小提示与技巧
https://cloud.tencent.com/developer/article/1194156
http://liuchengxu.github.io/pelican-blog/jupyter-notebook-tips.html
晓查 发自 凹非寺
量子位 报道
在机器学习的实践过程中,用好Shell能帮你很多节省时间。
最近,有位来自ETHZ的学生分享了一些Shell小技巧。对程序员来说,这些技巧更重要的是让你的思维从琐碎小事中解脱出来,大大提高了工作效率。

下面就是他分享的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显然是空的 3、一串的命令执行()和{} [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 |
|
原文:https://www.cnblogs.com/cx2016/p/11415744.html