Linux与Bash编程

Linux 常用命令之文件处理

SSH

mac/linux系统,在终端执行命令:

tips:[10691193@shell.ceshiren.com ~]$,

~表示在家目录,$表示是普通用户,如果是#表明是管理员root用户

windows系统,需要用工具连接ssh

  • 安装xshell

查看帮助

–help

  • ls --help

man

  • man ls

文件管理

注意:区分大小写

查看文件信息: ls

  • ls -a:列出目录下的所有文件 ,包括以“.”的隐藏文件
  • ls -l:以长格式的形式查看当前目录下所有可见文件的详细属性
  • ls -al:列出目录下包含隐藏文件的所有文件以及他们的详细属性
  • ll:是ls -l的别名(不一定识别的了)
  • 和awk组合:ls -l ${path} | awk '${print $5}':输出一行中的第5列

查看文件详细信息:stat

  • 查看文件修改信息:stat -c %y ${path}

    • -c :指定自定义格式代替默认的输出
    • %y:显示上次修改时间

    返回:

    Access:
    Modify:
    Change:

  • 查看文件字节数:stat -c %s ${filename}(注意换行符)

切换工作目录: cd

  • cd … 切换到上一级
  • cd …/…/usr,网上跳两级后再切到两级目录下的usr

显示当前目录路径: pwd

创建新目录:mkdir

  • mkdir a/b/c -p:递归创建目录(-p可以在前也可以在后)

创建空文件:touch

删除文件或多级目录:rm

  • rm file:删除文件
  • rm -r dir:递归删除目录
  • rm -rf dir / rm -f file:强制删除
  • rm -ri dir 或者 rm -i file:删除前询问一下

删除空目录:rmdir

注意:非空目录不能删除

拷贝:cp

  • 拷贝文件:cp ./1.txt ./2.txt
    • cp 做不到强制覆盖,可以用这种方法:yes y | cp -i ./1.txt ./2.txt
  • 拷贝目录:cp -a ./a …/b

移动/重命名:mv

  • 移动文件:mv a ./b/
  • 移动文件并重命名:mv a ./b/c

建立文件链接:ln

  • 软链接:不占用磁盘空间,源文件删除后,目标文件就失效了

  • 硬链接:反之

  • 我们一般建立软链接

  • ln -s ./a/1 . 把./a/1链接到当前目录下

    img

查找文件:find

  • find ./ -name 1.txt
  • 正则匹配:find ./ -name ‘*.txt’

测试文件:test

-e File如果文件File存在(Exist),**则为**True

-s File如果文件File存在且文件大小(Size)大于正亩零迹清烂,则为True

-f File如果文件File存在且是普通文件(File),则为True

-d File如果文件File存在且是目录(Directory),则为True

-b File如果文件File存在且是块(Block)特殊文件,则为True

-c File如果文件File存在且是字符(Character)特殊文件,则为True
if test -e f.txt; then echo 'y'; else echo 'n'; fi

查看文件内容:catlessmoreheadtail

  • head 默认展示前10行,head -n 3 1.txt
  • tail 默认展示后10行,tail -n 3 1.txt
  • 组合使用:yes 'A' | heads -n 3 | tr -d '\n'
    • yes 'A'会无限重复输出字符’A’
    • heads -n 3会从yes 'A’中截取指定行数
    • tr -d '\n'会删除输入中的换行符

打包压缩解压缩:tar

  • 先打包后压缩:tar -zcvf f.tar.gz 1.txt 2.txt(-z表示要压缩成gz格式,f.tar.gz压缩包里要放1.txt和2.txt)
  • 解压缩:tar -xf f.tar.gz -C ./b/(-C指定路径解压到b文件夹下,不加-C就是当前路径,压缩包本身还在)

文本处理

文本编辑:vi/vim

  • vi是linux下标准的编辑器,vim是vi的升级版本,vim中是可以进行编程的。现在vi和vim在linux发型版本里一般都是内置的。
  • 创建一个文件,并编辑它的内容:
    1. vim 1.txt
    2. 进入模式:按i是插入模式
    3. 退出模式:按ESC
    4. 保存退出命令:” :wq“
    5. 不保存强制退出命令:”:q!“
    6. 快捷操作(在ESC后):
      1. 跳到整个文件最开头:按gg
      2. 跳到整个文件最后一行的开头:按shift+g
      3. 跳到一行的行首:shift+^
      4. 跳到一行的行尾:shift+$

屏幕输出:echo

  • echo 123:显示在屏幕上123

  • 输出重定向:>>>

    • echo 123 > n.txt:快捷创建文件
    • -n用于禁止在字符串末尾输出换行符(这样会导致没有换行符,还是不要加吧)
    • echo -n ‘你好,世界’ > aa.txt # >是文件重定向,会覆盖文件内容
    • echo -n ‘你好’ >> aa.txt # >>是在文件末尾加一行
    echo ' ' > aa.txt    # 文件中有2个字节
    echo -n ' ' > aa.txt    # 文件中有1个字节
    echo -n '' > aa.txt    # 文件中有0个字节,等同于echo -n > aa.txt
    

文件属性

img.png

修改文件权限chmod

  • r:读权限 read — 4

  • w:写权限 write — 2

  • x:执行权限 execute — 1

  • -: 无权限 — 0

  • chmod 777 文件名:设置最高权限,上面的文件权限是755

重复打印yes

yes ‘A’:再命令行中输出指定的字符串,直到yes进程被杀死。不带任何参数输入yes命令默认的字符串就是y

yes 'A' | heads -n 3 | tr -d '\n'
yes 'A'会无限重复输出字符'A'
heads -n 3会从yes 'A'中截取指定行数
tr -d '\n'会删除输入中的换行符

查看网卡信息

ifconfig

ip addr

  • ip addr [show] [设备名称]用于显示和管理操作系统中的网络接口的IP地址

测试远程主机的连通性ping

  • -c:ping 的次数

  • -i:每次 ping 的时间间隔

    如ping -c 3 -i 3 172.16.1.1

打印 Linux 网络系统的状态信息netstat

  • -t:列出所有 tcp
  • -n:以数字形式显示地址和端口
  • -p:显示进程的 pid 和名字

退出 Linux 系统exit

  • 断开连接,回到本地系统

Linux性能统计命令

Linux常用命令之性能统计

为什么要学习性能统计

  • 性能测试:在做性能测试的时候需要,比如分析应用程序的瓶颈在什么地方
  • 性能分析

性能统计知识分类

  • 系统级性能数据分析
  • 进程级别性能数据分析

常用性能指标

  • cpu 代表算法的高效性

  • mem 代表数据结构的使用合理性

  • net(网络连接)、 io 等更多指标

    net io 的不合理使用同样会在 cpu 和 mem 上体现出影响,所以我们今天重点介绍 3 个指标,cpu mem 与 net

统计方法

  • 临时性分析 命令交互
  • 系统性分析 prometheus ,grafana(前台)

CPU使用统计

常用命令

  • ps
  • top

cpu 信息 /proc/cpuinfo

cat /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz
microcode   : 0x1
cpu MHz     : 2499.994
cache size  : 40960 KB
physical id : 0
siblings    : 2
core id     : 0
cpu cores   : 1
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:
processor   : 1
vendor_id   : GenuineIntel

系统负载与进程 cpu 占用 top

top命令获得的cpu信息是实时的

top - 17:27:57 up 76 days, 18:17,  1 user,  load average: 1.03, 1.11, 1.15
Tasks: 215 total,   2 running, 131 sleeping,   0 stopped,   0 zombie
%Cpu(s): 28.7 us,  0.4 sy,  0.0 ni, 70.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16122020 total,  1343832 free,  4715324 used, 10062864 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 11060040 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
23508 yangche+  20   0  668504 114388  30628 R 100.0  0.7   2872:02 /usr/local+
11120 root      10 -10  152468  34444   9120 S  10.0  0.2   2648:51 /usr/local+
11634 yangtie+  20   0 1101696 123748  12648 S   2.0  0.8  53:58.88 /home/yang+
30939 yangtie+  20   0 1525284  95928  17472 S   1.3  0.6  27:44.85 /home/yang+
  658 root      20   0  306560 170916 170332 S   0.7  1.1 116:29.63 /usr/lib/s+
 5541 yangtie+  20   0  447548  42472  12632 S   0.7  0.3   8:15.91 /home/yang+
 5713 quanjin+  20   0 7850436   2.2g   8648 S   0.7 14.0 583:19.28 java -Duse+
 7427 yangche+  20   0 7796228 225700   9420 S   0.7  1.4 537:38.47 java -jar +

cpu 的关键指标

  • cpu 利用率 进程的 cpu 利用情况
    • ps 命令的 cpu 是平均 cpu 利用率,不适合做性能分析
  • load average 系统负载情况

内存(MEM)占用统计

常用命令

  • free
    • -b:以Byte为单位显示内存使用情况
    • -k:以KB为单位显示内存使用情况
    • -m :以MB为单位显示内存使用情况
    • -g:以GB为单位显示内存使用情况
  • ps
  • top

meminfo

/proc/meminfo 保存了更多的内存使用数据

cat /proc/meminfo

进程级别的内存分析

ps -e -o uid,pid,ppid,pcpu,pmem,rss,vsz,comm  --sort -%mem | head -10
  UID   PID  PPID %CPU %MEM   RSS    VSZ COMMAND
 6597 12059     1  0.0  1.9 77036 3584588 java
 5729 32380     1  0.0  1.9 74608 3518808 java
    0 29821     1  1.5  0.9 38768 161384 AliYunDun
    0   457     1  0.2  0.9 37816 1053844 CmsGoAgent.linu
    0   340     1  0.0  0.7 27628  62708 systemd-journal
    0 12047     1  0.0  0.4 19264 396524 rsyslogd
    0 28845     1  0.5  0.4 16092 719100 node_exporter
    0 10454     1  0.0  0.2 11408 564716 tuned
  998 10439     1  0.0  0.2  8788 710032 polkitd
top - 17:17:49 up 325 days,  5:59,  5 users,  load average: 0.00, 0.01, 0.05
Tasks:  92 total,   1 running,  91 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3881920 total,   134192 free,   372640 used,  3375088 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1071332 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
12059 dx42310+  20   0 3584588  77036      0 S   0.3  2.0  35:01.64 java
32380 dx53889   20   0 3518808  74608   1056 S   0.0  1.9  19:20.34 java
29821 root      10 -10  161384  38768   5788 S   0.3  1.0 758:25.24 AliYunDun
  457 root      20   0 1053844  37680   5208 S   0.0  1.0 993:28.66 CmsGoAgent+
  340 root      20   0   62708  27876  27244 S   0.0  0.7 193:01.35 systemd-jo+
12047 root      20   0  396524  19408  15780 S   0.0  0.5  54:24.50 rsyslogd
28845 root      20   0  719100  16160   4376 S   0.0  0.4   1263:32 node_expor+
10454 root      20   0  564716  11408    712 S   0.0  0.3  18:45.31 tuned
10439 polkitd   20   0  710032   8788   1172 S   0.0  0.2   8:42.55 polkitd
17217 root      20   0  155268   5924   4476 S   0.0  0.2   0:00.03 sshd

网络连接(Net)统计

查看网络连接:netstat -tnp | head -10

数据统计 netstat -tn | awk ‘NR>2{print $NF}’| sort | uniq -c | sort -nr

总结:

最重要的三个命令 ps、top、netstat

Linux 常用命令之统计命令

统计命令分类

  • 排序
  • 去重
  • 统计

排序 sort

  • sort 常用参数
    • -b:忽略开头的空白字符
    • -f:将小写字母看做大写字母
    • -h:根据存储容量排序(KB、MB、GB)
    • -n:按数字排序
    • -o:把结果写入文件
    • -r:以相反的顺序来排序
    • -t:指定分隔符,默认为空格(一般只能指定一个字符)
    • -V:按照数字版本排序
    • -k:指定排序的关键字,与-t 参数配合使用(如果已经有列,可以直接使用)

cat sort_h|sort

cat sort_h|sort -h:可以忽略掉空白行

cat sort_h|sort -hr:从大到小排

cat sort_n|sort -nr -o 1.txt:按数字从大到小排序后将结果写入文件

cat sort_t|sort -t . -k 1:按.分割后根据第一列排序

去重 uniq

  • uniq 常用参数

    • -c:统计重复出现的次数
    • -d:所有邻近的重复行只被打印一次。重复次数要大于等于 2
    • -D:所有邻近的重复行将全部打印
    • -f:跳过对前 n 个的比较
    • -s:跳过对前 n 个字符的比较
    • -w:只对每行前 n 个字符进行比较

    uniq -c uniq_demo.txt

    uniq -c -f 2 uniq_demo.txt

    cat uniq_demo.txt | sort -k 3|uniq -c

    cat uniq_demo.txt | sort -k 3|uniq -c -f 2|sort -k 1 -nr

统计数量 wc

  • wc 常用参数
    • -c:统计字节数:chars
    • -l:统计行数
    • -w:统计单词数
    • -L:打印最长行的长度

包含换行符一个字节

cat wc_demo.txt | wc :默认输出多少个行,多少单词,多少字节

查询Linux命令网址:wc 命令,Linux wc 命令详解:统计文件的字节数、字数、行数 - Linux 命令搜索引擎

PS:可以去home/test/目录下复制到自己的家目录里

==linux进程与线程==

(待学习)

Linux数据处理三剑客

Linux 三剑客之 grep

数据查找定位

内容检索

  • 获取行 grep pattern file

    例如文件如下,

    机构, 月份, 营业额

    img

    grep a/tmp/1 查找a机构的数据情况

    grep 1 /tmp/1 查找所有机构1月份的数据情况(但是如果营业额中也有1,那会识别错误)

    可以使用正则来精准匹配,grep " 1, " /tmp/1

    grep “1$” /tmp/1 过滤出营业额尾号是1的数据

  • 获取内容 grep -o pattern file

    只展示我pattern对应的数据,而不是一整行(只匹配我感兴趣的数据)

    grep -o " [0-9]*1$" /tmp/1

  • 获取上下文 grep -A -B -C pattern file

    • -A -n:显示匹配结果的后n行(after)
    • -B -n:显示匹配结果的前n行(before)
    • -C -n:显示匹配结果的前三行和后三行

文件检索

  • 递归搜索 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和ps一起使用:ps -ef | grep dhcp:会筛选包含‘dhcp’字符串的行

进程检索

  • 进程过滤场景比较特殊,需要注意

    • ps -ef | grep ssh有问题,由于用了管道命令,ps和grep都会启动
  • grep 本身会开启新进程,所以需要单独过滤掉 grep 进程,需要-v参数,把带grep过滤掉

ps -ef | grep ssh
  503  2507     1   0 29 821  ??         0:00.08 /usr/bin/ssh-agent
  503 50022 11154   0  8:11下午 ttys002    0:00.00 grep ssh

ps -ef | grep ssh  | grep -v grep
  503  2507     1   0 29 821  ??         0:00.08 /usr/bin/ssh-agent

Linux 三剑客之 awk

数据切片

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/',取a到b的值
    • 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}'
1
2
3

多行变单行

echo '1
2
3' | awk 'BEGIN{RS="";FS="\n";OFS=":"}{$1=$1;print $0}'
1:2:3

echo '1
2
3' | awk 'BEGIN{ORS=":"}{$1=$1;print $0}'
1:2:3:

计算平均数

echo '1,10
2,20
3,30' | awk 'BEGIN{total=0;FS=","}{total+=$2}END{print total/NR}'
20

awk 的词典结构 array

  • array 是稀疏矩阵,类似 python 的词典类型
  • 统计多家机构的营业额
  • 统计多家机构的营业额平均值

下标从1开始

echo 'a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 5
b, 2, 6
b, 3, 7' | awk '{data[$1]+=$3}
END{for(k in data) print k,data[k]}'
a, 60
b, 18

echo 'a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 5
b, 2, 6
b, 3, 7' | awk '{data[$1]+=$3;count[$1]+=1;}
END{for(k in data) print k,data[k]/count[k]}'
a, 20
b, 6

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 表示全局匹配
  • & 表示匹配内容
echo a:b:c | sed 's/:/123&/'
a123:b:c

echo a:b:c | sed 's/:/&123/'
a:123b:c

echo a:b:c | sed 's#:#|#g'    # 如果/和其他命令中要用的字符冲突,可以用#代替
a|b|c

反向引用

  • 使用()对数据进行分组
  • 使用\1 \2 反向引用分组
echo 0 1 2 3 4 | sed -E 's#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#'
0 3 2 1 4

==Linux 三剑客实战==

日志数据检索

找出 log 中的 404 500 的报错 考察严谨性,某次训练没有一人做对

上下文检索

找出 500 错误时候的上下文 考察 grep 高级用法

日志数据统计

找出访问量最高的 ip 统计分析

数据文件修改

找出访问量最高的页面地址 借助于 sed 的统计分析

Linux 三剑客与管道使用

管道连接符 |

  • 管道连接符 | 可以连接多个程序的执行

  • 管道连接是以子进程的方式启动的,就是只能在一条命令里执行,下面这种方式是不行的

    img

echo hogwarts | { read line; echo input is $line; }

curl https://ceshiren.com/categories.json \
  | grep -o '{"id[^}]*}' \
  | awk -F, '{print $2,$6}' \
  | awk -F '"' '{print $7,$4}' \
  | sed 's#:##' \
  | sort -nr \
  | head -5

管道执行的上下文控制

  • 使用 { command; }才能衔接上下命令, 注意花括号与内部命令之间的空格与分号(command两边的空格一定要有)
  • 使用控制逻辑 while read 组合
  • 使用 $() ,把标准输出取出来,存到变量里
#这个方式无法获得变量x
echo hello world | read x; echo $x
#如下两个方式可以获得变量x
echo hello world | { read x; echo $x; }
echo hello world | while read x; do echo $x; done

==【实战】三剑客实战之nginx日志分析实战==

==【实战】三剑客实战之性能、网络统计实战==

==Linux 进阶命令==

==Linux 环境配置==

==Bash编程==