Shell Command Cheatsheet
文章目录

Before All

Vim 快速索引

  • /{keyword} : 向后查找
  • ?{keyword} : 向前查找
  • n : 查找下一个
  • N : 查找上一个

查询指令使用方法

1
2
3
4
man {cmd}

man ls
man touch

查询指令来源

有时候一些指令可能已经被 Aliased, 所以可以用 which {cmd} 来查看是不是原生指令

文件管理

TL’DR

1
2
3
4
5
6
7
8
cp                        # 复制
mv # 剪切, 也可以用作重命名
rm # 删除
ls # 列出文件
ls -l # 以 KB 为单位显示列表
ls -al # 列出所有文件 (包括隐藏) 的详细信息
ll # 同上, 这个是缩写
ls -lh # 列出文件并显示详细信息

echo 输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ---------------------- 参数 -------------------------
-n # 不输出结尾的换行符
-e "\a" # 发出警告音
-e "\b" # 删除前面的一个字符
-e "\c" # 结尾不加换行符
-e "\f" # 换行, 光标扔停留在原来的坐标位置
-e "\n" # 换行, 光标移至行首
-e "\r" # 光标移至行首, 但不换行
-E # 禁止反斜杠转移, 与 -e 参数功能相反

# ---------------------- 实例 -------------------------
enho 123123
enho '123123' # 同上
echo $PATH # 输出变量 PATH 的值
echo \$123 # 如果要输出美元符号, 那么就要加上转义符
echo "It is a test" > linuxcool # 将内容输出到一个文件里面.
echo `date` # 这个地方使用反斜杠, 可以执行特定的命令, 类似 eval
echo -e "a\nb\nc"

扩展: 带颜色的文字

主要就是选中其中三个色值, 输出了之后要记得加上一段 \e[0m 来恢复正常的颜色.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for clbg in {40..47} {100..107} 49; do
#Foreground
for clfg in {30..37} {90..97} 39; do
#Formatting
for attr in 0 1 2 4 5 7; do
#Print the result
echo -en "\e[${attr};${clbg};${clfg}m${attr};${clbg};${clfg}\e[0m "
done
echo #Newline
done
done

echo 'Usage:'
echo 'echo -e "\\e[AAAA;BBBB;CCCCm Content \\e[0m"'

find 查找文件

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
# ---------------------- 参数 -------------------------
-name # 按名称查找
-size # 按大小查找
-user # 按属性查找
-type # 按类型查找
-iname # 忽略大小写

# ---------------------- 实例 -------------------------

# 默认递归查找
# 搜索的字段带上引号!!!

find /etc -name "*.conf" # 查看 /etc .conf 结尾的配置文件
find /etc -name *.conf # 这样就变成了只从当前根目录下的 *.conf 文件里面查找




find /etc -name "*.conf" -maxdepth 1 # 只查找一层
find . # 列出当前目录及子目录下所有文件和文件夹
find /etc -size +1M # 查看 /etc 目录下面大于 1M 的文件
find $HOME -print # 查找当前用户主目录下的所有文件
find /home -name "*.txt" # 在/home 目录下查找以.txt 结尾的文件名
find /var/log -iname "*.log" # 在/var/log 目录下忽略大小写查找以.log 结尾的文件名
find . -type f -atime +7 # 搜索超过七天内被访问过的所有文件
find . -type f -amin +10 # 搜索访问时间超过 10 分钟的所有文件
find /home ! -name "*.txt" # 找出/home 下不是以.txt 结尾的文件

touch 创建文件

1
2
3
touch {FileName}                # 创建文件, 大小写敏感
touch file1.txt file2.json # 可以创建多个文件
touch {1, 2}{3, 4} # 可以用一些办法进行组合创建

cat 输出文件

1
2
3
cat {FileName}

cat -n index.md # 带上行号输出文件

rm 删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ---------------------- 参数 -------------------------
-f # 强制删除不提示
-i # 开一个交互形式让用户决定是否删除
-r -R # 递归删除下属目录所有
-v # 显示命令详细内容

# ---------------------- 语法 -------------------------
rm {FileName/Path}

# ---------------------- 实例 -------------------------
rm *.txt # 删除所有 txt
touch {1, 2}{.png, .txt} # 删除 1.png 2.png 1.txt 2.txt
rm !(important.txt) # 删除除了 important.txt 的所有文件
rm !(*.txt) # 删除所有非 txt 文件
rm !(h*) # 删除所有非 h 开头的文件, 大小写敏感
rm [0-9]* # 删除所有数字开头的文件
rm !([0-9]*) # 当然也可以使用非操作符
rm [a-c]* # 删除所有 a-c 开头的文件


# ---------------------- 实例 -------------------------
rm -ri *.txt # 递归删除当前文件夹下面所有 txt, 每一个文件都需要用户确认, 并且一定要输入 y 才删除
rm *.txt -ri # 错误! 参数要放到目录之前

扩展: rimraf

实际上就是 rm, 用法基本相同

1
rimraf . !(abc*)

需要注意一点, [symbolic name] 是一个名字不是一个路径, 因此必须进入到目录才能创建 ‘当前目录下指向另一个地方的 Symlink’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 创建 Symlink 到一个文件
ln -s [path of the target file/directory] [symbolic name]
ln -s my_folder/my_doc.txt my_document

## 创建 Symlink 到目录
ln -s my_folder my_doc_folder

## Overwrite 一个 Symlink, -sf 代表 force 修改
ln -s my_folder_2/my_doc_2.txt my_document
ln -sf my_folder_2/my_doc_2.txt my_document

## 查看已经创建的 Symlink
ls -l

## 查看 Symlink 的 inode code
ls -i

## 删除 Symlink
unlink [symlink name]

## rm 也可以删除多个 Symlink
rm folder1 folder2 folder2

输入输出重定向

  • 输出重定向: 通过命令将内容输出到 CLI 或者文件

  • 输入重定向: 将文件内容输入给某个命令

  • 标准输入重定向 (STDIN, 文件描述符为 0) : 默认从键盘输入, 也可从其他文件或命令中输入.
  • 标准输出重定向 (STDOUT, 文件描述符为 1) : 默认输出到屏幕.
  • 错误输出重定向 (STDERR, 文件描述符为 2) : 默认输出到屏幕.

输出重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ---------------------- 格式 -------------------------
命令 > 文件 # 将标准输出重定向到一个文件中 (清空原有文件的数据)
命令 >> 文件 # 将标准输出重定向到一个文件中 (追加到原有内容的后面)
命令 2> 文件 # 将标准输出重定向到一个文件中, 数字 2 是个关键字, 必须写上去
命令 2>> 文件 # 附加输出模式也可以和 2 一起使用
命令 >> 文件 2>&1 # 将标准输出与错误输出共同写入到文件中 (追加到原有内容的后面)
命令 &>> 文件 # 同上


# ---------------------- 示例 -------------------------
echo "Test" > readme.txt # 通过标准输出到文件, 清空文件所有内容并全部改写
echo "Test" >> readme.txt # 通过标准输出到文件, 加到原内容结尾
ls > readme2.txt # 各种命令都可以
ls >> readme3.txt # 这个是附加模式

# ---------------------- 示例 -------------------------
echoo Test 2> readme.txt # 注意这里语法有问题, 但是因为使用了 2 这个关键字, 会将错误输入到文件中
echooo Test 2>> readme.txt # 会看到在 readme.txt 底部多出了一行说 无法找到命令 echooo

输入重定向

1
2
3
4
5
6
命令 < 文件           # 将文件作为命令的标准输入
命令 << 分界符 # 从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2 # 将文件1作为命令的标准输入并将标准输出到文件2


wc -l < readme.txt

| 管道命令符 (pipe)

简单格式: 命令A | 命令B | 命令C

主要目的: 把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入

通配符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*                             # 任意字符
? # 单个任意字符
[a-z] # 单个小写字母
[A-Z] # 单个大写字母
[a-Z] # 单个字母
[0-9] # 单个数字
[135] # 特定几个数字
[[:alpha:]] # 任意字母
[[:upper:]] # 任意大写字母
[[:lower:]] # 任意小写字母
[[:digit:]] # 所有数字
[[:alnum:]] # 任意字母加数字
[[:punct:]] # 标点符号
{AA,BB,CC} # 字符串枚举
{1,2,3,4,5}

管道命令符的扩展用法

主要就是横线/连字符符号 -, 很多软件中这个符号代表输出

1
2
# 将错误输入使用 gvim 打开
myprogram 2>&1 | gvim -
1
2
# 将标准输出用 code 打开
myprogram| code -

转义字符

  • 反斜杠 (\) : 使反斜杠后面的一个变量变为单纯的字符.
  • 单引号 (’ ') : 转义其中所有的变量为单纯的字符串.
  • 双引号 (" ") : 保留其中的变量属性, 不进行转义处理.
  • 反引号 (` `) : 把其中的命令执行后返回结果.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PRICE=5
echo "Price is $PRICE"
# Output
Price is 5

# ------------------------------

echo "Price is \$$PRICE"
# Output
Price is $5

# ------------------------------

echo `uname -a`
# Output
Linux linuxprobe.com 4.18.0-80.el8.x86_64 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

环境变量

1
2
3
4
5
6
7
8
9
10
HOME                    # 用户的主目录 (即家目录)
SHELL # 用户在使用的 Shell 解释器名称
HISTSIZE # 输出的历史命令记录条数
HISTFILESIZE # 保存的历史命令记录条数
MAIL # 邮件保存路径
LANG # 系统语言, 语系名称
RANDOM # 生成一个随机数字
PS1 # Bash 解释器的提示符
PATH # 定义解释器搜索用户执行命令的路径
EDITOR # 用户默认的文本编辑器

自定义环境变量

1
2
3
4
WORKDIR=/home/workdir     # 自定义一个环境变量
echo $WORKDIR
export WORKDIR # 导出这个环境变量以方便其他用户使用
unset WORKDIR # 取消设置环境变量

grep 内容搜索

grep 是 “Global Regular Expression Print” 的简称

主要有三个命令:

  1. grep
  2. egrep = grep -E
  3. fgrep = grep -F
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
# ---------------------- 示例 -------------------------
grep 123 file.txt # 从 greptest.txt 这个文件中查找含 123 这个字段的行
grep 123 *.txt # 从一堆文件里面查找含 123 这个字段的行
grep 123 -c *.txt # 不显示内容, 仅显示匹配的数量.
grep 123 -r *.txt # 递归搜索子目录.
grep 123 -w *.txt # 匹配整个单词
grep 123 *.txt | grep 234 # 搜索结果中再次搜索还有 234 的内容.
grep ^.23 *.md # 注意搜索的关键字里面.


grep -c "48" test.txt # 统计所有以"48"字符的行有多少
grep -i "May" test.txt # 不区分大小写查找"May"所有的行)
grep -n "48" test.txt # 显示行号; 显示匹配字符"48"的行及行号, 相同于 nl test.txt |grep 48)
grep -v "48" test.txt # 显示输出没有字符"48"所有的行)
grep "471" test.txt # 显示输出字符"471"所在的行)
grep "48;" test.txt # 显示输出以字符"48"开头, 并在字符"48"后是一个 tab 键所在的行
grep "48[34]" test.txt # 显示输出以字符"48"开头, 第三个字符是"3"或是"4"的所有的行)
grep "^[^48]" test.txt # 显示输出行首不是字符"48"的行)
grep "[Mm]ay" test.txt # 设置大小写查找: 显示输出第一个字符以"M"或"m"开头, 以字符"ay"结束的行)
grep "K…D" test.txt # 显示输出第一个字符是"K", 第二, 三, 四是任意字符, 第五个字符是"D"所在的行)
grep "[A-Z][9]D" test.txt # 显示输出第一个字符的范围是"A-D", 第二个字符是"9", 第三个字符的是"D"的所有的行
grep "[35]..1998" test.txt # 显示第一个字符是 3 或 5, 第二三个字符是任意, 以 1998 结尾的所有行
grep "4/{2, /}" test.txt # 模式出现几率查找: 显示输出字符"4"至少重复出现两次的所有行
grep "9/{3, /}" test.txt # 模式出现几率查找: 显示输出字符"9"至少重复出现三次的所有行
grep "9/{2, 3/}" test.txt # 模式出现几率查找: 显示输出字符"9"重复出现的次数在一定范围内, 重复出现 2 次或 3 次所有行
grep -n "^$" test.txt # 显示输出空行的行号
ls -l | grep "^d" # 如果要查询目录列表中的目录 同: ls -d *
ls -l | grep "^d[d]" # 在一个目录中查询不包含目录的所有文件

grep 和其他命令的组合使用

1
2
3
4
5
6
7
# 将命令执行结果传递给下一个命令
grep -c "48" test.txt | grep -c "49"

# 将命令结果当做命令的参数
grep code `grep -rl "titan" . ` # 使用 code 执行所有包含 "titan" 的文件
grep -rl "titan" . | xargs echo # 使用 echo 执行所有包含 "titan" 的文件