蒙珣的博客

活好当下,做好今天该做的事情。

0%

好用的shell脚本

批量修改文件名

原始文件名

1
file_1_finished.jpg  file_2_finished.jpg  file_3_finished.jpg

批量修改文件名

将所有文件名的 _finished 去掉

1
2
3
4
5
6
7
8
9
#!/bin/bash

for file in `ls *.jpg`

do
# echo $file|sed 's/_finished//g'

mv $file `echo $file|sed 's/_finished//g'`
done

修改后的文件名称

1
file_1.jpg  file_2.jpg  file_3.jpg

批量添加文件名

1
2
3
4
5
6
ls|awk -F "." '{print "mv",$0,$1"_finished."$2}'|bash

# "mv" 拼成了mv修改命令
mv file_1.jpg file_1_finished.jpg

# |bash 由bash执行命令

rename方法

1
2
3
4
5
# 修改前的文件名称:file_1_finished.jpg  file_2_finished.jpg  file_3_finished.jpg

rename "_finished" "" *.jpg

# 修改后的文件名称:file_1.jpg file_2.jpg file_3.jpg

删除find后的文件名

find ./ -name filename -exec rm -rf {} \;

(1) “./“ 表示从当前目录开始递归查找

(2) “ -name ‘*.exe’ “根据名称来查找,要查找所有以.exe结尾的文件夹或者文件

(3) “ -type f “查找的类型为文件

(4) “-print” 输出查找的文件目录名

(5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个,最后是一个分号.

为每个文件夹下的文件生成list绝对路径

1
2
3
4
5
6
7
8
9
10
(base) [yujing@capricorn 8k16bitLeft]$ ls
办公室 虫 厨房 纯音乐 地铁 歌曲人声 公交车 核酸 火车 街道 雷雨声 马路边 鸟 人声 食堂 手机铃声 洗衣机 装修

(base) [yujing@capricorn 8k16bitLeft]$ list=".list"

(base) [yujing@capricorn 8k16bitLeft]$ for file in `ls`; do ls `pwd`/$file/* > ../$file$list; done

(base) [yujing@capricorn voice]$ ls
8k16bitLeft 虫.list 纯音乐.list 歌曲人声.list 核酸.list 街道.list 马路边.list 人声.list 手机铃声.list 装修.list
办公室.list 厨房.list 地铁.list 公交车.list 火车.list 雷雨声.list 鸟.list 食堂.list 洗衣机.list

检测磁盘IO

iostat命令

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost unimrcp]# iostat
Linux 3.10.0-1062.4.1.el7.x86_64 (localhost.localdomain) 07/21/2022 _x86_64_ (24 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
4.63 0.00 0.84 0.61 0.00 93.91

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sdb 30.54 558.87 219.60 4631847649 1820013606
sdc 0.00 0.00 0.00 4372 0
sda 18.88 105.91 843.55 877787772 6991263568
dm-0 31.27 558.82 219.44 4631447628 1818731803
dm-1 0.05 0.04 0.15 366288 1279052

监控IO日志,每1秒执行一次,3次后停止监控

iostat -d 1 3

每一秒检测一次sdb盘的io,将日志存放在io.log

1
for i in {1..10} ;do `iostat | grep "sdb" >> io.log`;sleep 1;done

截取日志中间几行到几行

从第3000行开始,显示1000行,即显示3000~3999行

cat 文件名 | tail -n +3000 | head -n 1000

通过sed查看,推荐

sed -n '10,20p' 文件名

查看该文件10-20行

sed命令妙用

只显示文件最后一行或只显示第一行

1
2
3
4
# 显示第一行
sed -n '1p' test.txt
# 显示最后一行
sed -n '$p' test.txt

日志监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/bash

# 我自己写的脚本,还请海涵

#获取当前时间
date1=`date "+%Y%m%d%H%M%S"`

#========================配置==============================
# mrcp原始日志
path_m="/usr/local/unimrcp/log/unimrcpserver-00.log"

# vcg原始日志
path_v="/log/qy/qy.log"

# 结果存放路径
result="/usr/local/unimrcp/result/"$date1'/'
#========================配置==============================

# 创建日期路径
mkdir -p $result

#------------------------io-------------------------------
while true
do
# 检测umc进程,如果进程消失,停止所有监控
UMC_PID=`ps -ef | grep -v grep |grep "./umc" | awk '{print $2;exit}'`
if [ -n "$UMC_PID" ]; then
printf "`date "+%Y-%m-%d %H:%M:%S"`\t" >> $result"io.log"
iostat |grep sdb | awk '{print $1 "\t\t\t" $4 "\t\t\t" $5}'>> $result"io.log"
sleep 1
else
break
fi
done

#处理IO日志
# cat $result$date1"_io.log" | grep sdb | awk '{print $1 "\t\t\t" $4 "\t\t\t" $5}' > $result"ioDone.log"

# 打印IO日志路径
echo "io监控完毕,日志存放路径:"$result"io.log"


#-------------------------提取日志--------------------------

if [ -n "${path_v}" ]
then
echo "开始提取vcg日志"

#获取vcg对应的行号
nu_start=`grep -n "request=http:" $path_v | sed -n '$p' | awk -F ':' '{print $1;exit}'`
echo "VCG开始行号:$nu_start"

#获取最后的行号
nu_end=`cat $path_v |wc -l`
echo "VCG结束行号:$nu_end"

#截取日志
sed -n "${nu_start},${nu_end}p" $path_v > $result"vcg.log"

#提取结果
echo "vcg提取结果存放路径:"$result"vcg.log"
fi

if [ -n "${path_m}" ]
then

echo "开始提取mrcp日志"
#获取mrcp日志对应的行号
nu_start=`grep -n "VCG success" $path_m | sed -n '$p' | awk -F ':' 'NR==1{print $1}'`
echo "MRCP开始行号:$nu_start"

#获取最后的行号
nu_end=`cat $path_m|wc -l`
echo "MRCP结束行号:$nu_end"

#截取日志
sed -n "${nu_start},${nu_end}p" $path_m > $result"mrcp.log"

#提取关键日志信息
grep -E "VCG success|vcg ret" $result"mrcp.log" | awk '{print $2}'|sed 's/\(.*\)\(:\)/\1\./' > $result"result_mrcp.log"

#提取结果
echo "mrcp提取结果存放路径:"$result"result_mrcp.log"
cat $result"result_mrcp.log"

fi

使用dd命令快速生成大文件或者小文件的方法

  1. dd命令可以轻易实现创建指定大小的文件,如

dd if=/dev/zero of=test bs=1M count=1000

在当前目录下会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中读取,/dev/zero为0源),但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢。在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘则可以

dd if=/dev/zero of=test bs=1M count=0 seek=100000

此时创建的文件在文件系统中的显示大小为100000MB,但是并不实际占用block,因此创建速度与内存速度相当,seek的作用是跳过输出文件中指定大小的部分,这就达到了创建大文件,但是并不实际写入的目的。当然,因为不实际写入硬盘,所以你在容量只有10G的硬盘上创建100G的此类文件都是可以的。

  1. 随机生成1百万个1K的文件

seq 1000000 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1

dd命令功能很强大具体可以参考 http://www.cnblogs.com/licheng/archive/2008/03/21/1116492.html

转载自: http://blog.csdn.net/cywosp/article/details/9674757

查看当前路径下的进程

1
ps aux | grep `pwd`

根据进程号查看当前程序路径

1
pwdx 18337

为每个文件单独打包

xargs

1
2
3
4
5
# 每个文件都单独打包
ls |xargs -i tar zcvf {}.tar.gz {}

# tar解压文件夹下的所有tar.gz文件
ls *.tar.gz | xargs -n1 -I {} tar xzvf {} -C ..
  • ls *.tar.gz 列出所有的压缩包

  • xargs -n1 一次只使用一个argument

  • -I {} 用符号{}代表上面的argument

  • tar xzvf {} 解压缩每一个压缩包

  • -C .. 输出路径,这里是父路径

监控每个核使用情况

mpstat

mpstat是一个用于监视多处理器系统的命令行工具,它可以提供关于每个处理器或处理器组件的详细统计数据。是工具包的一部分,在大多数Linux发行版中都可以mpstat找到sysstat

mpstat命令的常见用法是查看CPU的使用情况,包括各个核心的使用率。以下是mpstat命令的基本用法:

1
mpstat [options] [interval [count]]
  • optionsmpstat 支持多个选项来控制输出的内容和格式。常用的选项包括:

    • -P:指定要显示的处理器编号或者ALL用于显示所有处理器的统计数据。
    • -u:显示CPU使用率相关的统计信息。
    • -I:显示退货相关的统计信息。
    • -P ALL:显示所有处理器的统计信息。
  • interval:指定统计数据刷新的时间间隔,单位为秒。

  • count:指定刷新统计数据的次数。

以下是mpstat命令的示例用法:

mpstat -P ALL 1 3

此命令将按 1 秒的间隔刷新 3 次所有处理器的统计数据,包括每个处理器的 CPU 使用率、中断等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
➜  ~ mpstat -P ALL 1 3
Linux 5.15.0-50-generic (william-ARM-Ubuntu) 2023年07月17日 _aarch64_ (2 CPU)

22时02分39秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22时02分40秒 all 0.00 0.00 1.00 0.50 0.00 0.00 0.00 0.00 0.00 98.50
22时02分40秒 0 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00
22时02分40秒 1 0.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 98.00

22时02分40秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22时02分41秒 all 2.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 97.00
22时02分41秒 0 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.01
22时02分41秒 1 3.03 0.00 2.02 0.00 0.00 0.00 0.00 0.00 0.00 94.95

22时02分41秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22时02分42秒 all 1.55 0.00 0.52 0.00 0.00 0.52 0.00 0.00 0.00 97.42
22时02分42秒 0 2.04 0.00 1.02 0.00 0.00 0.00 0.00 0.00 0.00 96.94
22时02分42秒 1 1.04 0.00 0.00 0.00 0.00 1.04 0.00 0.00 0.00 97.92

Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 1.18 0.00 0.84 0.17 0.00 0.17 0.00 0.00 0.00 97.64
Average: 0 1.00 0.00 0.67 0.00 0.00 0.00 0.00 0.00 0.00 98.33
Average: 1 1.36 0.00 1.02 0.34 0.00 0.34 0.00 0.00 0.00 96.95
➜ ~
  • %usr:使用用户空间进程所占用的CPU率。
  • %nice:很好修改过优先级的进程所占用的CPU使用率。
  • %sys:使用内核空间进程所占用的CPU率。
  • %iowait:等待I/O完成而空闲的CPU使用率。
  • %irq:处理硬件中断的CPU使用率。
  • %soft:处理软中断的CPU使用率。
  • %steal:被其他虚拟机(如果有的话)或物理服务器窃取的CPU使用率。
  • %guest:运行虚拟机占用的CPU使用率。
  • %gnice:很好修改过优先级的虚拟机底层的CPU使用率。
  • %idle:空闲CPU的使用率。