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 对应目录下。