Linux命令总结

1,227 阅读11分钟

1. 常用命令

注意: 在终端中使用source命令让脚本生效的时候, 需要在当前环境下使用命令, 比如如果想在vscode中使用新命令, 就在vscode中输入source命令。 如果在item中输入source命令, 那么vscode必须重启后才能执行最新脚本。

alias d="npm run dev" // 给命令设置别名 👍
alias |grep d // 查看命令是否生效
unalias d // 删除别名
alias // 查看具体命令的别名
cd - // 返回上一次所在的目录 ❤️
man rm // 查看rm的作用和使用方法, 按q退出 🇨🇳
pwd // 查看目录的完整路径
cp 源文件 目标文件 // cp 参数 源文件 目标文件 参数-r表示对目录进行递归操作 常用 cp -a
cp -R /Users/andy/hwt-project0703/RIM90_chengduBig/. ./   // 把文件夹下所有文件复制到另一个文件,包含隐藏文件
//参数含义: ①-p 保留原始文件属性 ②-d 若对象为"链接文件",则保留"链接文件"属性 ③-r 递归持续复制(用于目录) ④-i 若目标文件存在则询问是否覆盖 ⑤-a 相当于(-pdr)
mv 源文件 目标文件 // 用于剪切文件或将文件重命名。如果目标文件存在,移动文件到目标文件。否则则是改名操作
diff file1 file2 // 比较并显示两个文件的差异
ps // 显示当前进程状态
lsof -i :9527 // 显示端口9527所占用的进程。 
kill -9 30142 // 根据PID号终止进程
history // 列出最近执行过的几条命令及编号 👍
!513 // 重复执行最近执行过的某条命令, 配合history列出的命令使用。 👍
ctrl+r // 搜索最近使用的命令 👍
date // 显示系统的当前日期和时间 === date "+%Y-%m-%d %H:%M:%S" // 2020-12-22 16:53:34 
date -s "20170901 8:30:00" // 将系统的当前时间设置为2017年9月1日8点30分的date
cal // 显示日历
ctrl+k // 剪切(删除)光标处到行尾的字符
ctrl+u // 剪切(删除)光标处到行首的字符
ctrl+w // 剪切(删除)光标前的一个单词
ctrl+y // 粘贴ctrl+u/ctrl+k/ctrl+w删除的文本
ctrl+a // 光标回到行首
ctrl+e // 光标回到行尾
ctrl+f // 光标向右移动一个字符(相当于方向键右键)
ctrl+b // 光标向左移动一个字符(相当于左向键右键)
option+方向键 // 光标移动一个单词
ctrl+c // 中断终端正在执行的任务或删除整行
ctrl+l // 清除屏幕👍
mkdir // 创建空白的目录。 可以结合-p参数来递归创建具有嵌套叠层关系的文件目录  mkdir -p a/b/c
echo 'hello world!' >> 1.txt // 将hello world! 添加到1.txt文本的末尾
vim 1.txt // 打开1.txt
rf // 删除文件或目录
:wq // 保存编辑操作退出
:wq! // 保存编辑强制退出
top // 动态的监视进程活动与系统负载等信息
who // 用于查看当前登入主机的用户终端信息
cat // 查看纯文本文件  -n 显示行
more // 查看纯文本文件(内容较多的)
find // 按照指定条件来查找文件  find *a* 查找包含a的文件
find . -name test.js // 查找当前目录下的所有test.js文件 👍   find . -name "test*" 支持用通配符
echo $SHELL // 将变量SHELL的值输出到屏幕上
export -p // 打印所有全局变量;
export MYEVN=nihaoa哥们"哈哈" // 设置全局变量;
echo $MYENV // 查看全局变量 
unset MYEVN // 取消某个变量
which cmd // 查看cmd命令的全路径
cmd --help // 查看cmd的帮助命令
wc [option] [file] // 统计文件的行数、单词数或字节数
sudo vim /etc/hosts // 打开host文件 
sed 's/\[[0-9]*\]/\[456\]/g' 5.txt > 1.txt // 将5.txt中的[数字]替换为1.txt中的[456]。
pkill node // linux 杀死所有nodejs 进程
pwd | pbcopy // 查看当前路径, 并复制到剪切板
ssh-keygen -t rsa -C "your_email" // 生成秘钥
cat ~/.ssh/id_rsa.pub // 查看秘钥
export HISTIGNORE="pwd:ls:clear"  // 将pwd ls clear等命令不计入 历史记录

2. linux/mac下自定义命令alias, 永久生效(重启不失效)

编辑~/.bashrc文件。如果没有就新建touch ~/.bashrc 在末尾每行加入一个alias命令。 打开文件的命令open -e ~/.bashrc


# HomeBrew
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.cloud.tencent.com/homebrew-bottles
export PATH="/usr/local/bin:$PATH"
export PATH="/usr/local/sbin:$PATH"
# HomeBrew END


function autoGitCommit(){
	if [[ $2 == '' ]]
	then
		git add . && git commit -m "FEATURE:"$1 && git pull && git push
	elif [[ $2 == 'b' ]]
	then
		git add . && git commit -m "BUGFIX:"$1 && git pull && git push
	elif [[ $2 == 'o' ]]
	then
		git add . && git commit -m "OTHER:"$1 && git pull && git push
	elif [[ $2 == 'm' ]]
	then
		git add . && git commit -m "MERGE:"$1 && git pull && git push
	elif [[ $2 == 'p' ]]
	then
		git add . && git commit -m "OPTIMIZE:"$1 && git pull && git push
	fi
}

function autoGitUpBugFix(){
	if [[ $1 == '' ]]
	then
		git add . && git commit -m "BUGFIX:" `date "+ %Y年%m月%d日%H时%M分%S秒"`刘力豪 && git pull && git push
	else
		git add . && git commit -m "BUGFIX:"$1 && git pull && git push
	fi
}


Function updateGaea(){
	if [[ $1 == '' ]]
	then
		npm run build:prod && touch `date "+ %Y年%m月%d日%H时%M分"`gaea打包 && scp -r ./dist/* "root@192.168.12.221:/gaeadata/view" && echo '成功'
	else
		touch `date "+ %Y年%m月%d日%H时%M分"`gaea打包 && scp -r ./dist/* "root@192.168.12.221:/gaeadata/view" && echo '成功构建无build'
	fi
	
}

function gitClone(){
    if [[ $1 != '' ]]
    then
        local middleWare=${1##*/}
        echo $middleWare
        local splitStr=${middleWare%%.*}
        echo $splitStr
        cd /Users/andy/test/testProject && git clone $1 && cd $splitStr && code . && npm i && npm run dev || npm run start || npm run serve
    fi
}

Function changeFile(){
	ALL_SH_FILE=$(find . -name "*.txt")
	echo '$ALL_SH_FILE'
}

# 正则切换 分支
gcbFunc() {
 REGEX=$1
 TARGET="$(git branch | grep -E $REGEX | grep -vx "\*.*" | head -n 1 | tr -d '[:space:]')"

 if [[ -z $TARGET ]]; then 
   echo "Use regex '$REGEX' to match null"
 else
   echo "Use regex '$REGEX' to match branch '$TARGET' ====> '$REPLY'"
   git checkout $TARGET
 fi
}


echo $MYDATE
alias b='npm run build'
alias d='npm run serve || npm run dev || npm run start'
alias cpb='npm run build && rm -rf /Users/andy/document-root/rootDist/*.zip && cp ./*.zip /Users/andy/document-root/rootDist && open /Users/andy/document-root/rootDist/'
alias sl='svn up && svn log -l 5'
alias ci='cnpm i && k'
alias c='clear'
alias dd='npm run deploy'
alias ddk='npm run deploy:k'
alias dd2='npm run deploy244'
alias dda='npm run deploy && npm run deploy244:k'
alias h='history'
alias oz='open -e ~/.zshrc'
alias sz='source ~/.zshrc'
alias sss="ss && ss 2"
alias oo="autoImportProductOperators"
alias ooo='oo && oo 2'
alias ppp="pp && pp 2"
alias k='pkill node && npm run serve || npm run dev || npm run start'
alias kk='pkill node'
alias sed='gsed'

alias gg='autoGitCommit'
alias ggg='autoGitUpBugFix'
alias t='nn ~/test/testProject/pc-template/src/views/exercise/test1.js' 
alias eq='cat /Users/andy/jinguiProject/wxweb-vue-main/src/constant.js > /Users/andy/projectRoot/wxweb-V2.21.0607/src/constant.js && cat /Users/andy/jinguiProject/wxweb-vue-main/src/constant.js > /Users/andy/projectRoot/wxweb-V2.21.0825/src/constant.js'
alias ii="cd /Users/andy/jinguiProject/wxweb-vue-main && gsed -i 's/\[[0-9]*]/\[1\]/g' ./src/constant.js"
alias rn="rm -rf node_modules && npm cache clear --force && npm install && d"
alias tt='test'
alias l='npm run lint'
alias ni='npm install'
alias nu='npm update'
alias r='npm run '
alias nuu='npm update @kd/components'
alias gb='git branch'
alias ga='git add .'
alias g.='git checkout .'
alias gs='git status'
alias gc='git checkout'
alias tt='echo `date "+ %Y年%m月%d日%H时%M分"`'
alias gd='git diff'
alias gp='git pull'
alias ll='ls -l'
alias la='ls -a'
alias s='npm run start:main'
alias gl='git log'
alias glo='git log --oneline'
alias ip="ifconfig | grep -oE 'inet.*netmask' | grep -oE '(\d+\.){3}\d+' | sed -n 2p"
alias glol='git log –graph –pretty = format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit'
alias pwdc="pwd && pwd | pbcopy"
alias test='changeFile'
alias gcb='gcbFunc'
alias ns='ng serve'
alias nn='node'
alias a='alias'
alias cd.d='cd /Users/andy/Desktop'
alias cd.i='cd /Users/andy/Downloads'
alias cd.t='cd /Users/andy/test'
alias cd.p='cd /Users/andy/previewProject'
alias o.d='open /Users/andy/Desktop'
alias o.i='open /Users/andy/Downloads'
alias o.t='open /Users/andy/test'
alias o.p='open /Users/andy/previewProject'

alias cd.kk='cd /Users/andy/kjReview'
alias ga='updateGaea'
alias cd.k='cd /Users/andy/kj'
alias cd.g='cd /Users/Andy/test/github_project'
alias zz='code /Users/andy/kj/gaea-fe'
alias kx='code /Users/andy/kj/lab-fe'
alias nd='npm run deploy'
alias ndk='npm run deploy:k'

保存文件后运行: source ~/.bashrc。 如果还不行的话,说明没有~/.bash_profile文件,或者文件中没有执行.bashrc文件。 (.bash_profile文件是用户登陆终端的时候会自动执行的文件,一般此文件中会调用.bashrc) 如果是这样,需要打开(如果没有的话先创建)文件: ~/.bash_profile 在里面加入一行:source ~/.bashrc。 退出保存后执行 source ~/.bash_profile 使刚才的配置生效就可以了。

注意: 如果你的终端安装了Zsh,发现使用上面的步骤后并不一定生效,经过排查后发现Zsh有自己的启动默认执行的文件 ~/.zshrc ,要在Zsh中使alias永久生效,则仅需编辑 ~/.zshrc 文件,操作方法跟上面一致。 最后输入alias查看自己的别名有没有生效吧。

open -e ~/.zshrc
source ~/.zshrc

建议安装zsh使用更多的功能。 目前github已经有121kstar了, 足见它的流行。zsh git地址

3. vi命令详解

vi是Linux命令行解码下的文字编辑器。而vim是vi命令的曾倩版,与vi编辑器完全兼容, 建议使用vim。 一般来说, vim可分为三种模式: 普通模式, 编辑模式, 命令模式。

  • 普通模式: 用vim命令打开一个文件, 默认状态就是普通模式。 在普通模式中, 不能进行编辑输入操作。 但是可以执行一些操作命令如删除、复制、粘贴等之类的工作
  • 编辑模式: 只有按下i, I, o, O, A, r, R, s, S(其中i最常用)等字幕后才可以执行录入文字等编辑操作。看文件是否处于编辑模式,就是串口左下角要有插入的标记--INSERT----插入--。按esc退到普通模式。
  • 命令模式: 在普通模式下。 输入:/?时,光标会自动定位在那一行。 在这个模式中,可以执行保存、退出、搜索、替换。输入:wq(保存退出)或:wq!(强制保存退出)。按esc退到普通模式
// 命令模式下
shift + g // 跳转到最后一行
gg // 跳转到第一行
dd // 删除当前行
:e! // 文件重新载入 
p //黏贴 将光标移动到黏贴行, 按"p"进行黏贴
/要查找的字符 + enter // 查找

4. 如何在linux终端同时运行多个linux命令

在一行中运行两个或多个命令可以节省大量时间,并在Linux中提高效率。 而在linux中,有三种方法可以在一行中运行多个命令; && ||

  1. 使用 ; 符号运行多条命令
cmd1;cmd2;cmd3

cmd1将首先运行,不管cmd1运行成功还是出现错误,cmd2都会在它之后运行,当cmd2命令完成时,cmd3将会运行

  1. 使用 && 符号运行多条命令 有时候希望确保Linux命令中,只有在前一个命令成功结束时,下一个命令才会运行。这就是逻辑和运算符&&出现的地方:
cmd1 && cmd2 && cmd3 // 短路逻辑

当&&前面的一个命令出现错误时,&&分隔的命令会停止执行后面的命令

  1. 使用&符号运行多条命令 后一个命令必须等前一个命令运行完, 不关心是否成功,使用单与号(&)
cmd1 & cmd2  // cmd2必须等cmd1运行完, 不论cmd1是否成功。 cmd1和cmd2都会运行
  1. 使用 || 符号运行多条命令 可以使用逻辑操作符(||)运行命令行,但是只有在前一个命令出现错误时才运行下一个命令
md1 || cmd2 || cmd3 // 这三个命令并行执行

如果cmd1运行失败,则运行cmd2。如果cmd2运行成功,cmd3将不会运行。 5. 合并使用&&||运算符 例如,可以检查文件是否存在,并相应地打印消息

[root@localhost ~]# [ -f file.txt ] && echo "File exists" || echo "File doesn't exist"

5. ctrl + z挂起后, 恢复的命令是什么

  • fg: 将后台程序转入到前台
  • bg: 将前台程序转入到后台

6. 远程命令相关

假如本地是root, 远程是182.92.227.130。 远程的命令跟本地是一模一样的。 直接连接远程进入的是root文件夹。

ssh root@182.92.227.130 // 连接到远程服务器. 注意, 连接进去首先进入的是root文件夹
ssh root@182.92.227.130 cd ../andytest && mkdir qqqq && cd qqqq && echo '123'  // 连接远程服务器后直接执行下一个命令。 注意, 必须得先通过ssh root@182.92.227.130连接到远程服务器这些命令才生效, 否则不生效。
exit // 退出远程服务器
scp -r ./* root@182.92.227.130:/andytest // 将当前文件夹下所有文件递归复制到远程的andytest文件夹下
// 将本地秘钥复制到服务器的文件下
scp /Users/andy/.ssh/id_rsa.pub root@192.168.12.251:/home/id_rsa.pub 
// 在服务器中,将公共id, 追加到对应服务器秘钥下面
cat /static/id_rsa.pub >> root@192.168.12.205:/root/.ssh/authorized_keys

7. linux下用scp无需输入密码传输文件

win: ssh-keygen.exe mac: ssh-keygen 本地生成密钥一直回车
ssh-copy-id root@192.168.12.238(ip地址) 把公钥拷贝到服务器端

最近遇到个小问题。 每次一键传输项目到服务器的时候, 都需要输入密码。 这就非常麻烦。 解决办法: 将本地秘钥和服务器秘钥配对。 建立信任关系。

本地生成配对秘钥: ssh-keygen -t rsa

本地秘钥路径: ~/.ssh

将本地秘钥复制到服务的 /root/.ssh 目录中。 并改名为 authorized_keys

复制命令: scp ./id_rsa.pub root@182.92.227.130:/root/.ssh/authorized_keys

这样以后从本地到服务器传输代码就不需要密码了。

使用注意: 1. 可能~/.ssh/目录并不存在。 需要进入到服务器ssh root@182.92.227.130中手动创建。 2. 如果集气罩已经存在authorized_keys文件。 则文件可能包含多个SSH验证信息。 这时可用cat >> 命令将验证文件内容附加上去。 而不是直接复制替换。

8. sed修改文件内容命令

由于sed没有-i命令, 无法直接替换当前文件, 所以使用gsed命令。 需要先安装这个工具brew install gnu-sed

sed 's/\[[0-9]*]/\[456\]/g' 1.txt > 3.txt // 将1.txt中的[数字]替换成 [456]3.txt中。 
gsed -i 's/{0-9}*/\123]/g' ./src/constant.js // 直接替换当前文件的数字为123.

9. 一些常用的语法和命令

tr -s "[\n]" <1.txt >2.txt // 清除1.txt中的所有空格并输入到2.txt中
tr "[a-z]" "[A-Z]" <3.txt >4.txt // 将3.txt中的小写字母转换成大写字母并输入到4.txt中
// if elif else的语法
if [[ $1 == 1 ]]
then
    echo $1
    echo "这是1"
elif [[ $1 == 2 ]]
then
    echo $1
    echo "2"
else
    if [[ $1 == "" ]]
    then
        echo "$1没有值"
    else
        echo '$1有值且不为1或2'
    fi
fi