shell指令 罗列一些常见的shell指令供翻阅与学习
基本知识 –help和man: 查阅帮助 使用man命令手册查阅命令的详细说明和参数,或者–help
在程序间创建连接 默认的输入流和输出流分别为键盘和显示屏,但是 < file 和 > file 可以将输入输出重定向到文件;如果要追加,使用 >> ;而使用 | 可以将一个程序的输出和另一个程序的输入连接起来
命令分隔符
;: 无论前面命令是否执行成功,都会执行后面的命令
&&: 前面命令执行成功时才执行后面的命令
||: 前面命令执行失败时才执行后面的命令
子命令 用于把一个命令的输出结果作为另一个命令的参数
1 2 echo "共有 $(ls | wc -l) 个文件" cat $(find . -name "*.log" )
执行文件 使用 ./file 即可
相对路径和绝对路径 注意 / 代表系统的根目录;某个路径以 / 开头,则为绝对路径,否则为相对路径; . 表示当前目录, .. 则表示上级目录
关于权限 每个文件或目录都有三类用户的权限:
u: 文件所有者
g: 文件所属组
o: 其他用户
a: 所有用户,即u+g+o
每类用户用三个字母表示其权限:
r: 读,查看内容
w: 写,修改内容
x: 执行文件或进入目录
-: 不具备此权限
权限可以使用数字法表示,即三种权限代表的数字相加,三个数字分别对应三类用户,其中:
也可以使用字母符号法:
+: 添加权限
-: 去除权限
=: 设置为指定权限
常用的shell指令 ls: 列出目录内容,即里面的文件和文件夹 1 2 3 4 5 6 7 ls ls -l ls -a ls -lh ls /path ls --color=auto ls -t
cd: 切换目录 1 2 3 4 cd /home/user cd ~ cd .. cd -
pwd: 显示当前目录的完整路径 mkdir: 创建新目录 1 2 mkdir newdir mkdir -p /tmp/dir1/dir2
rm: 删除文件或目录 1 2 3 4 rm file.txt rm -r dir rm -f file.txt rm -rf dir
cp: 复制文件或目录 1 2 3 cp source.txt dest.txt cp -r dir1 dir2 cp file1 file2 /some/dir/
mv: 移动或重命名文件或目录 1 2 3 mv old.txt new.txt mv file.txt /new/dir/ mv dir1 dir2 /path/
cat: 查看文件内容、合并文件、快速创建文件 1 2 3 cat file.txt cat file1 file2 > merged.txt cat > newfile.txt
more/less: 分页显示文件内容 1 2 more file.txt less file.txt
head: 查看文件开头内容 1 2 head file.txt head -n 20 file.txt
tail: 查看文件结尾内容 1 2 3 tail file.txt tail -n 20 file.txt tail -f log.txt
touch: 创建新的空文件,或者更新已存在文件的时间戳 1 2 touch file.txt touch file1 file2
echo: 输出文本或变量的值 1 2 3 echo "Hello, world!" echo $HOME echo "PATH is $PATH "
grep: 根据字符串或正则表达式搜索文本内容 1 2 3 4 5 grep "pattern" file.txt grep -i "pattern" file.txt grep -r "pattern" ./dir grep -n "pattern" file.txt grep -v "pattern" file.txt
sort: 对文件每一行进行排序 1 2 3 4 5 sort file.txt sort -n file.txt sort -r file.txt sort -k 2 file.txt sort -u file.txt
uniq: 删除重复行 1 2 3 4 uniq file.txt sort file.txt | uniq uniq -c file.txt uniq -d file.txt
awk: 功能多样 1 2 3 4 awk '{print $1}' file.txt awk -F ':' '{print $1, $3}' /etc/passwd awk '$3 > 1000 {print $1}' /etc/passwd awk '{sum += $2} END {print sum}' file.txt
cut: 按列提取文本 1 2 3 cut -d ':' -f 1 /etc/passwd cut -c 1-5 file.txt cut -f2,4 -d',' data.csv
sed: 流编辑器,批量处理文本内容 1 2 3 4 5 6 7 sed 's/old/new/' file.txt sed 's/old/new/g' file.txt sed '2d' file.txt sed '2,4d' file.txt sed -n '5,10p' file.txt sed '2i\插入内容' file.txt sed '2a\追加内容' file.txt
添加 -e 选项以支持多条指令, -E 选项以支持正则表达式
wc: 统计文件内容 1 2 3 wc -l file.txt wc -w file.txt wc -c file.txt
diff/cmp: 比较文件差异 1 2 diff file1.txt file2.txt cmp file1.txt file2.txt
find: 查找文件或目录 1 2 3 find . -name "*.txt" find /home -type d -name "test*" find . -size +10M
locate: 在系统索引数据库中快速查找文件
使用 updatedb 定期更新数据库
chmod: 修改权限 1 2 3 4 5 6 7 8 9 chmod 777 test.txt chmod 644 test.txt chmod 600 secret.txt chmod +x run.sh chmod -R 755 /path/dir chmod u+x file.sh chmod go-w file.txt chmod a=r myfile chmod u=rw,go=r data.txt
chown: 修改所有者和所属组 1 2 chown user file.txtchown user:group file.txt
su/sudo: 切换用户/以管理者身份执行命令
ps: 查看进程
top/htop: 动态显示系统进程和资源占用情况 kill: 终止进程
df: 查看磁盘大小
du: 查看文件或目录大小 1 2 du -sh * du -h --max-depth=1
free: 查看内存使用 uname: 显示系统信息
ping: 测试主机之间的网络连接 1 2 ping www.baidu.com ping -c 4 www.baidu.com
ifconfig/ip: 显示或配置网络接口信息
curl/wget: 从网络获取文件或数据 1 2 curl http://example.com wget http://example.com/file.txt
history: 查看历史命令 date: 显示或设置系统时间 clear: 清屏 shell脚本 脚本开头:shebang 用于指定解释器
变量 使用变量时前面加上 $ ;赋值时等号左右不能有空格,否则视为参数;分隔符 ' 中的变量不会被转义,而 " 会将变量值进行替换;$(CMD) 实现命令替换,即用命令的输出进行替换;<(CMD) 则会执行命令并将结果输出到一个临时文件中
获取脚本参数
$0: 脚本名
$1: 脚本的第一个参数
$@: 所有参数(分开)
$*: 所有参数(整体)
$#: 参数个数
$?: 前一个命令的返回值(退出状态)
$$: 当前脚本的进程识别码
!!: 完整的上一条命令(含参数)
$_: 上一条命令的最后一个参数
条件判断 1 2 3 4 5 6 7 if [ condition ]; then command1elif [ condition2 ]; then command2else command3fi
常见条件运算符(整数):
-eq: 等于
-ne: 不等于
-gt: 大于
-lt: 小于
-ge: 大于等于
-le: 小于等于
字符串判断:
文件判断:
-e file: 文件存在
-f file: 普通文件
-d file: 目录
循环 1 2 3 4 5 6 7 8 for 循环for i in 1 2 3; do echo $i done for file in *.txt; do echo $file done
1 2 3 4 5 6 while 循环 count=1while [ $count -le 5 ]; do echo $count count=$((count+1 ))done
函数 1 2 3 4 myfunc () { echo "参数1:$1 " } myfunc "hello"
使用 source 指令加载函数
vim 懒得看了,待补充,参考指令 vimtutor ,或者vimtutor中文版
正则表达式 参考正则表达式30分钟入门教程
元字符
.: 匹配除换行符以外的任意字符,在Singleline模式也会匹配换行符;如果是想查找 . 这个字符本身,请使用转义 \.
\w: 匹配字母或数字或下划线,等效于 [A-Za-z0-9_]
\s: 匹配任何空白符
\d: 匹配数字
\b: 匹配单词开头或结束,如 \bhi\b 精确匹配单词hi
^: 匹配字符串的开始,在Multiline模式匹配行首
$: 匹配字符串的结束
限定符
*: 重复零次或更多次
+: 重复一次或更多次
?: 重复零次或一次
{n}: 重复n次
{n,}: 重复n次或更多次
{n,m}: 重复n到m次
注意限定符默认贪婪,即匹配尽可能多的字符,如 a.*b 匹配最长的a开始b结束的字符串;为了懒惰,即匹配尽可能少的字符,在限定符后加上 ? 即可
字符类 使用方括号,如 [aeiou] 匹配任意一个元音字母, [0-9] 等效于 \d
分枝条件 使用 | 匹配多个规则,类似于or,因此也要注意条件顺序
分组 使用圆括号来分组,从而匹配括号里的子表达式,并可以使用限定符约束;在这样做时实现了捕获,正则表达式从左到右为每个分组分配一个组号,后续使用 \1 可以代表分组1的文本(而分组0代表整个正则表达式)
捕获
(exp): 匹配exp,并捕获文本到自动命名的组里
(?<name>exp): 匹配exp,并捕获文本到名称为name的组里,也可以写成 (?'name'exp)
(?:exp): 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 如 (?=exp) 断言自身出现的位置的后面能匹配表达式exp,如 \b\w+(?=ing\b) 匹配以ing结尾的单词的前面的部分(除了ing以外的部分)
(?=exp): 匹配exp前面的位置
(?<=exp): 匹配exp后面的位置
(?!exp): 匹配后面跟的不是exp的位置
(?<!exp): 匹配前面不是exp的位置
注释 使用 (?#comment) 写注释
反义
\W: 匹配任意不是字母,数字,下划线的字符
\S: 匹配任意不是空白符的字符
\D: 匹配任意非数字的字符
\B: 匹配不是单词开头或结束的位置
[^x]: 匹配除了x以外的任意字符
递归匹配 用于判定括号匹配等等,使用了栈的思想
(?'group'): 把捕获的内容命名为group,并压入堆栈
(?'-group'): 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no): 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!): 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
命令行环境 终端多路复用 使用 tmux 实现基于面板和标签分割出多个终端窗口,从而同时与多个 shell 会话进行交互
会话 1 2 3 4 5 6 tmux tmux new -s mysession tmux ls tmux attach -t mysession tmux kill-session -t mysession tmux detach
窗口
Ctrl+b c: 新建窗口
Ctrl+b n: 下一个窗口
Ctrl+b p: 上一个窗口
Ctrl+b w 列出窗口列表
Ctrl+b ,: 重命名当前窗口
面板
Ctrl+b %: 横向分屏(左右)
Ctrl+b ": 纵向分屏(上下)
Ctrl+b o: 在各面板之间切换
Ctrl+b x: 关闭当前面板
Ctrl+b ;: 返回上一个面板
别名 使用 alias 指令取个简短的新名字
1 alias alias_name="command_to_alias arg1 arg2"
远端设备 使用 ssh 指令连接到其他服务器
1 2 3 4 5 ssh [user@]hostname [command ] ssh -p 2222 user@host ssh -i ~/.ssh/id_rsa user@host ssh -L 8080:localhost:80 user@host ssh -R 2022:localhost:22 user@host
公钥认证 1 2 ssh-keygen -t rsa ssh-copy-id user@host
配置文件 即设置 ~/.ssh/config 来简化指令
1 2 3 4 5 Host myserver HostName server.com User alice Port 2222 IdentityFile ~/.ssh/id_rsa
相关指令 1 2 scp file.txt user@host:/tmp/ tee
git 一些常用指令
日常同步和获取代码 1 2 git clone <address> git pull
代码变更管理 1 2 3 4 git status git add <file name> git add . git commit -m "message"
分支管理 1 2 3 4 5 git branch git checkout -b <feature> git checkout <feature> git merge <feature> git branch -d <feature>
推送与协作 1 2 git push git push -u origin <feature>
历史与排查 1 2 3 4 git log git log <file name> git diff git stash
场景举例 1 2 3 4 5 6 7 8 9 git pull git checkout -b <feature> git add . git commit -m <message> git push -u origin <feature> pr git checkout main git pull git branch -d <feature>