Shell Command Cheatsheet2021-07-06 20:07Dev, OS, Linux, Unix

Before All

Vim 快速索引

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

查询指令使用方法

man {cmd}

man ls
man touch

查询指令来源

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

文件管理

TL'DR

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

echo 输出

# ---------------------- 参数 -------------------------
-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 来恢复正常的颜色.

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 查找文件

# ---------------------- 参数 -------------------------
-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 创建文件

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

cat 输出文件

cat {FileName}

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

rm 删除文件

# ---------------------- 参数 -------------------------
-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, 用法基本相同

rimraf . !(abc*)

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

## 创建 Symlink 到一个文件
ln -s [path of the target file/directory] [symbolic name]
ln -s my_folder/my_doc.txt my_document
## 如果路径中含有空格那么就需要用引号包裹
ln -s "/Users/szhshp/OneDrive - ABC/Env Files/" "/Users/szhshp/Documents/Project/tmp/env-bk"


## 创建 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) : 默认输出到屏幕.

输出重定向

# ---------------------- 格式 -------------------------
命令 > 文件                          # 将标准输出重定向到一个文件中 (清空原有文件的数据) 
命令 >> 文件                        # 将标准输出重定向到一个文件中 (追加到原有内容的后面) 
命令 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    # 将文件1作为命令的标准输入并将标准输出到文件2


wc -l < readme.txt

| 管道命令符 (pipe)

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

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

通配符

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

管道命令符的扩展用法

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

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

转义字符

  • 反斜杠 (\) : 使反斜杠后面的一个变量变为单纯的字符.
  • 单引号 (' ') : 转义其中所有的变量为单纯的字符串.
  • 双引号 (" ") : 保留其中的变量属性, 不进行转义处理.
  • 反引号 (` `) : 把其中的命令执行后返回结果.
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

环境变量

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

自定义环境变量

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
# ---------------------- 示例 -------------------------
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    # 显示第一个字符是 35, 第二三个字符是任意, 以 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 和其他命令的组合使用

# 将命令执行结果传递给下一个命令
grep -c "48" test.txt | grep -c "49"

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