常用unix命令
通用快捷键
Ctrl + A:光标移至最左侧 Ctrl + K:剪切光标起始位置至行尾 (配合清空整行命令);Ctrl + E: 光标移至最右侧 Ctrl + U:剪切光标起始位置至行首 (配合清空整行命令);Ctrl + L:清屏 (clear命令)Ctrl + C:中止当前正在执行的命令;Ctrl + W:以单词为单位向左剪切 Ctrl + Y:粘贴。
文件和目录
pwd:显示当前目录路径 ;which:查看可执行文件的路径(注意是可执行文件)。 如:which node、which nginx;ls:-l: 显示当前目录下的文件和目录详细(包含权限信息)列表;-a:显示当前目录下所有(包含隐藏文件和目录)列表。
du:-ah:列出文件夹下各个文件和目录的占用大小 ;-sh:统计当前目录占用内存大小。
cat:显示文件内容,适合小文件,两屏内信息;-n:显示行号,一般配合| grep 'xxx'等使用起到快速查看xxx所在行数效果;
less:d键: 前进半页u键:后退半页;空格键:前进一页b键:后退一页;q键:停止读取/键:搜索模式 ,搜索后按n键跳到下一个,按N键跳到上一个,同时也可以输入正则表达式匹配。
grep: 文本检索-i:忽略大小写-r:递归查找 。number:显示行号;
head: 查看文件开头几行tail:查看末尾几行。 (使用场景1 :查询日志)-n: 行数,默认10;-f:每隔1s更新文件内容;-s:指定-f实时刷新时间间隔,单位s;- 日志查询:日志一般都是尾部为最新日志,可通过
tail -n 30 test.log查看最新30行的信息; - 日志搜索:根据报错消息关键字搜索日志,可通过
cat -n test.log | grep 'xxx'获取到关键字对应行号。假设行号为100,此时再通过cat -n test.log | tail -n +70 | head -n 60查询到100行上下30行的附近消息(tail -n +70表示查看70行之后的消息 。head -n 60表示只看前60行消息); cat -n test.log | tail -n +70 | head -n 60 | > temp.log:将上述搜索到的信息写入到临时文件temp.log(发送给其他人查看)。
touch:创建一个文件(创建并编辑用vim);mkdir: 创建一个目录(递归创建mkdir -p one/two/three);cp: 拷贝文件和目录mv:移动文件或目录cp file file_copy:file是目标文件,file_copy是拷贝出来的文件;cp file one/file_copy: 把file拷贝到one目录下,且重命名为file_copy;cp *.txt folder: 把当前目录下所有txt文件拷贝到folder目录下;-r:递归的拷贝,常用来拷贝一整个目录。
rm: 删除文件或目录-f文件强制删除;-r递归删除文件夹,著名的删除操作rm -rf;- 项目中使用
rimraf库卸载node_modules文件(npm i -g rimraf)。
json
// scripts in package.json
"reset": "rimraf node_modules package-lock.json yarn.lock && npm i"ln:ln file fileln:创建fileln为file的硬链接,对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上删除。只有同时删除了 file 与fileln 后,它们共同指向的文件内容才会消失;ln -s file fileln: 创建fileln软连接,类似快捷方式。 删除file会导致fileln无法访问;- 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用
ln命令链接(link)它就可以,不必重复的占用磁盘空间; - 无论是软链接还是硬链接,文件都保持同步变化。创建软链接时,如果软链接文件跟源文件不在同一个目录,那么源文件地址必须为绝对路径,否则创建出来的软链接无法使用;
- 不能针对目录创建硬链接(原因:主要是linux为了防止类似引用循环作出的限制,具体可自行网上了解)。
find: 文件查找 (可使用ag/rg替代)find -name "file.txt": 当前以及子目录下通过名称查找文件。
文件权限管理
drwxr-xr-x 表示文件或目录的权限, 权限的整体是按照用户划分,通过-分割。顺序为: 文件属性 - 所有者 - 群组用户 - 其他用户。
- 按照权限解读如下:
类型 d:d表示目录,就是说这是一个目录,普通文件是-,链接是l写 r:read表示文件可读。读 w:write表示文件可写,一般有写的权限,就有删除的权限。可执行 x:execute表示文件可执行。无 -:表示没有相应权限。
- 按照用户划分解读如下:
d:是一个文件夹rwxr:所有者具有读、写、可执行权限;xr: 群组用户具有读、可执行权限,没有写权限;x:其他用户具有可执行权限,没有读、写权限。
chmod:修改访问权限,-r可以递归修改- 通过数字修改:
4读--2写--1可执行。如7 = 4+2+1,代表rwxchmod 731 test.txt: 代表drwxr-xr-x
- 通过字母修改
u:user 的缩写,用户的意思,表示所有者。g:group 的缩写,群组的意思,表示群组用户。o:other 的缩写,其它的意思,表示其它用户。a:all 的缩写,所有的意思,表示所有用户。+:加号,表示添加权限。-:减号,表示去除权限。=:等于号,表示分配权限。chmod u+rx file: 为文件file的所有者添加rx权限chmod u=rwx,g=r,o=- file
- 通过数字修改:
chown: 修改目录所有者chown peigoz /works:修改works目录的所有者为peigoz用户chown peigoz:user /works:修改works目录的所有者为user用户组下的peigoz用户-R:递归修改
进阶
压缩解压
tar: 压缩文件夹为.tar。tar -cvf sort.tar sort: 将sort文件夹归档为sort.tar-cvf:表示create(创建)+verbose(细节)+file(文件),创建归档文件并显示操作细节;-tf:显示归档里的内容,并不解开归档;-rvf:追加文件到归档,tar -rvf archive.tar file.txt;-xvf:解开归档,tar -xvf archive.tar;-zcvf:直接二次压缩为gzip,tar -zcvf archive.tar.gz archive;-zxvf:直接将gzip解开为文件,tar -zxvf htop-3.0.0.tar.gz
gzip:压缩tar为gzipgunzip: 解压gzip为tar- 压缩后后缀名为
.tar.gz
- 压缩后后缀名为
zip/unzip:“压缩/解压”zip文件(zip压缩文件一般来自windows操作系统)。
网络和进程
ifconfig: 查看ip网络相关信息,如果命令不存在的话, 执行命令yum install net-tools安装。eth0对应有线连接(对应有线网卡),就是用网线来连接的上网。lo表示本地回环(Local Loopback的缩写,对应一个虚拟网卡)可以看到它的ip地址是127.0.0.1。每台电脑都应该有这个接口,因为它对应着“连向自己的链接”。这也是被称之为“本地回环”的原因。所有经由这个接口发送的东西都会回到你自己的电脑。wlan0表示无线局域网
host:ip地址和主机名的互相转换ssh:连接远程服务器,ssh 用户@ip:port,可通过配置文件(~/.ssh/config)配置ssh别名,或者配置bash命令(~/.bash_profile) 简化操作。ps:用于显示当前系统中的进程,ps命令显示的进程列表不会随时间而更新,是静态的,是运行ps命令那个时刻的状态或者说是一个进程快照,ps -ef列出所有进程;top:获取进程的动态列表。top -o cpu按照CPU使用排序;kill:结束pid进程 ,kill pid1 pid2;scp:通过网络,把文件从一台电脑拷贝到另一台电脑。(可使用rz和sz替代)scp root@192.168.1.5:/root/file.txt file.txt:表示把远程电脑上的file.txt文件拷贝到本机
Vim
模式:
- 交互模式:默认模式,可剪切、粘贴、撤消等;
- 插入模式:文本输入;
- 命令模式:保存、退出、命令等;
- 可视模式:高级输入,例如同时插入多行;
状态流转:
txt=> 输入`i`进入插入模式,按`esc`返回交互模式 交互模式 => 输入`:`进入命令模式,输入命令按回车自动返回交互模式 => 使用`Ctrl + V`进入块可视模式,按`esc`返回交互模式交互模式:
0/Home:光标跳转行首;$/End:光标跳转行尾;w:按单词移动;dd:删除光标所在行;dw:删除光标后一个单词;数字 + dd/dw:删除多行/单词;d0:从光标所在位置删除至行首;d$: 从光标所在位置删除至行末;yy/yw/y0/y$:复制;p:粘贴dd或者yy的内容 ;r:替换;u:撤消;数字+gg跳转指定行;G:跳转最后一行;gg:跳转至第一行;/:向后查找;?:向前查找;n: 跳转下一个;N:跳转上一个。
命令模式:
wq/x:保存并退出 ;q!:不保存且退出;- 替换光标所在行所有旧字符串为新字符串:
s/旧字符串/新字符串/g; - 全文替换:
%s/旧字符串/新字符串/g; - 替换第几行到第几行中所有字符串:
2,4 s/one/two/g。
可视模式:可通过方向键同时操作多行
d键,表示删除选中;I键,表示在选中之前插入;u键,表示选中变为小写;U键,表示选中变为大写。
~/.vimrc
sh
set number " 显示行号
syntax on " 激活语法高亮
set showcmd " 实时看到输入的命令
set ignorecase " 搜索时不区分大小写
set mouse=a " 激活鼠标,用鼠标选中时相当于进入可视模式
// ... 更多配置参考:<https://www.ruanyifeng.com/blog/2018/09/vimrc.html>PM2
- 启动:
pm2 start app.js --watch -i 2 -n myapp--watch:监听应用目录的变化,一旦发生变化,自动重启。(实际更多通过配置文件)-i:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。-n:应用的名称。查看应用信息的时候可以用到
- 停止:
pm2 stop app_name|app_id - 全部停止:
pm2 stop all - 查看应用列表:
pm2 list - 重启:
pm2 restart app.js|app_name|app_id - 重载:
pm2 reload app.js|app_name|app_id- 区别:集群模式下,由于
pm2的restart命令会先杀掉所有进程,再重新拉起,会造成服务终止。但是reload命令可以实现 重启,维护升级的时候不需要停机。 - 当重载时间过长或者无法重载时,
pm2会自动切换成restart
- 区别:集群模式下,由于
- 查看应用详细消息:
pm2 show|info|describe app_name|app_id - 查看应用运行状态:
pm2 monit - 查看日志:
pm2 logs app_name|app_id - 其他:在
docker容器中使用pm2启动应用时,要使用pm2-runtime(一个docker包)而不是pm2 start, 因为pm2是默认后台启动的,docker感知不到,CMD命令执行完成,docker容器就结束了(导致容器服务停止)。 所以直接使用node app.js(pm2-runtime底层实际命令)启动应用后,应用才能一直在容器中保持运行。