shell-cheet-sheet
bash 命令
sed(待补充完整)
sed 命令是用来处理文本行的
sedis a stream editor that works on piped input or files of text
以例子说明其用法
文件内容如下:a.py
def fizz_buzz(limit):
for i in range(1, limit+1):
if i % 3 == 0:
print('fizz', end="")
if i % 5 == 0:
print('fizz', end="")
if i % 3 and i % 5:
print(i)
def main():
fizz_buzz(10)
if __name__ == "__main__":
main()例子 1:使用正则表达式做文本替换
此处的 s/to/do/ 表示将 to 替换为 do,s 表示 substitute(替换)。
例子 2:挑选指定行
此处表示挑选第 4 至第 5 行打印,在默认情况下 sed 命令会将每行都打印出来,使用 -n 选项可以抑制这一行为,4,5p 中的 p 表示 print(打印)。
可以使用 -e 选项选择多个行,注意到第 2 行与第 3 行打印了两次
可以使用 5~3p 这种写法表示从第 5 行开始每隔 3 行进行打印
例子 3:文本替换
只替换第一个匹配
替换所有匹配
另外也可以进一步将 gp 换成 gip,其中 i 表示忽略大小写(case insensitive),另外 gip 三个字母的顺序可以随意调换
取前四行,将连续多个空格替换为一个空格
多个替换规则,两种写法均可,注意到第 2 行没有任何模式被匹配上,由于 -n 参数的原因没有被打印出来。
dirname
tee(待补充)
一般使用管道的方式进行使用,例如
一个常见的错误参考例 7:修改屏幕亮度
printf
printf 命令仿照 C 语言的 printf 函数,用于格式化输出,格式控制符 %-5s 表示左对齐(不加 - 则表示右对齐),最少使用 5 个字符长度,以字符串的形式输出。格式控制符 %-4.2f 表示最少使用 4 个字符长度,小数点后保留 2 位,以浮点数形式输出。
!
在 shell 中,! 被称为 Event Designators,用于方便地引用历史命令。
!20表示获取 history 命令中的第 20 条指令;!-2表示获取 history 命令中的倒数第 2 条指令;!!是!-1的一个 alia;!echo表示最近地一条以echo开头的指令;!?data表示最近的一条包含data的指令
echo、stty
echo 命令可以使用 -e 参数使得输出字符串中的转义字符产生效果;另外,echo 命令还可以控制输出的字体颜色,详细情形不赘述。
alias
别名相当于自定义命令,可以使用 alias 命令实现,也可以定义函数实现。此处仅介绍 alias 命令。
alias 命令产生的别名只在当前 shell 有效
du 与 df(待补充)
linux 中,目录本身占用一个 block,其大小为 4K,用于存储一些元数据,例如权限信息、修改时间等。
du 命令意为 disk usage,用于显示目录或文件的大小
df 命令意为 disk free
watch
sort
sort 命令的作用是以行为单位进行排序。-n 选项表示把字符当作数字进行排序,-k 7 选项表示选择第 7 列进行排序。可以使用 -t : 来指定列的分割符为 :,可以使用 -r 选项进行降序排列(默认是升序排列)
先按第二列降序按数值大小排列, 再按第三列排序。
更多玩法可参照博客
paste
将 a.txt 与 b.txt 按行进行拼接,拼接字符为 =,即:
-s表示把 a.txt 的每行进行拼接,拼接字符为 +,此条命令用于对一列数字求和
history(待补充)
history 命令用于显示历史命令。经过测试发现它的行为与 ~/.bash_history 文件有关,一个可以解释的逻辑如下,系统保留有一份历史命令的记录文件,进入一个终端后,执行任意一条指令都会在 .bash_history 文件末尾追加一条记录(不同终端有着独立的记录,互不影响),退出终端时,
打开两个终端,分别输入(各条命令的实际):
mount/umount
若 umount 时出现 device is busy 的错误,可以参照链接进行解决,摘录如下:
ps(待补充)
用于列出所有进程
nmap
打印本机打开的所有端口信息
ln
file -i
command
command 用于 shell 脚本中,忽略脚本定义的函数,而直接去寻找同名的命令
另一种情况更加常见:在 ~/.bashrc 中为 ls 定义了 alias
这种情况下
getopt
rsync
参考阮一峰博客
注:
此处
source后面的斜杠如果省略, 则目标位置将会形成destination/source的目录结构, 这可能不是所期望的rsync 命令默认会同步以
.开头的隐藏目录
awk
示例1
注意: 如果原始数据中以作为分割符, 但某些列可能为空字符串, 则必须指定
示例2: 引入外部变量
示例3: if
free
在 Mem 这一行: total = used + free + buff/cache, buff/cache 是指可以被操作系统回收的内存, 而 free 是完全没有被占用的内存, 而 used 里面包含 shared, shared 主要是内核空间或共享库占的内存, 而 available 是估算新创建一个进程时可以使用的内存(注意是估算的, 不是精确值), 一般大于 free, 但小于 free+buff/cache.
在 Swap 这一行: total = used + free
操作系统能使用的内存可以认为是 Mem(total) + Swap(total), 而 Mem 一般是对应真正的内存, 而 Swap 一般是对应磁盘, 一般情况下, 操作系统为了计算机整体性能, 可能会将 Mem 与 Swap 互相交换 (例如把程序 A 的某部分内存从 Mem 暂时换到 Swap 上, 后续又换回来). 而有些编程语言允许将内存声明为 page-locked memory (也称为 pinned memory), 这样会避免操作系统将这部分内存放到 Swap 上, 从而保障这些内存的访问速度. 但注意, 显式声明 pinned memory 可能影响计算机整体性能, 应按需使用 (此处的所谓 page-locked memory 也就是 pytorch dataloader 里的那个参数 pin_memory=True).
nc: 测试服务端口是否已经可用于接受连接
上述 nc 命令用于测试 localhost:5000 是否可以接受连接, until ...; do ...; done 是一个循环.
一般用于本地启动一个服务端程序绑定在 localhost:5000, 然后使用上述命令测试服务是否成功启动.
xargs
xargs 用于将标准输入转换为参数
Shell命令组合例子
例 2:管道、curl、grep、cut 结合使用
curl 命令用来请求 Web 服务器。其名字的含义即为客户端(client)的 URL 工具。具体用法可以参照阮一峰博客
它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。——阮一峰博客《curl 的用法指南》
grep 的 -i 参数表示匹配时忽略大小写
cut 命令用于切分字符串,有若干种用法:取出第 个到第 个字符;按分隔符取出第 个字符串。此处 cut 命令中用 --delimiter=' ' 指定分割符为空格,-f2 表示取出以该分割符分割产生的第二项
例 3:source、export
通常情况下,执行如下语句
实际发生的事情是:创建一个子进程,在子进程中运行 a.sh,然后回到当前 shell 中。注意子进程是用 fork 的方式产生的,因此子进程的环境变量与当前的 shell 是完全一致的。因此 a.sh 中设置的环境变量不会影响到当前的 shell。例子如下:
source 的作用是在当前 shell 中运行脚本内容, 使得脚本中设置的环境变量会影响到当前的 shell。例如:
备注:对于 source a.sh 这种执行方式来说,脚本中的 $0 为终端本身,例如:/bin/bash,而 ./a.sh 这种执行方式,脚本中的 $0 将会是 ./a.sh
例 4:带颜色的终端输出
\e[<...>m表示<...>中的部分为设置输出格式(字体颜色,背景颜色,是否加粗,是否产生闪烁效果等),\e也可以用\033代替。44;37;5:44表示设置背景色为蓝色,37表示设置前景色(也就是字体颜色)为白色,5表示字体产生闪烁效果 。备注:这些数字实际上被称为 SGR 参数(Select Graphic Rendition) ,这些数字的顺序是不重要的,完整的列表可以参见 ANSI escape code - Wikipedia,简短版的说明可以参见 简书。
\e[0m表示设定回终端的默认值
例 5:排除某些子目录的复制
排除 logs 与 images 子目录从 src 复制文件至 dst
grep -v表示排除,'logs\|images'表示或的关系xargs -i表示将前一步的结果放在./src/{}的{}处。
例 6:grep、xargs
查找当前目录及子目录下所有 .py 文件含有关键词 Model 的行及行号。
例 7:修改屏幕亮度
例 8:依据 csv 格式文件执行命令(read 命令)
cpfiles.txt 文件如下,希望按照 csv 进行文件拷贝
例 9:生成序列(seq 命令)
例 10:打印 Git Objects
输出
例 11: 跳过前 k 行
例 12: 列出当前目录下各个文件或文件夹大小
Shell 脚本示例
例 1:定时计数
例 2:输入密码
例 3:移动文件
例 4:修改文件后缀
Last updated
Was this helpful?