近期致力于总结科研或者工作中用到的主要技术栈,从技术原理到常用语法,这次查缺补漏当作我的小百科。主要技术包括:

以下整理错误或者缺少的部分欢迎指正!!!

Linux

Linux 的目录中有且只有一个根目录 / 。Linux 是以文件的形式管理我们的设备,因此 linux 系统一切皆为文件。Linux命令严格区分大小写。

1
2
3
4
ifconfig  # 查询当前网卡信息
ifconfig eth0 # 配置网卡
df # 查看系统分区
ls /bin/ # 里面存放的为Linux命令文件

文件处理命令

  • 显示目录文件 ls 选项[-ald] [文件或目录]
    -a 显示所有文件,包括隐藏文件
    -l 详细信息显示(可简略为ll
    -d 查看目录属性
    -h 人性化显示
  • 创建新目录 mkdir -p [目录名]
    -p 递归创建
  • 切换目录 cd [目录]
    cd .. 返回上一级目录
  • 显示当前目录 pwd
  • 删除空目录 rmdir [目录名]
  • 复制 cp -rp [原文件或目录] [目标目录]
    -r 复制目录
    -p 保留文件属性
  • 删除文件 rm -rf [文件或目录]
    -f 强制执行
  • 创建空文件 touch [文件名]
  • 显示文件内容 cat [文件名]
    -n 显示行号
  • 分页显示文件内容 more [文件名]
    (空格)或f 翻页
    (Enter) 换行
    q或Q 退出
    / 搜索
  • 分页显示文件内容(可向上翻页)less [文件名]
  • 显示文件前面几行 head -n [文件名]
  • 显示文件后面几行 tail -n [文件名]
    -f 动态显示文件末尾内容
  • 生成链接文件 ln -s [原文件] [目标文件]
    -s 创建软连接

软链接的作用和Windows中的快捷方式差不多,是指向源文件安装路径的符号链接,大小很小,真正拥有的权限是源文件所决定的权限 。
硬链接就是把源文件拷贝到目标位置,与 cp -p 最大区别是可以同步更新,源文件有变化硬链接文件会同时变化,如果源文件丢失或被删除,硬链接并不会消失。可以通过i节点来区分,源文件和硬链接文件的i节点是一样的,所以他们会同步更新,但是不能跨分区放置硬链接,且不能对目录使用。

权限管理命令

用户有三类:u所有者(只有一个)、g所属组、o其他人、a所有人
权限有三类:r、w、x

代表字符 对文件的含义 对目录的含义
r:read 可以查看文件内容 可以cat/more/head/tail/less 可以列出目录中的内容 可以ls
w:write 可以修改文件内容 可以vim 可以在目录中创建、删除文件 可以touch/mkdir/rmdir/rm
x:execute 可以执行文件 可以script(脚本) command(命令) 可以进入目录 可以cd
  • 改变文件或目录权限 chmod [{ugoa}{+-=}{rwx}] [文件或目录]
    -R 递归修改,即修改包括文件下目录的权限
  • 改变文件或目录的所有者 chown [用户] [文件或目录]
  • 改变文件或目录的所属组 chgrp [用户组] [文件或目录]
  • 显示、设置文件的缺省权限 umask [-S]
    -S 以rwx形式显示新建文件缺省权限
    新建文件默认没有 x 权限

umask 指令直接输入之后会显示 0022,其中 0 代表特殊权限,022代表 777 与 022 之间异或逻辑关系

文件搜索命令

  • 文件搜索 find [搜索范围] [匹配条件]
    -name 文件名匹配,*匹配任意字符, 匹配任意一个字符
    -iname 不区分大小写文件名匹配
    -size 指定文件大小,size后接的数据只能为数据块
    +n 大于, -n 小于,n 等于 1个数据块=512字节=0.5K
    -user 根据所有者查找
    -group 根据所属组查找
    -type 根据文件类型查找,f文件,d目录,l软链接
    -a 同时满足, -o 满足任意一个
  • 在文件资料库中查找文件 locate [文件名]
    updatedb 更新资料库
  • 搜索命令所在目录及别名信息 which [命令名]
  • 搜索命令所在目录及帮助文档路径 whereis [命令名]
  • 在文件中搜寻字串匹配的行并输出 grep -iv [指定字串] [文件]
    -i 不区分大小写
    -v 排除指定字串

帮助命令

  • 获得帮助信息 man [命令或配置文件]
  • 获得命令的简单介绍信息 whatis 命令名
  • 查询简短的配置文件的作用 apropos [配置文件名称]
  • 获得Shell内置命令的帮助信息 help 命令名

用户管理命令

  • 添加新用户 useradd 用户名
  • 设置用户密码 passwd 用户名
  • 查看登录用户信息 who
  • 查看登录用户详细信息 w

压缩解压命令

  • .gz格式压缩 gzip [文件]
    解压缩 gunzip [压缩文件]
    只能压缩文件不能压缩目录
  • 打包解包目录,压缩后文件格式为.tar.gz tar 选项[-zxcf] [压缩后文件名] [目录]
    -c 打包
    -x 解包
    -v 显示详细信息
    -f 指定文件名
    -z 打包同时压缩/解压缩
  • .zip格式压缩 zip 选项[-r] [压缩后文件名] [文件或目录]
    解压缩 unzip [压缩文件]
    压缩文件后保留原文件
    -r 压缩目录
  • .bz2格式压缩 bzip2 选项 [-k] [文件]
    解压缩 bunzip2 选项 [-k] [压缩文件]
    -k 产生压缩文件后保留原文件
    可与tar结合使用

网络命令

  • 给用户发信息,以Ctrl+D保存结束 write <用户名>
  • 发广播信息 wall [message]
  • 测试网络连通性 ping 选项 IP地址
  • 查看和设置网卡信息 ifconfig 网卡名称 IP地址
  • 查看发送电子邮件 mail [用户名]
  • 列出目前与过去登入系统的用户信息 last
  • 检查某特定用户上次登录时间 lastlog
  • 显示数据包到主机间的路径 traceroute
  • 显示网络相关信息 netstat [选项]
    -t TCP协议
    -u UDP协议
    -l 监听
    -r 路由
    -n 显示IP地址和端口号
    查看本机监听的端口 netstat -tlun
    查看本机的所有网络连接 netstat -an
    查看本机路由表(网关) netstat -rn
  • 配置网络(Red Hat专有)setup
  • 设备挂载 mount [-t文件系统] 设备文件名 挂载点

关机重启命令

在服务器上重启需要先停掉服务,否则物理内存会坏。且远程服务器只能重启,关机后需要管理员手动开机

  • 关机重启 shutdown [选项] 时间
    -c 取消前一个关机命令
    -h 关机
    -r 重启
    其他关机命令 halt poweroff init 0
    其他重启命令 reboot init6
  • 系统运行级别
    0 关机
    1 单用户,进入选项菜单 只有root用户登陆进去 相当于Windows安全模式F8,只不过没有图形界面
    2 不完全多用户,不含NFS服务,无图形界面、NFS网络文件系统,Linux之间文件传输共享方式,除了NFS服务,和3一样。
    3 完全多用户
    4 未分配
    5 图形界面
    6 重启
  • 查询系统运行级别 runlevel
  • 退出登录 logout

Shell

Xshell是连接远程服务器工具的一种,常用命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ssh 服务器ip	# 连接服务器

rz -be # 上传文件至服务器(-b表示以二进制方式,默认为文本方式;-e对所有控制字符转义)
sz filename # 从服务器下载文件至本地

scp -r host@ip:服务器端文件 本地位置 # 从服务器下载文件至本地(位置互换为上传) -r表示文件夹 -v显示详情

python test.py # 执行代码

ps aux # 查看所有服务进程
top # 查看系统健康状态
pstree # 查看进程树

netstat -nlp # 查看服务对应端口

Shell脚本的执行方式

  1. echo输出命令 echo [选项] [输出内容]
    -e 支持反斜线控制的字符转换
  2. 执行脚本的三种方式:
    ./xxx.sh 需要先赋予执行权限 chmod 755 xxx.sh
    . xxx.sh
    bash xxx.sh
  3. 注意事项
  • 脚本第一行的 #!/bin/Bash 不是注释,是标识下面的语句为Shell脚本
  • ctrl+c终止当前命令;ctrl+d退出当前终端

Bash的基本功能

  • 历史命令 history [选项] [历史命令保存文件]
    -c 清空历史命令
    -w 把缓存中的历史命令写入历史命令保存文件~/.bash_history
    默认保存1000条,可在环境变量配置文件/etc/profile中进行修改
  • 命令别名 alias 别名='原命令'
    查询命令别名 alias
    删除别名 unalias 别名
    系统别名文件/root/.bashrc ,修改后永久生效

输入输出重定向

1.标准输入输出
| 设备 | 设备文件名 | 文件描述符 | 类型 |
|–|–|–|–|
| 键盘 | /dev/stdin | 0 | 标准输入 |
| 显示器 | /dev/sdtout | 1 | 标准输出 |
| 显示器 | /dev/sdterr | 2 | 标准错误输出 |

2.输出重定向
| 类型| 符号| 作用|
|–|–|–|
| 标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输 出到指定的文件或设备当中
| 标准输出重定向 | 命令 >> 文件 | 以追加的方式,把命令的 正确输出输出到指定的文 件或设备当中
| 标准错误输出重定向 | 错误命令 2>文件| 以覆盖的方式,把命令的 错误输出输出到指定的文 件或设备当中
| 标准错误输出重定向 | 错误命令 2>>文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中
| 正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输 出和错误输出都保存到同 一个文件当中
| 正确输出和错误输出同时保存 | 命令 >> 文件 2>&1| 以追加的方式,把正确输 出和错误输出都保存到同 一个文件当中
| 正确输出和错误输出同时保存 | 命令 &>文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
| 正确输出和错误输出同时保存 | 命令 &>>文件| 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
| 正确输出和错误输出同时保存 | 命令 >> 文件1 2>>文件2| 把正确的输出追加到文件1中,把错误的输出追加到文件2中

Bash的变量

  1. 本地变量
    ● 变量调用 echo $name
    ● 查看当前系统全部变量 set
    ● 变量删除 unset nam e

  2. 环境变量
    声明变量 export 变量名=变量值
    查询变量 env
    删除变量 unset 变量名

Shell编程

  • cut命令 cut [选项] 文件名
    -f 列号,提取第几列
    -d 分隔符,按照指定分隔符分割列
    eg:cut -d ":" -f 1,3 /etc/passwd 以:为分隔符提取第一第三列
    当文件以空格分隔而不是\t分隔时cut会提取出错
  • printf命令 printf ’输出类型输出格式’ 输出内容

输出类型:
%ns 输出字符串。n是数字指代输出几个字符
%ni 输出整数。n是数字指代输出几个数字
%m.nf 输出浮点数。m和n是数字,指代输出的整数 位数和小数位数。如%8.2f代表共输出8位数, 其中2位是小数,6位是整数
输出格式:
\a 输出警告声音
\b 输出退格键,也就是Backspace键
\f 清除屏幕
\n 换行
\r 回车,也就是Enter键
\t 平输出退格键,也就是Tab键
\v 垂直输出退格键,也就是Tab键

  • awk命令 awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(Pattern):
一般使用关系表达式作为条件,x >= 10 判断变量 x是否大于等于10
动作(Action):
格式化输出 ,流程控制语句
BEGIN
END
FS内置变量
关系运算符

  • sed命令 sed [选项] ‘[动作]’ 文件名
    sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令
    -n 一般sed命令会把所有数据都输出到屏幕 , 如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
    -e 允许对输入数据应用多条sed命令编辑
    -i 用sed的修改结果直接修改读取数据的文件, 而不是由屏幕输出

动作:
a \ 追加,在当前行后添加一行或多行。添加多行时,除最后 一行 外,每行末尾需要用“\”代表数据未完结
c \ 行替换,用c后面的字符串替换原数据行,替换多行时,除最 后一行外,每行末尾需“\”代表数据未完结
i \ 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,每行末尾需要“\”代表数据未完结
d 删除,删除指定的行
p 打印,输出指定的行。
s 字串替换,用一个字符串替换另外一个字符串。格式为“行范 围s/旧字串/新字串/g”(和vim中的替换格式类似)

流程控制

if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 1.单分支if条件语句
if [ 条件判断式 ] ; then
程序
fi
#或者
if [ 条件判断式 ]
then
程序
fi

# 2.双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi

# 3.多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
„省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi

case语句

1
2
3
4
5
6
7
8
9
10
11
12
case $ 变量名 in  
" 值1"
如果变量的值等于值1,则执行程序1
; ;
" 值2"
如果变量的值等于值2,则执行程序2
; ;
…省略其他分支…
* )
如果变量的值都不是以上的值,则执行此程序
; ;
esac

for循环

1
2
3
4
5
6
7
8
9
for 变量 in123
do
程序
done

for((初始值;循环控制条件;变量变化))
do
程序
done

while循环与until循环

1
2
3
4
5
6
7
8
9
10
11
# 条件成立时进入循环
while [ 条件判断式 ]
do
程序
done

# 条件不成立时进入循环
until [ 条件判断式 ]
do
程序
done

函数

1
2
3
4
[ function ] funname [()]{
action;
[return int;]
}

Git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 项目提交
git init
git add 想要提交的文件
git commit -m "提交说明"
git remote add origin 仓库地址
git push -u origin master

# 更新仓库
git status # 检查是否在该分支下,若不在,切换分支git checkout 分支名。
git add 更新的文件名
git commit -m "更新说明"
git pull # 拉取当前分支最新代码
git push origin master # 上传

# 输入github账户用户名和密码
git config --global user.name "你的GitHub登陆名"
git config --global user.email "你的GitHub注册邮箱"

公司开发分支为develop,员工个人开发分支为personal_develop。员工每次开发需要将develop分支merge到自己分支,在此基础上开发。开发后再提交merge develop request

1
2
3
4
5
6
7
8
9
10
11
12
# 切换到主分支develop
git checkout develop
# 检查当前分支
git branch
# 将develop分支代码拉到本地
git pull
# 切换到个人分支
git checkout lxf_develop
# 将develop分支合并到personal_develop
git merge develop

git clone url # 克隆项目代码

Vim

1
2
# 进入文件,如果没有则新建文件
vim file_name

写入模式

  • i 进入写入模式并插入之前
    I 行首插入
  • a 插入之后
    A 行尾插入
  • o 下行插入
    O 上行插入
  • w 光标向下移动一个词
    b 光标向上移动一个词

命令模式(normal模式)

  • :w 保存
    :w new_filename 另存为指定文件
  • :q 退出
    :q! 不保存修改退出
  • :wq 保存并退出 ZZ
    :wq! 保存修改并退出(文件所有者及root可使用)

visual模式

  • v 进入viual模式从当前位置开始选中
  • :normal A.jpg 选中的行尾全部加上.jpg后缀
  • ctrl+v 选中块

<operation> <motion>
d ←→ 删除光标 (d+6→删除右边6个字符)
y ←→ 复制光标 (y+3←复制左边3个字符)

复制粘贴剪切

  • yy 复制当前行
    nyy 复制当前行一下n行
  • p 粘贴在当前行上
    P 粘贴在当前行下
  • dd 删除一行(其实是剪切)
    ndd 删除当前行一下n行
    D 删除光标所在行到文件末尾的内容
    x 删除光标后一个字符
    c 删除并进入写入模式
  • ciw 词中删除一个词并进入写入模式 (change in word)
    yi" 复制双引号中的内容并进入写入模式(yank in “”)

替换和取消

  • r 取代光标所在处字符
  • R 从光标所在处开始替换字符,按Esc结束
  • u 撤销

查找及替换

  • f 查找
    / 搜索
  • n下一条结果
    N上一条结果
  • :%s/old/new/g 全文替换指定字符串
    :n1,n2s/old/new/g 在一定范围内替换指定字符串

移动

  • 0 回到行首
    $ 移到行尾
  • :1gg 跳到第一行
    :$G 跳到最后一行
    25gg25G 跳到第25行
  • jkhl上下左右

刷新分屏

  • :source $MYVIMRC 刷新vim
  • :split 上下分屏
    :vsplit 左右分屏

使用技巧

  • 导入命令执行结果 r !命令
  • 连续行注释
    :n1,n2s/^/#/g
    :n1,n2s/^#//g
    :n1,n2s/^/\/\//g

环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#查看python版本
python(3) --version

# 查看所有的虚拟环境,带有星号*的为当前虚拟环境
conda info -e

# 创建虚拟环境
conda create -n your_venv_name python=x.x
virtualenv your_venv_name

# 进入指定虚拟环境
activate your_venv_name(Windows)
source your_venv_name(Linux)

# 退出当前虚拟环境
deactivate

# 删除虚拟环境
conda remove -n your_venv_name --all

# 查看已安装模块
pip list
pip freeze

# 批量安装
pip freeze > requirements.txt
pip install -r requirements.txt

# 普通下载
pip install virtualenv # 安装虚拟环境

参考博客