• apt
• git
• find
• grep
• sort
• ln -s
• lsb_release -a
• free
• scp
• firewall-cmd
• iptables
• tar
• zip
• gzip
• ps -aux
apt
apt 是 Ubuntu 中的包管理工具。
使用 apt update 更新本地软件包列表:
sudo apt update
使用 apt upgrade 升级系统中的软件包:
sudo apt upgrade
使用 apt search 搜索系统中的包,可以帮助找到与搜索关键词相关的软件包:
apt search mkl
使用 apt install 安装软件包:
sudo apt install intel-mkl
使用 apt policy 显示软件包的安装状态和版本信息:
apt policy intel-mkl
使用 apt remove 移除指定的软件包:
sudo apt remove intel-mkl# 完全卸载包sudo apt --purge remove intel-mkl
git
使用 git 克隆远程仓库到本地:
git clone https://github.com/zejunwang1/TurboTransformers
如果远程仓库中存在一些子模块,可以使用如下命令确保子模块的初始化:
git submodule update --init --recursive
使用 git checkout 命令创建和切换分支:
# 检查本地仓库相对于远程仓库修改的文件git checkout# 切换分支git checkout dev# 创建并切换到新分支git checkout -b dev
删除分支:
# 删除本地分支git branch -D dev# 删除一个已经被合并到其他分支的本地分支git branch -d dev# 删除远程分支git push --delete origin dev
需要注意的是,在删除本地分支时,需要确保当前分支不是要删除的分支。
使用 git 提交本地代码库修改到远程:
git add .git commit -m "Update"git push
使用 git reset 命令回退本地仓库版本:
git reset [--soft | --mixed | --hard] [HEAD]
# 回退本地仓库和暂存区到上一个版本git reset HEAD^# 回退test.txt文件到上一个版本git reset HEAD^ test.txt# 向前回退2个版本git reset HEAD~2# 回退到某个版本52464e6git reset 52464e6
git reset --mixed:默认方式,将待撤回的代码存放在工作区,会保留本地未提交的内容。
git reset --soft:回退到某个版本,将待撤回的代码存放在暂存区,会保留本地未提交的内容。
git reset --hard:彻底回退到某个版本,丢弃待撤回的代码,本地未提交的修改会被全部擦除。
对于已经 push 的 commit,也可以使用 reset 命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送 git push -f 来覆盖被 reset 的 commit。
使用 git ls-files 命令检查文件是否在暂存区:
git ls-files --stage | grep test.txt
使用 git rm 命令从暂存区删除文件:
# 从工作区和暂存区删除文件,本地文件被删除git rm -r test.txt# 从暂存区删除文件,本地文件还在,只是不希望该文件被版本控制git rm -r --cached test.txt
当我们提交代码前想先 pull 一下时发现:
$ git pullUpdating 468bc4c..a24f8a5error: Your local changes to the following files would be overwritten by merge: test.txtPlease commit your changes or stash them before you merge.Aborting
说明我们本地修改的代码与别人修改提交的代码有冲突。如何解决?
1. 使用 git stash 命令先存储本地代码:
git stash
2. 然后再 pull 远程代码:
git pull
Updating 468bc4c..a24f8a5Fast-forward test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test.txt
发现这时已经不报错了,能正常 pull 下来。
3. 最后把本地存储的代码释放出来:
git stash pop
CONFLICT (add/add): Merge conflict in test.txtAuto-merging test.txt
发现在 test.txt 文件里会有冲突,我们手动解决下冲突,就可以正常提交了。
假设现在有两个分支 main 和 dev,在 dev 分支修改了一个文件并提交成功,而 main 分支也改了同一个文件并提交成功,当我们将 dev 分支合并至 main 时,有可能存在冲突:
git checkout maingit merge dev
Auto-merging test.txtCONFLICT (content): Merge conflict in test.txtAutomatic merge failed; fix conflicts and then commit the result.
只需找到当前冲突文件,解决冲突即可重新提交。
<<<<<<< HEADThis is a test file for git learning.=======Merge branch test...>>>>>>> dev
我们有时会遇到这样的情况,正在 dev 分支开发新功能,做到一半时团队成员反馈一个 bug,需要马上解决,但新功能又暂时不想提交,这时就可以使用 git stash 命令将 dev 分支的工作区和暂存区保存起来,然后切换到另一个分支去修改bug,修改完提交后再切回 dev 分支,使用 git stash pop 来恢复之前的进度继续开发新功能。
下面是使用 git stash 时要遵循的顺序:
下面是 git stash 命令的常见用法
git stash# 可以为本次存储命名git stash save "test"
git stash list
git stash pop [stash_id]
git stash apply [stash_id]
git stash drop [stash_id]# 清除所有的缓存记录git stash clear
# 最新一次的缓存git stash show [-p]# 指定的某次缓存git stash show [stash_id] [-p]
git stash branch dev_2 [stash_id]
find
find pathname -option [-print] [-exec|-ok command] {} \;
• pathname: 要查找的目录路径。例如用 "." 来表示当前目录,用 "/" 来表示系统根目录。
• -print: 将匹配的文件输出到标准输出。
• -exec: 对匹配的文件执行该参数所给出的 shell 命令。相应命令的形式为 command {}
• -ok: 和 -exec 的作用相同,不过会以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令 command {} 之前,都会给出提示,让用户来确定是否执行。
• -name filename: 查找名为 filename 的文件。
• -iname filename: 查找名为 filename 的文件,且忽略大小写。
• -type [d/f]: 按文件类型查找,d 表示目录,f 表示普通文件。
使用 find 查找当前路径中匹配搜索关键词的文件/目录:
find . -name *cpp
使用 find 查找当前路径中匹配搜索关键词的目录:
find . -type d -name *cpp
查找匹配关键词的目录并列出其下的所有文件:
find . -type d -name *cpp -print -exec ls {} \;
查找一个名为 test.cpp 的文件并将其删除:
find . -name test.cpp -exec rm -rf {} \;
查找空文件或空目录:
find . -empty
查找更新时间在 1 天以内的所有文件/目录:
find . -mtime -1# 查找更新时间在1天以上的所有文件find . -type f -mtime +1
查找更新时间在 1 分钟以内的所有文件/目录:
find . -mmin -1# 查找更新时间在1分钟以上的所有文件find . -type f -mmin +1
查找当前路径下小于 2M 的文件/目录:
find . -size -2M
查找大于 50M 且小于 100M 的文件:
find . -size +50M -size -100M
查找大于 10K 且小于 10M 的文件:
find . -size +10k -size -10M
查找当前路径下超过 10M 的所有 .mp3 文件并删除它们:
find . -type f -name "*.mp3" -size +10M -exec rm {} \;
当需要进行基于 OR 运算的查找时,可以加上 -o 开关。查找当前路径下以 .h 或 .cpp 结尾的所有文件:
find . -name "*.h" -o -name "*.cpp"
grep
grep [options] [pattern] file
常用参数总结:
使用 grep 在文件中搜索字符串:
grep root /etc/passwd# 不区分大小写grep -i ROOT /etc/passwd# 匹配多个查找词grep -e root -e bash /etc/passwd# 显示匹配行号grep -n root /etc/passwd# 仅显示匹配到的行数grep -c root /etc/passwd# 将匹配行的前两行和后三行显示出来grep -A3 -B2 root /etc/passwd# 显示不包含查找词的行grep -v root /etc/passwd
使用 grep 在文件夹中搜索字符串:
grep -r malloc .# 仅显示匹配到的文件名grep -r -l malloc .
使用 grep 进行正则表达式的查找:
# 匹配字母数字开头的行并显示行号grep -n '^[0-9a-zA-Z]' test.txt# 匹配非英文字母开头的行grep '^[^a-zA-Z]' test.txt
正则表达式主要依赖于元字符,以下是一些元字符的介绍:
| |
| |
| |
| |
| |
| |
| |
| 转义字符,用于匹配一些保留的字符,[ ] ( ) { } . * + ? ^ $ \ \ |
使用 grep -E 或 egrep 可以基于扩展正则表达式进行查找
| |
| |
| |
| |
| 或运算符,匹配符号前或后的字符 |
| 匹配 num 个大括号之前的字符或字符集 (n <= num <= m) |
# 匹配含有123或boy的行grep -E '123|boy' test.txt# 匹配至少出现一个数字的行grep -E '[0-9]+' test.txt# 匹配至少出现2个o至多出现3个o的行grep -E 'o{2,3}' test.txt
sort
sort 命令的基本语法如下:
sort [选项] [文件]
常用选项包括:
假设有一个文本文件 file.txt,内容如下:
Tom 25 MaleJerry 22 FemaleAlice 27 FemaleLucy 9 Female
使用 sort 按字典顺序对每行进行排序:
sort file.txt
Alice 27 FemaleJerry 22 FemaleLucy 9 FemaleTom 25 Malele
使用 sort 按第二列数值大小进行排序:
sort -k 2 -n file.txt
Lucy 9 FemaleJerry 22 FemaleTom 25 MaleAlice 27 Female
使用 sort 先按第三列降序排序,再按第二列数值大小升序排序:
sort -k 3r -k 2n file.txt
Tom 25 MaleLucy 9 FemaleJerry 22 FemaleAlice 27 Female
使用 sort 对文件进行去重并按第二列数值大小进行排序:
sort -u -k 2n file.txt
Lucy 9 FemaleJerry 22 FemaleTom 25 MaleAlice 27 Female
使用 sort 按照文件大小进行排序:
du -sh * | sort -h
ln -s
使用 ln -s 命令为某一个文件/文件夹在另外一个位置建立一个同步的链接:
ln -s [源文件] [目标文件]
当多个目录用到相同的文件时,只需在一个固定的目录放上该文件,在其它目录下使用 ln -s 命令链接就可以,以避免重复占用磁盘空间。
lsb_release -a
使用 lsb_release -a 查看 Ubuntu 系统的详细信息:
lsb_release -a
Distributor ID: UbuntuDescription: Ubuntu 22.04 LTSRelease: 22.04Codename: jammy
使用 cat /etc/*release* 查看 Centos 系统的详细信息:
cat /etc/*release*
free
使用 free 命令查看服务器内存信息:
free -h
scp
使用 scp 将远程文件/文件夹复制到本地:
scp [-r] [远程用户名]@[远程IP地址]:[远程文件/目录] [本地目录]
scp ubuntu@10.41.157.40:/home/wangzejun/code/test.cpp /data/wangzejun/code
firewall-cmd
在 CentOS 系统上使用 firewall-cmd 开放 1369 端口:
firewall-cmd --permanent --add-port=1369/tcp
重新加载防火墙策略:
firewall-cmd --reload
查看 1369 端口是否被开启:
firewall-cmd --permanent --query-port=1369/tcp
iptables
在 Ubuntu 系统上使用 iptables 开放 1369 端口:
sudo iptables -A INPUT -p tcp --dport 1369 -j ACCEPT
查看端口开启情况:
sudo iptables -L
tar
使用 tar 解压 tar.gz 和 tar.bz2:
tar -xvf test.tartar -zxvf test.tar.gztar -jxvf test.tar.bz2
使用 tar 压缩文件夹为 tar.gz 和 tar.bz2:
tar -cvf test.tar test/tar -zcvf test.tar.gz test/tar -jcvf test.tar.bz2 test/
-c 表示创建新的归档文件, -z 表示对归档文件使用 gzip 压缩,-j 表示对归档文件使用 bzip2 压缩,-v 表示显示命令执行过程,-f 指定归档文件的名称,-x 表示释放归档文件中的文件及目录。
zip
使用 zip 压缩文件或文件夹:
# 压缩文件zip test.zip test.txt# 递归压缩文件夹,-q表示不显示压缩过程zip -r -q test.zip test/
使用 unzip 解压:
unzip -q test.zip
gzip
使用 gzip 压缩文件为 .gz 形式:
# 删除原始文件gzip test.txt# 保留原始文件gzip -k test.txt
使用 gunzip 或 gzip -d 解压:
# 删除.gz文件gunzip test.txt.gzgzip -d test.txt.gz# 保留.gz文件gunzip -k test.txt.gz
ps -aux
在 Linux 系统中,ps -aux 是用于查看系统进程信息的命令。
ps -aux 会列出当前系统中所有用户的所有进程,并显示详细的用户信息,包括没有控制终端的进程。示例输出如下:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 16336 1108 ? Ss Dec01 0:02 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S Dec01 0:00 [kthreadd]
...
john 123 0.1 0.5 123456 7890 pts/0 R+ Dec01 1:23 /usr/bin/example-command
USER 表示进程的用户,PID 是进程的 ID,%CPU 和 %MEM 分别表示 CPU 和内存的占用百分比,COMMAND 是启动进程的命令。
查看 527706 进程的详细信息:
ps -aux | grep 527706
使用 netstat -anp 命令可以查看某个端口号对应的进程 ID:
# 查看9000端口对应的进程IDnetstat -anp | grep 9000