SHELL COMMANDS
SHELL
环境变量
如何在任意目录执行某一个可执行文件:方法即将可执行文件的目录添加到PATH环境变量中去,这样就可以任意目录执行了。
export PATH=/path/to/your/demo:/$PATH
取消环境变量设置
unset PATH
root
超级终端
ctrl+alt+F2 # 进入终端
ctrl+alt+F7 # 退出终端
给directory目录添加root权限
chmod -R 777 directory/
sudo su # 超级用户权限,谨慎
内存
查看当前目录下每个文件及文件夹所占内存
du -ah --max-depth=1 # 查看每个所占内存并列出来,比较慢
du -sh # 只显示所占的总内存,不列出每个详细,比较快
ls
ls命令
ls -lh # 查看文件具体大小,会显示单位K/M/G。
ls -l | wc -l # 查看文件个数
ls -ltr # 按照时间顺序排列
ls /path/to/????.jpg # 列出所有图片前缀是四个字符的文件
ssh
sudo apt install openssh-server # 安装ssh协议
service sshd start # 打开ssh
service sshd status # 查看ssh状态
service sshd stop # 关闭ssh
scp -r file name@ip:/root/ # 拷贝file到另一台服务器
scp -P port_id -r file name@ip:/path/ # 带端口号时,-P参数必须在scp后面
ftp
root:/workspace # 在workspace目录下登录ftp
ftp 192.168.1.1 # 登录服务器
# input user name and password
ftp> cd /home
ftp> put file # 把workspace目录下的file文件上传到ftp的/home目录
shell脚本自动触发
at(在某个时间自动执行shell脚本)
date # 查看时间
echo "hello world" > log | at 20:10 # 在今天20:10分向log文件写入hello world
crontab
apt-get install cron
crontab -e # 打开crontab
30 10 * * * /path/to/run.sh # run shell everday in 10:30
sudo /etc/init.d/cron start # 开始运行cron
sudo /etc/init.d/cron stop # 停止运行
编写.sh文件
$1 # 运行.sh时的输入参数
set -e # 一般放在.sh脚本最上面,表示如果某个shell命令返回为error则shell脚本终止
pushd $DIR # 进去DIR目录
popd # 退出目录
新建一个str list
MY_LIST=(
python
cpp
)
for str in "${MY_LIST[@]}"; do
echo $str
done
NEW_LIST=(${MY_LIST[*]}) # 把MY_LIST赋值给另一个变量
echo "num of MY_LIST" ${#MY_LIST[*]} # 输出MY_LIST元素个数
判断文件夹是否存在
if [ -d dir ]; then
echo "dir is exist"
fi
if [ -f file ]; then
echo "file is exist"
fi
split str
str=path/to/name
dir="$(cut -d'/' -f1 <<< "$str")" # 按照/来split 并取出f1,第一个字符
echo $dir
# path
shell中赋值更改变量的值
num=1
num=$((num+1)) # num+1并重新赋值给num
读取文件中每一行
while IFS= read -r line || [ -n "$line" ]; do
echo $line # 把每一行打印出来
done < log # 读取log文件中每一行
shell中添加函数
FUN() {
echo "do something"
}
FUN # 运行函数
shell中正则表达
# log文件内容如下
echo "This is log file"
dense=<"0xB5508">
# 用正则表达去代替dense=<"0xB5508">
sed -i "s/dense<\"0\([xX]\)\([0-9a-fA-F]*\)\"/dense<\"\"/g" log
产生整数序列
seq 1 10 # 生成1到10之间的整数
sed, cat
去除文件中所有的空行/向文件中添加一行空行
sed '/^$/d' old.log > new.log # 去除old.log中所有空行并且保存在new.log中
echo "" > log # 向log文件的最后一行添加空行
sed '${/^[[:blank:]]*$/d}' old.log > new.log # 去除old.log中最后一行的空行
sed -i 'M,Nd' filename # 删除文件的M到N行内容
# sed替换带'/'的字符需要在/前面加一个\转义字符
# 比如替换/usr/local/python3.7替换为/usr/python3.7:
sed -i 's/\/usr\/local\/python3.7/\/usr\/python3.7/g' file
sed -i 's/abc.*/aaa/g' file # 把符合abc***的行全部替换为aaa
cat -n file # -n会显示行号
把一个文件内容加到另一个文件最后
cat log1 >> log2 # cat可以直接处理文件的添加, >> 表示在log2基础上在加上log1内容
向某一行插入字符
sed -i "1i # This is test demo." log # 向log第一行插入字符
查看文件前几行
cat filename.txt | head -n 10
查看进程
ps aux
kill -9 PID
ps -eLf # 查看所有影藏进程
ps -eLf | wc -l # wc -l表示所有列出满足条件的个数
ulimit -u # 查看系统进程上限
# 查看python运行的进程并kill
ps -aux | grep python
find查找文件
find dir/ -iname *.gcda # 找到dir下所有以.gcda结尾的文件
find dir/ \( -iname *.gcda -o -name "*.gcno" \) # 找到dir目前同时满足*.gcda和*.gcno条件的文件
locate file.zip # 查找文件位置
ack "str" # 查找某个字符
rsync
rsync -av raw/ des/ # 把raw文件夹下面的内容拷贝到des目录下
# 假如目录如下
bin/
├── ext
│ ├── remove
│ │ └── empty.txt
│ └── test.cpp
└── torch
├── test.gcda
└── test.gcno
# 将bin目录下内容拷贝到 dir目录下,同时不拷贝remove目录下内容
rsync -avAX --exclude=*/remove/\* bin/ dir/
awk
awk '{print $NF}' // 输出以空格分割最后一个匹配项
加入有以下log:
%output.62 : Float(32:5120, 10:512, 512:1) = aten::matmul(%input.121, %2645)
%outputs.100 : Float(32:5120, 10:512, 512:1) = aten::add_(%output.62, %3527, %2632)
%x.24 : Float(32:5120, 10:512, 512:1) = aten::add_(%outputs.100, %input.119, %2632)
%218 : int = prim::Constant[value=1]()
%2651 : int[] = prim::ListConstruct(%2628)
%mean.24 : Float(32:10, 10:1, 1:1) = aten::mean(%x.24, %2651, %2629, %2630),
%2653 : int[] = prim::ListConstruct(%2628)
%std.24 : Float(32:10, 10:1, 1:1) = aten::std(%x.24, %2653, %2629, %2629),
%2655 : Float(32:5120, 10:512, 512:1) = aten::sub(%x.24, %mean.24, %2632)
%2656 : Float(32:5120, 10:512, 512:1) = aten::mul(%3528, %2655)
%2657 : Float(32:10, 10:1, 1:1) = aten::add(%std.24, %2631, %2632),
%2658 : Float(32:5120, 10:512, 512:1) = aten::div(%2656, %2657)
return (%2658)
如果希望获取所有aten::**的算子名称,可以执行:
grep "=" log | sed "/prim::Constant/d" | awk -F " = " '{print $2}' | awk -F "(" '{print $1}'|sort -u
# grep "=" log 把所有含有=的行都找出来
# sed "/prim::Constant/d" 删除符合条件的行
# awk -F " = " '{print $2}' 在剩下的结果中按照"="号来查找分开, 并把第二个匹配结果打印,比如
# %output.62 : Float(32:5120, 10:512, 512:1) = aten::matmul(%input.121, %2645)输出就是aten::matmul(%input.121, %2645)
# awk -F "(" '{print $1}' 对上面结果按照"("进行查找,将第一项输出
# sort -u sort对输出的结果进行排序, -u表示除重复项.
# 最后结果:
aten::add
aten::add_
aten::div
aten::matmul
aten::mean
aten::mul
aten::std
aten::sub
prim::ListConstruct
tmux
apt-get install tmux
tmux # 输入tmux进入
# 所有tmux的命令在输入前都要先按键盘上ctrl+b, 之后命令才会生效.按了之后屏幕上是没有什么改变的.然后输入:
" # 将terminal上下分频
% # 将terminal左右分频
; # 切换到上一个窗口
o # 切换到下一个窗口
{ # 当前窗口和上一个窗口交换位置
} # 当前窗口和下一个窗口交换位置
q # 显示窗口编号
# tmux启动鼠标
# ctrl+B,然后输入:进入命令行模式,在输入: set -g mouse on
# 或者将上诉语句写到~/.tmux.conf文件中
# tmux粘贴和赋值都可以按住shift来执行
# 在ubuntu的terminal:File->New Profile-新建自己的配置文件,可以改变终端颜色.然后在preference中设置为默认.
# 同时按下ctrl+b+o 交换两个窗口位置
tar, dpkg
tar -cf md.tar.gz md/ # 压缩md
tar -xvf md.tar.gz
# 参数:
-v # 显示进程
dpkg -i pack.deb # 安装deb包
dpkg --remove pack
dpkg -X pack.deb test # 把deb文件解压到test文件夹
dpkg -L pack_name # 查看安装包位置
rpm2cpio name.
rpm | cpio -i --make-directories # 解压rpm文件
sh pkg.run -list # 查看.run文件
rpm -e packagename # 卸载rpm安装包
查看.so文件
nm -D *.so # 查看.so中定义的symbol, 列出.so中所有动态链接符号的名称
# strip去除符号表,在版本发布的时候一般不能暴露符号表,需要去除:
strip libname.so
nm libname.so # 会显示no symbols,即不会出现符号链接了
readelf -V *.so | grep name # 从.so中读取出刷选内容
readelf -D *.so | grep "R.*PATH" # 查看so库设置的rpath路径,rpath的优先级大于LD_LIBRARY_PATH
清理内存
sudo apt-get autoclean # 清理旧版本的软件缓存
sudo apt-get clean # 清理所有软件缓存
sudo apt-get autoremove # 删除系统不再使用的孤立软件
dpkg --get-selections |grep linux-image # 查看已安装内核
uname -a # 查看电脑当前只用内核
# 删除没用内核:
sudo apt-get remove linux-image-4.13.0-37-generic
sudo apt-get purge linux-image-extra-4.13.0-37-generic
sudo apt-get autoremove linux-image-extra-4.13.0-37-generic
sudo dpkg -r linux-image-extra-4.13.0-38-generic
windows和ubuntu时间不一样:
sudo apt-get install ntpdate
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc
shortcut
ctrl+H # 查看影藏文件
df # 查看boost分区空间
ifconfig # 查看ip
Ctrl+shift++ # 增加字体,ctrl+- 减小字体
history # 查看历史terminal命令
windows+1/2/3 # 切换不同左侧锁定的应用
# 左侧工具栏可以影藏
ctrl+windows+D # 显示桌面
alt+tab # 前后两个应用之间切换/可以作为双屏之间切换
ubuntu解决home空间不足问题:
1. windows下下载[Gparted](https://sourceforge.net/projects/gparted/files/gparted-live-testing/OldFiles/)
2. 制作U盘启动工具:
打开UltraISO工具- 文件->打开(下载的镜像)>启动->写入硬盘映像->选择U盘驱动器->格式化->写入
3. 我的电脑右键管理-磁盘管理-点击一个有空余的磁盘-压缩卷-压缩出一部分空余未分配磁盘空间。
4. 重启-U盘启动:
进入Gparted界面-> Defalt settings-Don't touch keymap -> 选择语言 ->输入 26(简体中文)->输入0 进入X-Windows
5. 弹出Gparted磁盘界面,显示自己的磁盘分布 -> 选择home分区所在的分区:/ -> 右键点击Resize/Move. ->点击拖动上方内存条
使得New Size最大,即把未分配的空间分配到home下。
6. 点击Resize/Move -> Aplay
7. 重启即可
wget
wget -q -O a.zip http://www.XXX.zip # 下载网页文件
# 参数:
-q # 不显示下载进程
-O # 定义输出文件名称为a.zip
hollywood
sudo apt-get install hollywood
cmatrix
hollywood
sudo apt-get install oneko
oneko
查看电脑配置
lsb_release -a
uname -a # 查看是x86_64(64位)还是i686(32位)
cat /etc/*-release
cat /proc/cpuinfo
cat /proc/driver/nvidia/version # 驱动版本号
cat /proc/meminfo # 查看内存
free -m # 以MB为单位查看ram大小
~/.bashrc
# 终端彩色
force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
# W表示终端只显示当前目录, 将PS1这一行的w改成W就可以了。
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\W\$ '
fi
unset color_prompt force_color_prompt
rm
rm -- --filename
cp 拷贝同目录下文件
file=/path/to/file/abc.so
# 拷贝和file同级目录的所有文件
cp ${file%/*}/* dir/to/path
grep在特定文件中查找某字符
grep -Hrn "abc" --include \*.cpp
# --include 只在cpp结尾文件中查找
# -r 递归查找
# -n each output line is preceded by its relative line number in the file
# -i 忽略大小写
# H
yum
yum install -y XXXX # -y 表示在安装过程中如果有让选择yes或者no的时候默认选yes
给函数传递参数
fun(){
arg1=$1 # 这里的$1获取的不是shell脚本的输入,而是函数func的输入
echo "arg1:"$arg1
}
fun aaa # 把aaa以参数形式送给函数fun
eval
cmd="ls | grep aaa"
eval $cmd # 执行cmd所表示的语句
/bin/bash
#!/bin/bash
# 一般在script文件开头加上这一句目的:为了统一script脚本在不同系统下运行的环境,保证在各个系统下运行改脚本的时候都是用/bin/bash来运行。因为有些系统的默认bash不是/bin/bash,从而导致运行脚本出错。
给shell脚本脚本传参数
方法一
# script.sh
usage(){
echo "Usage of install.sh"
echo "-p set param"
echo "-h print usage"
}
PARAM=""
while getopts "p:h:" opt
do
echo "all parameters: "$opt
case $opt in
p)
PARAM=$OPTARG;; # 把参数值给PARAM变量
h)
usage
exit 0;;
?)
echo "there is unrecognized parameter."
exit 1;;
esac
done
# 使用用法:
sh script.sh -p true
# 这种方式传参-p 后面必须要加参数内容
方法二
# script.sh
PARAM=""
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-p|--performance)
PARAM="true"
shift
shift;;
-h|--help)
exit 0;;
*)
echo "unknown option."
shift;;
esac
done
# 使用方法:
sh script.sh -p
# 这种方法传参数-p后面不需要跟内容
实现类似字典的功能
info_list=(
"name time"
)
for info in "${info_list[@]}"; do
info_dict=($info)
name=${net_dict[0]}
time=${net_dict[1]}
done
head && tail
head -n 1 File1; tail -n 1 File1 # 选取文件第一行或者最后一行
拷贝软连接文件
cp a.so ./ # 直接拷贝.so
cp -r a.so ./ # 拷贝软连接文件.so
xargs
echo "a b" | xargs mkdir # 分别创建a,b文件夹
列出所有文件夹
ls -d */
shell字符替换:
tr '\n' ' ' # 用空格替换换行符,即把所有行变成一行
tr -d '"' # 删除"符号
awk字符匹配
awk -F 'name' '{print $2}' file # 匹配file中name字符并打印name之后的内容
在每一行添加内容:
sed -e 's/$/abc/' -i file # 在file每一行开始插入abc
sed -i "s/^/\"/g" file # 在每一行开始插入"
sed -e "s/$/\"/g" file # 在每一行开始插入"
sed -e "/patten str/d" file # 删除符合条件的行
sed -i "/^#/d" file # 删除所有以#开头的行
sed -i 'N' -e 's/(\n/\(/g' file # 把( + 换行替换为(
输出所有命令
#!/bin/bash
echo ${@:2} # 输出所有的命令hangcans
a.sh 1 2 3 4
out: 1 2 3 4
生成随机数
echo $(((RANDOM % 10) + 1)) # 生成0到10之间的随机数
多线程
# shell多线程用& + wait
cmd_list="ls "
cmd_a="python test.py"
cmd_b="python test.py"
cmd_list="${cmd_list} & eval ${cmd_a} & eval ${cmd_b}"
eval ${cmd_list}
wait
怎么登陆别人服务器
将自己公共密钥添加到别人服务器的: ~/.ssh/authorized_keys 对应目录下。