缺失一课-笔记

在传统的计算机科学课程中,从操作系统、编程语言到机器学习,这些高大上课程和主题已经非常多了。 然而有一个至关重要的主题却很少被专门讲授,而是留给学生们自己去探索。 这部分内容就是:精通工具。

查看系统电量

1
cat /sys/class/power_supply/BAT1/capacity

重定向写入与追加

1
2
3
4
5
touch semester
echo '#!/bin/sh' > semester
echo curl --head --silent https://missing.csail.mit.edu >> semester
chmod 777 semester
./semester

Shell函数

1
2
3
4
mcd () {
mkdir -p "$1"
cd "$1"
}
1
2
mcd /tmp
# 进入/tmp

脚本

shell 函数和脚本有如下一些不同点:

函数只能与 shell 使用相同的语言,脚本可以使用任意语言。因此在脚本中包含 shebang 是很重要的。

函数会在当前的 shell 环境中执行,脚本会在单独的进程中执行。因此,函数可以对环境变量进行更改,比如改变当前工作目录,脚本则不行。脚本需要使用 export 将环境变量导出,并将值传递给环境变量。

查找文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'

# 删除全部扩展名为.tmp 的文件
find . -name '*.tmp' -exec rm {} \;
# 查找全部的 PNG 文件并将其转换为 JPG
find . -name '*.png' -exec convert {} {}.jpg \;

查找代码

查找文件是很有用的技能,但是很多时候您的目标其实是查看文件的内容。一个最常见的场景是您希望查找具有某种模式的全部文件,并找它们的位置。

1
2
3
4
5
6
7
8
# 查找所有使用了 requests 库的文件
rg -t py 'import requests'
# 查找所有没有写 shebang 的文件(包含隐藏文件)
rg -u --files-without-match "^#!"
# 查找所有的foo字符串,并打印其之后的5行
rg foo -A 5
# 打印匹配的统计信息(匹配的行和文件的数量)
rg --stats PATTERN

与 find/fd 一样,重要的是你要知道有些问题使用合适的工具就会迎刃而解,而具体选择哪个工具则不是那么重要。

查找shell命令

history 命令允许您以程序员的方式来访问 shell 中输入的历史命令。这个命令会在标准输出中打印 shell 中的历史命令。如果我们要搜索历史记录,则可以利用管道将输出结果传递给 grep 进行模式搜索。 history | grep find 会打印包含 find 子串的命令。

对于大多数的 shell 来说,您可以使用 Ctrl+R 对命令历史记录进行回溯搜索。敲 Ctrl+R 后您可以输入子串来进行匹配,查找历史命令行。

数据整理

1
ssh cmt journalctl | grep sshd | grep "Disconnected from" | sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' | sort | uniq -c | sort -nk1,1 | tail -n10
1
ssh cmt 'journalctl --since "1 months ago" | grep sshd | grep "Invalid user"' | sed -E 's/.*Invalid user (.*?) from.*/\1/' | sort | uniq -c | sort -nk1,1 | tail -n10
1
ssh cmt 'journalctl --since "1 months ago" | grep sshd | grep "Invalid user"' | sed -E 's/.*Invalid user (.*?) from.*/\1/' | sort | uniq -c | sort -nk1,1 | tail -n10 | awk '{print $1}' | R --slave -e 'x <- scan(file="stdin", quiet=TRUE); summary(x)'
1
ssh cmt 'journalctl --since "1 months ago" | grep sshd | grep "Invalid user"' | sed -E 's/.*Invalid user (.*?) from.*/\1/' | sort | uniq -c | sort -nk1,1 | tail -n10 | gnuplot -p -e 'set boxwidth 0.5; plot "-" using 1:xtic(2) title "Custom Title" with boxes'

缺失一课-笔记
https://43.242.201.154/2025/04/28/missing-semester/
Author
Dong
Posted on
April 28, 2025
Licensed under