文章目录
计算机教育中缺失的一课
原博文(弃)
这篇博客不知道从何入手,但是指令实在是太多,暂时的计划是想到哪里写哪里。
文件的一些操作
对文件进行复制:cp path/to/a path/to/b
对文件进行删除:rm /path/to/a
对文件夹进行删除:rm -rf /path/to/folder 这里的r表示删除子目录下的文件,f表示强制删除
对文件进行移动:mv /path/to/a/test.mp4 /path/to/b/haha.flv 这里是可以直接进行文件名和后缀的修改
显示路径下的文件:ls /path/to/a
查看当前文件夹下文件个数:ls | wc -l
linux的一些操作
查看内核版本:cat /proc/version
查看系统信息:lsb_release -a 有时候不起作用
查看位数信息:uname -a
查看系统版本:cat /etc/issue
查看指定端口使用情况:lsof -i:8080
查看某一个程序信息: ps -elf | grep ***
杀死某一个进程:kill -9 num
其他
脚本启动 bash /home/hah/test.sh
查看配置信息
查看gpu信息 lspci | grep -i vga
查看N卡详细信息 nvidia-smi
查看cpu信息 lscpu
下载文件
curl http://xxxxxxx
wget http://xxxxxxx
git clone https://git.xxxxxxxxxx/xxxxx.git xxxx
博客原文如上,计划在此博客中继续更新”计算机教育中缺失的一课“,方便学习复习。
mit课程链接
对应的中文站
$1 概述和SHELL
2022.04.10更新
课程主页
涉及到的一些指令
date #显示日期
echo hello #显示hello
echo $PATH #显示路径?显示谁的路径?
which echo #查找echo的位置
/bin/echo $PATH #显示路径?
pwd #打印当前路径 print work directory
cd /home #切换到home目录
cd ./ #仍在当前路径
cd .. #回到上级目录
cd /home/test/ #切换到指定路径
ls #查看当前目录下有哪些文件
man ls #更多ls指令使用man查看手册
ls -l /home #详细列出当前目录下的文件/文件夹信息
chmod #用于修改权限
# 有两种方式,chmod +/- 数字 和chmod +/- 字母
man chmod #查看详细的chmod手册
#重定向文件
echo hello > hello.txt
cat < hello.txt >hello2.txt
echo test >> hello2.txt
# 查看系统/硬件信息
#略
- 按照上述步骤练习
- 完成课后练习
- 从”习题解答“中获取参考答案
- 自行阅读出现的相关手册(ls /chmod / touch等)
本节完
$2 SHELL工具和脚本
计划是先跳过这节课程,先看vim相关
2022.04.11更新
课程主页
这部分的中文翻译读起来有些拗口,推荐更好的bash脚本教程,快速浏览以上手;
其他部分==SHELL工具部分建议仔细阅读
w3school
SHELL脚本体验
如果阅读了之前课程的wiki参考链接,相信会对#!(shebang)有一个大概的印象,这个可以被用来设置解释器(可以设置bash,当然也可以设置python等解释器),下面就从这一行开始。
- touch foo.sh
- vim foo.sh
全程使用vim
#!/bin/bash/
foo=bar #变量赋值
echo $foo # 调用方式:$变量名
echo "$foo" #注意是双引号,进行转义
echo '$foo' #注意是单引号,原义字符串
运行方式:** ./foo.sh ** (运行之前建议思考可能的输出结果)
可能会出现一些问题
这部分已经有了答案,建议回到前面的课程。
运行后,可能会出现一些意料之外的错误,从提示出发,用vim来修改。
SHELL脚本编写函数
vim foo.sh
#!/bin/bash
foo=bar
echo $foo
echo '$foo'
echo "$foo"
# 函数定义
mcd(){
man sudo>haha.txt
cp haha.txt haha.bak
}
mcd #调用
官方的例子(注意函数的调用方式)
mcd () {
mkdir -p "$1"
cd "$1"
}
mcd uuuu #uuuu作为第一个参数传入了函数
试着执行一下,是否有理想的结果
一些关系符
测试代码
尝试注释每一行
#!/bin/bash
# 尝试将所有可替换的英文变成中文
# 尝试注释
# 显示程序运行世界
echo "Starting program at $(date)" # date会被替换成日期和时间
# $0脚本名 $#参数个数 $$ 进程识别码
echo "Running program $0 with $# arguments with pid $$"
# 遍历参数,查找foobar
# grep返回值为0,表明匹配到了指定字符串
# grep返回值为1,表明未匹配到
for file in "$@"; do
grep foobar "$file" > /dev/null 2> /dev/null
# 如果模式没有找到,则grep退出状态为 1
# 我们将标准输出流和标准错误流重定向到Null,因为我们并不关心这些信息
# $?前一个命令的返回值
# -ne 是什么意思?
if [[ $? -ne 0 ]]; then
echo "File $file does not have any foobar, adding one"
echo "# foobar" >> "$file" #写入文件
fi
done
问题解释:
shellcheck:sh/bash脚本错误检查
使用shebang来配置脚本环境
#!/usr/local/bin/python
注意
SHELL工具
查看命令如何使用
假设好奇sudo的具体用法
- 求助stackoverflow(不推荐)
- sudo -h(查看帮助)
- man sudo(查看手册,man = manual)
- 使用速查网站
查找文件
所有的unix和Linux发行版都提供了一个find工具,它会递归搜索符合条件的文件。下面是一些示例用法
# 查找所有名称为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 \;
# 查找满足模式PATTERN的文件
find -name '*PATTERN*'
# 不区分大小写的查找
find -iname ...
find的一些替换程序
fd 和locate(有兴趣的看原文)
查找代码
# 获取查找结果的上下文
grep -C -NUM
grep -C 5
# 匹配结果反选
grep -v #小写v
# 递归进入子目录并搜索所有文本文件
grep -R
grep的一些替代品(有兴趣看原文)
ack
ag
rg
查找SHELL历史命令
# 查找历史命令中含有ls的行
history | grep ls
# ctrl+R后输入子串继续宁回溯搜索
# 方向键可以定位到不久之前的输入
文件夹导航
alias给命令一个别名
ln -s创建软链接
tree查看目录结构
…
有兴趣自行bing/google查找教程
课后练习
- 学会使用–help,学会阅读手册
- 学会简单函数的编写和参数调用
- 如何更好理解和使用shell的命令
- find有更深入的用法,这里只做引子
$3 vim编辑器
2022.04.11更新
课程主页
这几句话是有必要的
- 认真阅读教程
- 坚持使用vim来完成编辑工作
- 随时查阅某个可能的更方便的操作
原课程中说明了编辑器的选择 、vim的哲学等,这里直接跳过
编辑模式
- 正常模式/一般模式,移动光标进行修改
- 插入模式,用于插入文本
- 替换模式,用于替换文本
- 可视化模式(一般,行,块),选中文本块
- 命令模式
可以在左下角看到当前模式,一般模式和插入模式是接触最多的。
常用模式:
- 一般模式
- 插入模式
- 命令模式
下面将从上述顺序介绍
一般模式
在这里,我们需要得到一个文档来进行练习,最好的办法是使用第一节课程中的方法来生成一个txt文档,来用于练习。
# 使用下述指令来生成文档
man sudo > test.txt
# 这里可以写入任何感兴趣的手册,如man chmod, man ls等
下面开始进行测试
数字和字符的结合可以有不同的效果
请发挥想象力,在test.txt文档中,任意修改,来深入理解和掌握其中的vim命令。
编辑模式
如何进入编辑模式
一共有6种方式
- i
- I
- a
- A
- o
- O
请自行尝试,总结其作用
编辑模式中,和常规的Windows下文档编辑并无两样。
命令模式
# 常用的一些
:q
:wq
:q!
:wq!
# 其他的
:set nu
:set nonu
# ....
几个小建议
- 用了才知道其作用,书上得来终觉浅
- 多用
- 多尝试
- 从易到难
- 有一个念头,”一定有更快捷的方式“
本节完
$4 数据整理
2022.04.12更新
课程链接
在操作中,很多时候需要把一些格式存储的数据转换为另一种格式。广义上来说,像"ls -l | grep drwx"这样的操作也是一种转换行为。更常见的包括,日志的整理,错误信息的快速定位等。
文章举了一个系统日志的例子,以用来查看用户登录信息,因为我这里忘记了root密码,所以我用下面的指令。
journalctl | grep sshd #查看journalctl输出信息中有sshd的行
# 因为这是一台共享主机,所以非常多的人登录,行数多到爆
# 从需求中学习:假设现在我想看到有哪些人登录,他们的ip是什么,我应该如何做?
如何提取用户名和对应的ip信息
正则表达式
首先提取所在行,其公共字符为”Invalid user"
# less 分页显示
journalctl | grep sshd | grep "Invalid user" | less
# 或者是下面这句,-i不区分大小写
journalctl | grep sshd | grep -i "invalid user"
# 可能会有一些包含Invalid user的行出现,但是并不是所需要的,我们需要用通配符来进行更加精准的匹配
# sed的正则表达式使用,通过下面的网址进行简单学习,然后重新看这一行
| sed -E 's/.*Disconnected from (invalid |authenticating )?user .* [^ ]+ port [0-9]+( \[preauth\])?$//'
原文给了一些其他的正则表达式任务,如email匹配等,感兴趣的可以看link
awk
首先学习了其他的一些指令,如sort/tail /paste等
然后引入了awk。
可以使用man对这些指令进行深入学习。
journalctl | grep Invalid |grep user |grep sshd| grep from|sed -E 's/.+Invalid user? .* from [^ ]+ port [0-9] ? //' | sort | uniq -c |sort -nk1,1 |tail -n10 | awk {'print $9'}
深入学习awk点这里
其他的一些指令
指令名 | 用途 |
---|---|
bc | Linux中用作计算器 |
gzip | 常用,自查 |
gnuplot | 绘制图表 |
习题
指令太多,没人能全部记住,掌握常用的一些即可,要有阅读manual的能力
本节完