Linux 与 Bash 编程
Linux 常用命令之文件处理
查看帮助
--help
man
文件管理
- 查看文件信息:
ls
- 切换工作目录:
cd
- 显示当前目录路径:
pwd
- 创建新目录:
mkdir
- 创建空文件:
touch
- 删除文件或目录:
rm
- 拷贝:
cp
- 移动/重命名:
mv
- 建立文件链接:
ln
- 查找文件:
find
- 查看文件内容:
cat
、less
、more
、head
、tail
- 打包压缩:
tar
文本处理
- 文本编辑:
vi
/vim
- 屏幕输出:
echo
- 输出重定向:
>
文件属性
修改文件权限
- r:读权限 read — 4
- w:写权限 write — 2
- x:执行权限 execute — 1
- -: 无权限 — 0
chmod 777 文件名
查看网卡信息
ifconfig
ip addr
测试远程主机的连通性
ping
-c
:ping 的次数-i
:每次 ping 的时间间隔
打印Linux网络系统的状态信息
netstat
-t
:列出所有 tcp-n
:以数字形式显示地址和端口-p
:显示进程的 pid 和名字
退出Linux系统
exit
Linux 常用命令之性能统计
常用性能指标
- cpu 代表算法的高效性
- mem 代表数据结构的使用合理性
- net io 等更多指标
统计方法
- 临时性分析–命令交互
- 系统性分析–prometheus grafana
查看cpu信息
- cat /proc/cpuinfo
查看系统负载与进程cpu占用
- top
cpu的关键指标
- cpu 利用率:进程的 cpu 利用情况
- load average:系统负载情况
注意: ps 命令的 cpu 是平均 cpu 利用率,不适合做性能分析
内存(mem)占用统计
- free
- ps
- top
网络连接(net)统计
- netstat -tnp | head 10
Linux 常用统计命令
统计命令分类
- 排序
- 去重
- 统计
排序 sort
sort 常用参数
- -b:忽略开头的空白字符
- -f:将小写字母看做大写字母
- -h:根据存储容量排序(KB、MB、GB)
- -n:按数字排序
- -o:把结果写入文件
- -r:以相反的顺序来排序
- -t:指定分隔符,默认为空格
- -V:按照数字版本排序
- -k:指定排序的关键字,与-t 参数配合使用
去重uniq
uniq常用参数
- -c:统计重复出现的次数
- -d:所有邻近的重复行只被打印一次。重复次数要大于等于 2
- -D:所有邻近的重复行将全部打印
- -f:跳过对前 n 个列的比较
- -s:跳过对前 n 个字符的比较
- -w:只对每行前 n 个字符进行比较
统计熟练wc
wc常用参数
- -c:统计字节数:chars
- -l:统计行数
- -w:统计但单词数
- -L:打印最长行的长度
Linux 进程与线程
进程
- 可执行程序的运行态
- 操作系统调度的基本单位
- 线程容器
- 进程本身包含指令、数据等资源
线程
- 进程中被执行的最小单元
- cpu 调度的基本单位
- 线程带有指令、数据等资源
进程的生命周期
- created
sleep 100
./demo.py
- ready
- running
- waiting
- terminated
kill
/kill all
常用进程管理命令
- ps 进程列表快照
- top 交互式进程观测
- kill killall 结束进程
- fg 进程切换到前台
- bg 进程切换到后台
- ctrl z 挂起进程
ps命令
- unix 风格参数
ps -ef
- bsd 风格参数
ps aux
- gnu 风格参数
ps --pid pidlist
多进程与多线程的实例代码
Linux 三剑客之grep
内容检索
- 获取行
grep pattern file
- 获取内容
grep -o pattern file
- 获取上下文
grep -A -B -C pattern file
文件检索
- 递归搜索
grep pattern -r dir/
- 展示匹配文件名
grep -H 111 /tmp/1
- 只展示匹配文件名
grep -l 111 /tmp/1
范围约束
- 忽略大小写
grep -i pattern file
- 不显示匹配的行
grep -v pattern file
- 使用扩展正则表达式
grep -E pattern file
- 文件范围和目录范围约束
grep 111 -r /tmp/demo/ --include "11*"
进程检索
- 进程过滤场景比较特殊,需要注意
- grep 本身会开启新进程,所以需要单独过滤掉 grep 进程
Linux 三剑客之awk
awk基本语法
- awk 是 linux 下的一个命令,同时也是一种语言解析引擎
- awk 具备完整的编程特性。比如执行命令,网络请求等
- 精通 awk,是一个 linux 工作者的必备技能
- 语法
awk 'pattern{action}'
awk上下文变量
- 开始 BEGIN 结束 END
- 行数 NR
- 字段与字段数 $1 $2 … $NF NF
- 整行 $0
- 字段分隔符 FS
- 输出数据的字段分隔符 OFS
- 记录分隔符 RS
- 输出字段的行分隔符 ORS
字段变量用法
- -F 参数指定字段分隔符,可以用|指定多个- 多分隔符 -F ‘<|>’
- BEGIN{FS=“_”} 也可以表示分隔符
- $0 代表当前的记录
- $1 代表第一个字段
- $N 代表第 N 个字段
- $NF 代表最后一个字段
- $(NF-1) 代表倒数第二个字段
pattern表达式
- 正则匹配
$1~/pattern/
/pattern/
- 比较表达式
$2>2
$1=="b"
awk pattern匹配表达式案例
- 开始和结束
awk 'BEGIN{}END{}'
- 正则匹配
- 整行匹配
awk '/Running/'
- 字段匹配
awk '$2~/xxx/'
- 整行匹配
- 行数表达式
- 取第二行
awk 'NR==2'
- 去掉第一行
awk 'NR>1'
- 取第二行
- 区间选择
awk '/aa/,/bb/'
awk '/1/,NR==2'
action 行为表达式 {action}
- 打印
{print $0}
{print $2}
- 赋值
{$1="abc"}
- 处理函数
- 原始内容 $0
- 更新后内容
{$1=$1;print $0}
单行转多行
echo 1:2:3 | awk 'BEGIN {RS=":"} {print $0}'
awk 的词典结构 array
- array 是稀疏矩阵,类似 python 的词典类型
- 统计多家机构的营业额
- 统计多家机构的营业额平均值
Linux 三剑客之 sed
sed 基本语法与常用参数
- 语法结构
sed [addr]X[options]
-
-e
表达式 -
sed -n ‘2p’
打印第二行 -
sed ‘s#hello#world#’
修改 -
-i
直接修改源文件 -
-E
扩展表达式 -
–debug
调试
sed pattern 表达式
- 行数与行数范围
20 30,35
- 正则匹配
/pattern/
- 区间匹配
//,//
sed action 表达式
- p 打印,通常结合-n 参数:
sed -n ‘2p’
- s 查找替换:
s/REGEXP/REPLACEMENT/[FLAGS]
- d 删除,删除前两行
sed ‘1,2d’
- a 追加
- c 改变
- i 插入内容到匹配行之前
- e 执行命令
- 分组匹配与字段提取:
sed ‘s#([0-9]*)|([a-z]*)#\1 \2#’
行数操作
- 打印特定行
sed -n 2p
- 删除最后一行
sed $d
s 表达式
- s 表示替换
- s 后面的追加字符可以为任意字符
- g 表示全局匹配
- & 表示匹配内容
反向引用
- 使用()对数据进行分组
- 使用\1 \2 反向引用分组
Linux 三剑客与管道使用
程序运行环境输入与输出
- 标准输入 0
read a;echo $a
- 标准输出 1
echo ceshiren.com
- 错误输出
ls not_exist_dir
管道重定向
- 管道与管道之间可以重定向
- 管道与文件之间可以重定向
Bash 编程语法
Bash 编程基础
- 变量
- 引号
- 数组
- 控制语句
- 函数
Bash 变量
语法:
Variable_name=value
Bash 变量定义的规则
- 变量名区分大小写,a和A为两个不同的变量。
- 变量名可以使用大小写字母混编的形式进行编写。
- 变量名与值之间的=两侧都不能有空格。
- 在读取或打印变量时,需使用$+变量名。
- 变量可以写在Bash脚本中的任何地方,在运行时,Bash会自动将其替换为变量值。
Bash 数据类型
在 Bash 中声明变量后赋值,它会自动判断数据类型,不必在声明的同时去定义变量的数据类型。
Bash 变量的类型
- 系统定义的变量
- 通常是以大写字母形式存在
- 如 BASH、SHELL等
- 用户定义的变量
- 多数以小写字母参与命名
- 但不具有大小写强制性规定
Bash 变量的定义与使用
letter_name="abc"
echo $letter_name
只读变量
a="123"
readonly a
删除变量
unset Variable_name
字符串的拼接
基本语法
str3="${str1}${str2}"
Bash 引号
- 输入的内容为简单的字符串或文本时,单引号和双引号的作用没有任何区别
- 输出一个已定义的变量,则需要使用双引号
数组
数组可以定义为相似类型元素的集合,在bash中数组不必是相似类型元素的集合
索引数组的声明和赋值
declare -a Array_Name
#索引数组
Array_Name[index_1]=value_1
Array_Name[index_2]=value_2