别的命令如sed和awk,可以参考: sheel命令学习和工作总结
grep
实际grep命令中,有or和not操作符的等价选项,但是并没有grep and这种操作符。不过,可以使用patterns来模拟and操作符的。
①、grep or
1、 grep 'pattern1\|pattern2' filename
2、使用选项 -E可以用来扩展选项为正则表达式,如果使用了grep命令的选项-E,则应该使用|分隔多个pattern,以此实现OR操作。
grep -E 'pattern1|pattern2' filename
3、egrep命令等同于'grep -E',因此,使用egrep命令和上面方法类似。
egrep 'pattern1|paggeren2' filename
4、使用选项-e,使用grep -e只能传递一个参数。因此要用一下操作
grep -e 'pattern1' - e 'pattern2' filename
5、grep常用命令
-i:忽略大小写
-v:只显示不匹配的行
-n:显示匹配行的行号
-c:统计匹配的行数
-r:递归搜索子目录
-E:使用扩展正则表达式
-F:禁用正则表达式,使用固定字符串匹配
-w:只匹配整个单词,而不是单词的一部分
-A:显示匹配行之后的若干行
-B:显示匹配行之前的若干行
-C:显示匹配行前后的若干行
②、grep and
1、使用-E 'pattern1.*pattern2'
grep -E 'pattern1.*pattern2' filename(有顺序)
grep -E 'pattern1.*pattern2'|'pattern2.*pattern1' filename(无顺序)
2、使用多个grep命令,由管道符分隔
grep -E 'pattern1' filename | grep 'pattern2'
③、grep not
1、使用-v
grep -v 'pattern' filename
④、grep 展示行号和统计行数
1、使用选项n,查看位于第几行
[root@roclinux ~]# grep -n leo /etc/passwd
29:leo:x:503:503::/home/leo:/bin/bash
2、使用-c选项,统计行数
[root@roclinux ~]# grep -c leo /etc/passwd
1
3、环顾四周
-A(After) -B(Before) -C
tail
tail [参数] [文件]
命令格式:
tail [参数] [文件]
参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示文件的尾部 n 行内容
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
实例
要显示 notes.log 文件的最后 10 行,请输入以下命令:
tail notes.log
要跟踪名为 notes.log 的文件的增长情况,请输入以下命令:
tail -f notes.log
此命令显示 notes.log 文件的最后 10 行。当将某些行添加至 notes.log 文件时,tail 命令会继续显示这些行。 显示一直继续,直到您按下(Ctrl-C)组合键停止显示。
显示文件 notes.log 的内容,从第 20 行至文件末尾:
tail +20 notes.log
显示文件 notes.log 的最后 10 个字符:
tail -c 10 notes.log
top
一、top前5行统计信息
第一行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30
第1行是任务队列信息,其参数如下:
内容 | 含义 |
---|---|
05:43:27 | 表示当前时间 |
up 4:52 | 系统运行时间,格式为 : 时:分 |
2user | 当前登陆用户数 |
load average:0.58,0.41,0.30 | 系统负载,即任务队列的平均长度,三个数值分别为1分钟、5分钟、15分钟到现在的平均值 |
load average 如果这个数除以逻辑cpu的数量,结果高于5的时候表示系统在超负荷运行。 | |
**第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie | |
第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st** | |
内容 | 含义 |
– | – |
159 total | 进程总数 |
1 running | 正在运行的进程数 |
158 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
37.0 us | 用户空间占用cpu百分比 |
3.7 sy | 内核空间占用cpu百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用cpu百分比 |
59.3 id | 空闲cpu百分比 |
0.0 wa | 显示用于等待IO操作占用cpu总时间的百分比 |
0.0 hi | 硬中断(Hardware interrupts) 占用cpu的百分比 |
0.0 si | 软中断(Software interrupts)占用cpu总时间的百分比 |
0.0 st | 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比 |
**第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers | |
第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem** | |
内容 | 含义 |
– | – |
1530752 total | 物理内存总量 |
1481968 used | 使用的物理内存总量 |
48784 free | 空闲内存总量 |
70988 buffers(buff/cache) | 用作内存缓存的内存量 |
swap:3905532 total | 交换区总量 |
267544 used | 使用的交换区总量 |
3637988 free | 空闲交换区总量 |
617312 cached Mem | 缓冲的交换区总量 |
上述最后提到的缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。 |
二、进程信息
| 列名|含义 |
| PID |进程ID,进程的唯一标识符 |
| USER|进程所有者的实际用户名 |
| PR |进程的调度优先级,这个字段的一些值是rt,以为运行在实时态 |
| NI |进程的nice值(优先级),越小以为优先级越高,负值表示高,正值表示低 |
| VIRT|进程的调度优先级,这个字段的一些值是rt,以为运行在实时态 |
| RES |驻留内存大小,驻留内存是任务使用的非交换物理内存大小,进程使用、未被换出的物理内存大小,单位Kb,RES=CODE+DATA|
| SHR |SHR是进程使用的共享内存,单位Kb |
| S |这个进程的状态,D-不可中断的睡眠态;R-运行态;S-睡眠态;T-被跟踪或已停止;Z-僵尸态 |
| CPU |自从上一次更新到现在任务所使用的CPU时间百分比 |
| MEM |进程使用的可用物理内存百分比 |
| TIME+|任务启动后到现在所使用的全部cpu时间,精确到百分之一秒 |
| COMMAND |运行进程所使用的命令 |
三、使用方法
1、通过-H切换线程开关,同时可以指定进程。top -H -p <pid>
。
2、按数字1可以看几个核。
lsof
列出打开的文件
1、显示与指定文件交互的所有一切
#lsof /home/w_k/file
2、显示与指定目录交互的一切。
#lsof /home/w_k
fuser
fuser [选项] [参数]
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name),这样所有访问这个文件
或者块设备的进程都会被列出来。
-k 杀掉访问文件的进程,如果没有指定-signal就会发送SIGKILL信号。
-v 详细模式,输出以ps命令的输出,包含PID、USER、COMMAND等许多域,如果是内核访问的那么PID为kernel。
-V 输出版本信息
iostat显示CPU和IO系统负载情况
: -d 1 每隔1s输出一次device信息.
:-k 某些用block的单位转换为KB
tps-该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the
device.),"一次传输"意思是"一次I/O请求",多个逻辑请求可能会合并为"一次I/O请求","一次传输请求"的大小
时未知的;
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数据量;
:-c 可以获取部分cpu状态值.
: -x 显示更多信息,具体如下:
rrqm/s:平均每秒对设备的读请求被合并次数,文件系统会对读取同块的请求进行合并;
wrqm/s:平均每秒对设备的写请求被合并次数,文件系统会对写入同块的请求进行合并;
rsec/s:每秒读取的扇区数;
wsec/s:每秒写入的扇区数;
rKB/s:The number of read request that weir issued to the device per second;
wKB/s:The number of write request that weir issued to the device per second;
avgrq-sz:平均请求扇区的大小;
avgqu-sz:平均每次IO队列长度,越短越好;
await:cpu每次IO操作的等待时间(ms),包括队列时间和服务时间,一般系统IO响应应该低于5ms,如果大于
10ms就比较大了,也就是说一般情况下,await大于svctm,它们的差值越小,则说明队列越短,反之差值越大,
队列时间越长,说明系统出了问题;
svctm:每次IO请求的处理时间(ms),如果svctm的值与await很接近,表示几乎么有I/O等待,磁盘性能
很好,如果await值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢;
%util:每秒钟用于I/O操作的百分比,如果是多磁盘,即使util是100%,因为磁盘的并发能力,所以磁盘使用
未必就到了瓶颈;(Percentage of elapsed time during which I/O requests were issued to the device,
Device saturation occues when this value is close to 100%);
关于util举一个简单的例子:某硬盘处理单个I/O需要0.1秒,有能力同时处理10个I/O请求,那么当10个I/O请
求依次顺序提交的时候,需要1秒才能全部完成,在1秒的采样周期里%util达到100%;而如果10个I/O请求一次性提
交的话,0.1秒就全部完成,在1秒的采样周期里%util只有10%。可见,即使%util高达100%,硬盘也仍然有可能还
有余力处理更多的I/O请求,即没有达到饱和状态。
可以参考网文章:iostat中的%util指标说明
iotop
在采样周期里,iotop按列显示每个进程/线程的I/O读写带宽,同时也显示进程/线程做swap交换和等待IO所占用的百分比,
常用的命令:
iotop -b -n 3 -d 1 非交互模式每秒查询1次,共查询3次。查询结果可以重定向文件中,作为记录日志。
iotop -p pid 查询指定进程的io使用率
blktrace
blktrace通过捕获内核注册在内核IO路径里的各个traceoponit点来输出每个IO经过各个内核处理点时的信息
blktrace -d /dev/sda1 -o - | blkparese -i -
Q------->G------------>I--------->M------------------->D----------------------------->C
|-Q time-|-Insert time-|
|--------- merge time ------------|-merge with other IO|
|----------------scheduler time time-------------------|---driver,adapter,storagetime--|
|----------------------- await time in iostat output ----------------------------------|
其中:
- Q2Q — time between requests sent to the block layer (包括remap和split)
- Q2G — time from a block I/O is queued to the time it gets a request allocated for it
- G2I — time from a request is allocated to the time it is Inserted into the device’s queue
- Q2M — time from a block I/O is queued to the time it gets merged with an existing request
- I2D — time from a request is inserted into the device’s queue to the time it is actually issued to the device (IO在IO Schedule中等待的时间)
- M2D — time from a block I/O is merged with an exiting request until the request is issued to the device
- D2C — service time of the request by the device
- Q2C — total time spent in the block layer for a request
参考网站:developer.aliyun.com/article/698568
问题处理:
①、有错误日志Sense key:Medium Error [current]表明介质错误,一般事磁盘硬件出了问题。
②、有错误日志task abort,表明对应的磁盘IO超时了,一般事硬件问题,较小概率事驱动bug。
③、关键词“reset",表明对应磁盘IO出错后(IO超时也是一种IO错误),由于无法修复,系统触发了host reset操作。reset可以理解为固件层面的重启。常见的进入reset的条件是:IO超时之后,abort失败。
reset有4种,根据reset的影响,从小到大一次reset,device reset->target reset-.>bus reset->host reset->惕盘(将盘的状态置为offline),如果reset成功了,但是随后仍然继续出现IO错误,那说明大概率是硬件的错误了。
cut命令
-b ,--bytes=LIST;(select only these bytes)
-c ,--characters=LIST;(select only these charracters)
-d ,--delimiter=DELIM;(use DELIM instead of TAB for field delimiter)
-f ,--fields=LIST;(select only these fields; also print any line that contains no delemiter
character, unless the -s option is specified)
-n with -b:don't split mutibyte characters
获取线程id的方法
gdb调试指令
1、导入符号表
gdb -c core.1234 -e /bin/app -s /debug/symbol
2、导入环境变量
set environment
show environment
3、设置运行的参数
set args
4、当core文件不能导入符号表时,可以把符号表拷贝到lib目录,然后在gdb中直接运行,重新生成core文件后再直接bt指令。(或者把所有的依赖拷贝到同一个目录)。
5、gdb bt完,f跳转到某一行,p打印。
6、多线程调试:
info threads显示当前可以调试的所有线程
thread apply all bt 打印所有线程
thread ID切换当前调试的线程为制定ID的线程
attach process-id 在gdb状态下,开始调试一个正在运行的进程
7、打印容器
p (myVector._M_impl._M_start)[N-1]//打印第N个成员
p *(myVector._M_impl._M_start+N-1)