# 环境变量

Bash 是一种 shell,结合了 corn shell 和 seashell 的。

环境变量: $PATH$NAME$PWDHOME$

可以使用 export 定义一个环境变量,这样可以快速在当前 shell 和子 shell 中使用变量。如果不使用 export 导出,那么定义的变量只能在当前 shell 中使用。

可以通过 env 查看环境变量信息

# 历史命令

多的不赘述

按下 Ctrl + r 可以启用搜索功能,通过键入字符找到最近的相似命令,回车进行执行。

# 管道和重定向

每个程序都有三个数据流,标准输入、标准输出、标准错误输出

> 重定向进行覆盖, >> 重定向进行追加

# 搜索

通过组合 | 和 grep 进行

sed 也是一个牛逼的流编辑器,对流数据进行编辑。

cut 可以对流数据进行编辑,比如提取 passwd 中的用户名: cut -d ":" -f 1 /etc/passwd 。使用 : 作为分隔符,提取第一个字段,处理 passwd 文件

awk 应该是最牛逼的,感觉跟 python 很像: echo "hello::frined::f4ck::U" | awk -f "::" '{print $1, $3}' 。可以理解成多个 cut 进行组合

# 实践

假设有一个日志文件 access.log 如何进行处理

head 快速查看前 10 行看一眼数据是不是正常。

wc -l 看一眼总数量

cat access.log | cut -d " " -f 1 | sort -u , 通过读取日志,cut 出 ip 地址并使用 sort 进行去重,得到所有的 IP 地址,但是依然不明显。


cat access.log | cut -d " " -f 1 | sort | uniq -c | sort -urn ,统计处各 IP 的访问总量,并按照频率排序

这条命令是一条 Linux/Unix 命令行命令,用于处理一个名为 access.log 的日志文件。让我一步步解释这条命令以及每个部分的作用:

  1. cat access.log :这部分命令使用 cat 命令来读取 access.log 文件的内容并将其发送到标准输出(通常是终端窗口)。

  2. cut -d " " -f 1 :接下来使用 cut 命令,其中 -d " " 指定了字段的分隔符为空格, -f 1 指定了要提取的字段为每行的第一个字段。这一步的作用是从日志文件的每一行中提取出第一个字段,通常是 IP 地址或者是某种标识符。

  3. sort :然后使用 sort 命令对提取出来的字段进行排序。这一步会将提取出来的字段按照字典顺序进行排序。

  4. uniq -c :接着使用 uniq -c 命令,它会将相邻的重复行合并,并在每行前面加上该行在原始文件中出现的次数。这样就可以统计每个唯一的字段值出现的次数。

  5. sort -urn :最后使用 sort -urn 命令,其中 -u 表示去除重复行, -r 表示按照逆序排序, -n 表示按照数字顺序排序。这一步的作用是对统计后的结果进行逆序排序,以便找出出现频率最高的字段值。

综合起来,这条命令的作用是从日志文件中提取出每行的第一个字段(通常是 IP 地址或标识符),统计每个字段值出现的次数,并按照出现频率从高到低排序输出。这样可以帮助用户快速了解哪些 IP 地址访问量最大或者哪些标识符出现次数最多。


cat access.log | grep "x.x.x.x" | cut -d "\"" -f 2 | uniq -c 这条命令检查一下某个 IP 访问的地址,并进行了统计

在进一步检查一下

cat access.log | grep "x.x.x.x" | grep "/admin" | sort -u 检查登录口,可能发现登录失败,看返回码,如果有 200,可能会是登录成功。

# 文本比较

comm A B 比较 AB,会分成三列,第一列是 A 中独有的数据,第二列是 B 中独有的数据,第三列是共有的数据。可以通过 - 来减去某一列,如 comm -12 A B 就减去了一二列,只剩下了第三列来查找公有的数据。

diff -c A B 可以按照主流的格式展示文件之间的差异,上减下增。 -u 参数将输出合并的结构,翻译一下就是如果要使 A 变成 B,要删除和添加哪些数据。

vimdiff 工具更直观,直接像 github 一样直接出对比

# 进程管理

使用管道符如 cat 1.txt | wc -m 。这是两个进程,但是会被视为一个作业

终端只有一个,当执行较长命令的时候会占用终端过长时间,这个时候需要将作业挂到后台进行执行,需要在命令末尾添加 & 。如果执行了前台命令就只有通过 Ctrl + c 取消,或者 Ctrl + z 将任务挂起暂停。暂停的任务可以通过 bg 命令将挂起的作业调度至后台继续进行,或 fg 调度至前台。但是有很多任务是时间敏感的,如果挂起的时间过长可能会导致运行出错。

当挂起了多个作业时,可以通过 fg 重新将作业调度至前台,通过 jobs 查看作业列表,使用 fg %X 将编号为 X 的作业调度至前台。只有一个 job 的时候,直接 fg 就可以进行调度。

ps -ef 查看进行列表, ps -fC XXX 查找 XXX 命令的进程,ps 的手册值得研究,简直就是进程管理的瑞士军刀。

kill XXX 结束 PID 为 XXX 的进程。

# 文件监控

日志文件往往会被不停地追加,这个时候使用 tail 命令可以只看尾部,这样就很舒服了。

watch 用来定时执行命令,进行检查。默认两秒一次。可以通过 -n 参数调整秒数。比如长期检测在线的用户: watch -n 3 who 这样每三秒执行一次 who 命令查询在线的用户。

# 文件下载

wgetcurlaxel 。最后一个是多连接下载器,速度要快些。

简单记录下,wget 更像是专门下载,支持 http 和 ftp 协议

curl 是一个多功能工具,能上传下载,支持更复杂的参数。

axel 是一个下载加速器,像 IDM

# 自定义 bash 环境

可以设置环境变量 HISTCONTROL 是否删除重复的命令、 HISTIGNORE 设置正则忽略记录某些命令。 HISTTIMEFORMAT 设置时间戳显示的格式

alias 别名,可以构用来自定义构造一些命令: alias lsa='ls -al' 。这样执行 lsa 命令就相当于执行了 ls -al

直接执行 alias 就是查看有哪些别名

# 永久性 bash 定制

通过修改系统的 bashrc 或用户的 bashrc 进行永久性修改: /etc/bashrc~/.bashrc