在传统的计算机科学课程中,从操作系统、编程语言到机器学习,这些高大上课程和主题已经非常多了。 然而有一个至关重要的主题却很少被专门讲授,而是留给学生们自己去探索。 这部分内容就是:精通工具。
查看系统电量
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" }
|
脚本
shell 函数和脚本有如下一些不同点:
函数只能与 shell 使用相同的语言,脚本可以使用任意语言。因此在脚本中包含 shebang 是很重要的。
函数会在当前的 shell 环境中执行,脚本会在单独的进程中执行。因此,函数可以对环境变量进行更改,比如改变当前工作目录,脚本则不行。脚本需要使用 export 将环境变量导出,并将值传递给环境变量。
查找文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| find . -name src -type d
find . -path '*/test/*.py' -type f
find . -mtime -1
find . -size +500k -size -10M -name '*.tar.gz'
find . -name '*.tmp' -exec rm {} \;
find . -name '*.png' -exec convert {} {}.jpg \;
|
查找代码
查找文件是很有用的技能,但是很多时候您的目标其实是查看文件的内容。一个最常见的场景是您希望查找具有某种模式的全部文件,并找它们的位置。
1 2 3 4 5 6 7 8
| rg -t py 'import requests'
rg -u --files-without-match "^#!"
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'
|