Shell:

 

Bash Notes for professionals

 ebook

 


 

 

https://blog.csdn.net/simple_the_best/article/details/52821136

27 Jupyter Notebook Tips and Tricks

https://cloud.tencent.com/developer/article/1194156

http://liuchengxu.github.io/pelican-blog/jupyter-notebook-tips.html 

 

 


 

4 Shell tips to help you improve productivity machine learning

Xiao check from the bottom of the recessed non-Temple 
qubit reports

In the practice of machine learning, a good use Shell can help you save a lot of time.

Recently, students from ETHZ Shell's share some tips. For programmers, these skills and more importantly, let your mind free from the little things out, greatly improving the work efficiency.

https://img.mukewang.com/5c87c1700001d1f906770417.jpg

Here is his share of the four tips. As it relates to the shell script too much in this article, you can go to the end address to view the source code of all scripts.

Crawl remote file

When you run a program on a remote server monitoring, if you want to grab a remote file to the local view, how would you normally do?

Write down the file path, open a terminal, synchronized to the local use tools like rsync, to file browser view.

In fact you do not have too much trouble. Only a few shell scripts written in advance, you can avoid repeated mechanical work.

Here is strongly recommended iTerm 2 , it is much stronger than the Mac's own terminal, you can specify that a keyword triggers to execute a corresponding command.

https://img4.mukewang.com/5c87c1ba0001087a06770268.jpg

To set up a script on a remote server t . When we enter r awesome_video.mp4, it searches the path awesome_video.mp4 file, together with the host name <host> <path> form to print out a string rtransfer.

rtransfer作为iTerm2的触发关键词,解析出主机和路径,然后调用另一个本地脚本t2。脚本t2将这个视频文件传输到临时目录,然后在该目录中打开Finder。

https://img.mukewang.com/5c87c1ce0001139506480421.jpg

使用iTerm 2触发关键词功能调用脚本,可以大大提升效率,而你要做的只是在前期花费时间定制脚本。

远程访问TensorBoard

除了抓取远程文件,另一个让人痛苦的是访问远程服务器上的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/

用tbplot代替TensorBoard绘图

对于运行大量metrics的情形,我们需要等待较长时间让TensorBoard加载所有图形。如果使用tbplot脚本,速度会快很多,并且能直接生成图像文件。

https://img3.mukewang.com/5c87c1e30001646206770425.jpg

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中的${},##和%%的使用

查看脚本语法是否有错误:
bash -n modify_suffix.sh
跟踪执行
sh -x modify_suffix.sh aaa

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、一串的命令执行()和{}
()和{}都是对一串的命令进行执行,但有所区别:
相同点:
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

[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]#

在{}中 第一个命令和{之间必须有空格,结束必须有;
{}中的修改了$var的值 说明在当前shell执行

[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}
否则变量var不为空时,则用变量var的值来替换${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}
规则和上面的完全相反
即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量var的值,即空值

[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}
替换规则:若变量var不为空,则用变量var的值来替换${var:?string}
若变量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标准的扩展计算
这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),包括三目运算符
注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等
若是逻辑判断,表达式exp为真则为1,假则为0

[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中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分
结构中的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=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2

也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值): 
${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理) 
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作处理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作处理)

$ {File:? My.file.txt}: $ file if not set or empty value, the my.file.txt output to STDERR. (Non-treated non-null value)

$ {# Var} variable length calculated value:

$ {# File} to obtain 27, 27 bytes because /dir1/dir2/dir3/my.file.txt

Reprinted: https: //blog.csdn.net/shmilyringpull/article/details/7631106

 
   

 

 


 

Guess you like

Origin www.cnblogs.com/cx2016/p/11415744.html