sheel命令学习和工作总结


别的命令如sed和awk,可以参考: sheel命令学习和工作总结

grep

实际grep命令中,有or和not操作符的等价选项,但是并没有grep and这种操作符。不过,可以使用patterns来模拟and操作符的。
①、grep or

1grep '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的方法

获取线程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)

ulimit使用

ulimit使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值