Linux 常用命令之文件处理
SSH
mac/linux系统,在终端执行命令:
- ssh-p22 username@host,如ssh 10691193@shell.ceshiren.com
- 密码输入时看不到内容
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 做不到强制覆盖,可以用这种方法:
- 拷贝目录:cp -a ./a …/b
移动/重命名:mv
- 移动文件:mv a ./b/
- 移动文件并重命名:mv a ./b/c
建立文件链接:ln
-
软链接:不占用磁盘空间,源文件删除后,目标文件就失效了
-
硬链接:反之
-
我们一般建立软链接
-
ln -s ./a/1 . 把./a/1链接到当前目录下
查找文件: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
查看文件内容:cat
、less
、more
、head
、tail
- 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发型版本里一般都是内置的。
- 创建一个文件,并编辑它的内容:
- vim 1.txt
- 进入模式:按i是插入模式
- 退出模式:按ESC
- 保存退出命令:” :wq“
- 不保存强制退出命令:”:q!“
- 快捷操作(在ESC后):
- 跳到整个文件最开头:按gg
- 跳到整个文件最后一行的开头:按shift+g
- 跳到一行的行首:shift+^
- 跳到一行的行尾: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
文件属性
修改文件权限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
例如文件如下,
机构, 月份, 营业额
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 三剑客与管道使用
管道连接符 |
-
管道连接符
|
可以连接多个程序的执行 -
管道连接是以子进程的方式启动的,就是只能在一条命令里执行,下面这种方式是不行的
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