日志查询
1. grep
定义:(global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式
grep常用命令:
grep '查询条件' xxx.log
grep -r update /etc/acpi : 以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为
grep –e "正则表达式" 文件名 : 从文件内容查找与正则表达式匹配的行
grep ‘condition’ -A 20 xxx.log
常见选项
- -i:忽略大小写
- -v:反向匹配,只输出不匹配的行
- -w:只匹配整个单词,而不是单词的一部分
- -n:在每行输出匹配的行号
- -c:仅输出匹配的行数
- -l:只输出包含匹配项的文件名
- -r:递归搜索指定目录下的所有文件
- -E:使用扩展正则表达式语法
- -F:将模式视为固定字符串而不是正则表达式
- -o 是一个非常有用的命令选项,用于在匹配文本中仅输出匹配的部分,而不是整个行或文件。
- -A <num> 表示显示匹配行的后 num 行文本
- -B <num> 表示显示匹配行的前 num 行文本
- -C <num> 表示显示匹配行前后 num 行文本
grep '2024-09-10 16:50:06' xxx.log | grep 'signDsk called' | wc -l
wc -l是一个Linux命令,用于计算文件中的行数
awk
假设日志如下:aaa.log
Cctv 1 a alkjdf
Cctv 2 a alkjdf
Cctv 3 a alkjdf
Cctv 4 a alkjdf
Adsf 5 a alkjdf
Cctv 5 a alkjdf
Cctv 6 a alkjdf
Cctv 7 a alkjdf
Cctv 8 a alkjdf
Cctv 9 a alkjdf
Cctv 10 a alkjdf
cat aaa.log | grep 'Cctv' | awk '{print $(NF-2)}'
输出
1
2
3
4
5
6
7
8
9
10
cat aaa.log | grep 'Cctv' | awk '{print $(NF-2)}' | awk '{cost+=$1;pv++;}END {printf("pv=%d totalCost=%s avgCost=%s\n", pv, cost, cost/pv)}'
输出:
pv=10 totalCost=55 avgCost=5.5
$ echo 'this is a test' | awk '{print $0}'
this is a test
$0代表当前行
awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个、第二个、第三个字段
$ echo 'this is a test' | awk '{print $3}'
a
如果分隔符不是空格,需要指定用 -F
假设日志是demo.txt:
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
则:
$ awk -F ':' '{ print $1 }' demo.txt
root
daemon
bin
sys
sync
场景8:分页查看,使用空格翻页(使用more/less),搜索关键字附近的日志
cat -n starx-meshside.log | grep "error" | more
grep -A3 -B3 ERROR starx-meshside.log | less
cat filename | grep -C 5 ‘关键字’ (显示日志里匹配字串那行以及前后5行)
cat filename | grep -B 5 ‘关键字’ (显示匹配字串及前5行)
cat filename | grep -A 5 ‘关键字’ (显示匹配字串及后5行)
2. zgrep
定义:压缩文件中查找
zgrep常用命令:
zgrep '查询条件' xxx.log.gz :压缩文件中查询
zgrep '查询条件' xxx.log.gz | grep 'condition2' | grep 'condition3'
cpu
1. top
定义:查询系统负载、CPU、内存使用情况
top常用命令:
top:进程维度的明细
top -o cpu:按照cpu排序
top -o rsize:按内存使用率排序
top -Hp pid:查询进程pid下的所有线程占用cpu等明细,非常实用
内存
1. free
定义:查看内存使用情况
free常用命令:
free : 单位Kb
free -m :单位Mb
tcp相关
1. netstat
定义:用于显示网络状态
netstat常用命令:
netstat -l:listening 显示监控中的服务器的Socket
netstat -t:显示TCP传输协议的连线状况
netstat -t | grep '172.16.248.12':显示TCP传输协议的连线状况并按照一定条件过滤
状态统计
netstat -ant | awk '/tcp/ {print $6}'|sort |uniq -c |sort -nr
131 ESTABLISHED
92 TIME_WAIT
44 LISTEN
7 CLOSE_WAIT
前十位ESTABLISHED状态ip统计
netstat -ant | grep "ESTABLISHED"|awk '/tcp/ {print $5}'|cut -d ":" -f1|sort |uniq -c |sort -nr |head -10
前十位TIME_WAIT状态ip统计
netstat -ant | grep "TIME_WAIT"|awk '/tcp/ {print $5}'|cut -d ":" -f1|sort |uniq -c |sort -nr |head -10
服务器本地被连接的EST
netstat -ant | grep "EST"|awk '/tcp/ {print $4}' |sort |uniq -c |sort -nr |head -10
服务器本地被连接的WAIT
netstat -ant | grep "TIME_WAIT"|awk '/tcp/ {print $4}' |sort |uniq -c |sort -nr |head -10
netstat -ant |awk '/^tcp/ {print $5}'|cut -d ":" -f1 |sort |uniq -c|sort -nr |grep -v "10.20"
2. ulimit
定义:可用于显示系统资源的设置
ulimit常用命令:
ulimit -n :指定同一时间最多可开启的文件数
3. lsof
定义:查看当前进程的打开文件详情(list open files)
lsof常用命令:
lsof -p pid :查看当前进程的打开文件详情,不适用,打印出来太多
lsof -i:80 :查看80端口被那个进程占用
列出TCP连接(List TCP Connections)
我们只能使用-i tcp选项列出TCP连接。
$ lsof -i tcp
jvm常用
1. jps
定义:查询进程号相关
jps常用命令:jps
2. jinfo
定义:
jinfo常用命令:
jinfo -flags pid : 查询java进程启动参数
3. jstack
定义:打印进程的堆栈信息
jstack常用命令:
jstack -l pid
jstack主要用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态。jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别
4. jmap
定义:查询JVM内存对象信息
jmap常用命令:
jmap -histo pid | head -n20 : 查询top20对象
jmap -dump:format=b,file=/home/admin/logs/app/heap.hprpf pid : 对进程号为pid进行dump文件操作
5. jstat
定义:
jstat常用命令:
jstat -gc pid : 查询pid的gc实时信息、分代使用信息
jstat -gc pid 2000 : 间隔两秒打印一次
jstat -gcnew pid : 查询new对象的信息
jstat -gcold pid : 查询old对象的信息
使用此命令可以得出设置的各个代的大小是否合理,若不合理,如何调整。调整的策略必须以实际应用为主,比如说:full gc的时间停顿让客户感觉明显,我们分析原因得知是old区域设置的过大,导致一次full gc需要的时间过久;如果我们直接缩小old区域的大小,又回发现full gc过于频繁;这个时候也许我们需要更换gc的算法
进制转换
1. 十进制转16进制
printf '%x\n' 15
磁盘管理
1. df
df :disk free
命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计
df -h 参数-h表示使用「Human-readable」的输出
2. du
du (英文全拼:disk usage)命令用于显示目录或文件的大小
du --max-depth=1 -h
du 会显示指定的目录或文件所占用的磁盘空间
参数-h表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式
参数–max-depth指定深入目录的层数,这是个极为有用的参数,如果当前目录下文件和文件夹很多,使用不带参数du的命令,会循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的