# 环境变量
Bash 是一种 shell,结合了 corn shell 和 seashell 的。
环境变量: $PATH
、 $NAME
、 $PWD
、 HOME$
。
可以使用 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
的日志文件。让我一步步解释这条命令以及每个部分的作用:
cat access.log
:这部分命令使用cat
命令来读取access.log
文件的内容并将其发送到标准输出(通常是终端窗口)。cut -d " " -f 1
:接下来使用cut
命令,其中-d " "
指定了字段的分隔符为空格,-f 1
指定了要提取的字段为每行的第一个字段。这一步的作用是从日志文件的每一行中提取出第一个字段,通常是 IP 地址或者是某种标识符。sort
:然后使用sort
命令对提取出来的字段进行排序。这一步会将提取出来的字段按照字典顺序进行排序。uniq -c
:接着使用uniq -c
命令,它会将相邻的重复行合并,并在每行前面加上该行在原始文件中出现的次数。这样就可以统计每个唯一的字段值出现的次数。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 命令查询在线的用户。
# 文件下载
wget
、 curl
、 axel
。最后一个是多连接下载器,速度要快些。
简单记录下,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