常用命令简单说明
grep 命令
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来
- 格式
grep [option] pattern file- 选项
-v –revert-match #显示不包含匹配文本的所有行
-w –word-regexp #只显示全字符合的列
-h –no-filename #在显示符合样式的那一行之前,不标示该行所属的文件名称
awk命令
是一种处理文本文件的语言,是一个强大的文本分析工具
- 规则:awk [选项参数] ‘条件1{动作1} 条件2{动作2} …’ 文件名
( 如果条件1,执行动作1;如果条件2,执行动作2 )- 变量 :$1:提取第一列 ,$2提取第二列,
- 选项
-F :指定输入文件折分隔符- 输出
print:会在每个输出之后自动加入一个换行符
printf:标准格式输出命令,需要换行需手动加入
- 应用
1
2
3awk '{printf $2 "\t" $3"\n"}' user.txt
awk -F, '{print $1,$2}' log.txt
awk -F '[ ,]' '{print $1,$2,$5}' log.txt # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
cut命令
提取列: cut [选项] 文件
- 选项:
-f 列号 ( –field 提取第几列 )
-d 分隔符 ( –delimiter 按照指定分隔符分割列 )- 应用:
1 cut -d ":" -f 1,3 /etc/passwd # :分隔,输出1,3行
sed命令
数据进行选取、替换、删除、新增的命令
- 使用方法:sed [选项] ‘[动作]’ 文件名
- 选项
-n : 一般sed命令会把所有数据都输出到屏幕;如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。(如:sed -n ‘2p’ user.txt # 输出第二行)- 动作
d : 删除,删除指定的行。
p : 打印,输出指定的行。
s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)如:sed “s/r//g” user.txt 替换r为空- 实例:
1
2 sed -n '2p' user.txt # 输出第二行, p一般都要和-n使用,不加-n会显示出所有的行
sed "s/r//g" user.txt # 替换r为空
sort命令
排序
- 选项
-n:按数值排序,默认按ASCII码值排序
\u:在输出行中去除重复行
-r:降序(默认是降序)
-o:输出结果重定向到文件
\t:指定间隔符(配合-k指定列数排序)
-k: 指定列排序
netstat 命令
用于显示各种网络相关信息,如网络连接,路由表,接口状态
三种语法格式(一般使用UNIX风格的ps命令):
UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
GNU 风格的长选项,选项前有两个“-”连字符
常用参数
-A 列出所有的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程(主要包含CPU和memory占比)
-ef
不加参数执行ps命令
4列信息分别是:PID(进程编号)、TTY(终端)、TIME(命令占用的CPU处理时间)、CMD(进程运行的命令)显示所有进程
使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。ps -ax | less
1
2
3
4PID TTY STAT TIME COMMAND
1 ? Ss 1:10 /sbin/init
2 ? S 0:00 [kthreadd]
3 ? S 7:08 [migration/0]通过cpu使用来过滤进程
- 使用cpu排序
ps aux --sort -pcpu | head
- ps 与grep 常用组合用法,查找特定进程
ps -ef|grep ssh
1
2
3UID PID PPID C STIME TTY TIME CMD
root 1334 1 0 2016 ? 07:12:57 /usr/sbin/sshd
root 1840 27822 0 17:57 pts/1 00:00:00 grep ssh
参考:
- 10个重要的Linux ps命令实战
- ps命令详解
系统连接状态
运行结果:1
2
3netstat -anlp | head
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1334/sshd
- 查看TCP连接状态
常用:1
netstat -ant |awk '{print $6}'|sort|uniq -c|sort -rn
可用:1
2
3
4netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
- 查找请求数20个IP
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20
用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20
查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk '{print $5}'| cut -d ':' -f 1 | sort|uniq -c|sort -rn|head -n2
- 找查较多的SYN连接
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
- 根据端口列进程
netstat -ntlp | grep 80 | awk '{print $NF}' | cut -d '/' -f1
nginx日志知识
nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。
access_log指令
语法: access_log path [format [buffer=size [flush=time]]];
1
2
3access_log path format gzip [=level] [buffer=size] [flush=time];
access_log syslog:server=address\[,parameter=value] [format];
access_log off;
默认值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except
gzip
:压缩等级。buffer
:设置内存缓存区大小。flush
:保存在缓存区中的最长时间。
不记录日志:access_log off;
使用默认combined
格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;
log_format指令
- 语法:
log_format name string …;
- 默认值:
log_format combined “…”;
配置段:
http
name表示格式名称,string表示等义的格式。默认配置:log_format有一个默认的无需设置的combined日志格式
1
log_format combined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
对应的日志记录:1
2127.0.0.1 - - [21/Sep/2016:10:57:04 +0800] "GET / HTTP/1.1" 302 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36" "-"
127.0.0.1 - - [21/Sep/2016:10:57:04 +0800] "GET /dashboard.php HTTP/1.1" 200 26652 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36" "-"
日志格式变量含义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。
[warning]发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range。[/warning]常见问题
- 获取真实客户IP:如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP 参见http://www.ttlsa.com/html/2235.html
网站日志分析篇(nginx)
获得访问前10位的ip地址
1
2
3cat nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
cat nginx.log|awk '{counts[$(1)]+=1}; END {for(url in counts) print counts[url], url}' | sort -nr访问次数最多的文件或页面,取前20
cat nginx.log | awk '{print $7}' | grep -E "^/.*" | sort | uniq -c | sort -nr | head -n 20
统计404的连接
cat nginx.log | awk '/ 404 /{print $7}' | sort | uniq -c | sort -nr | more
系统Debug分析篇
1.调试命令strace -p pid
2.跟踪指定进程的PIDgdb -p pid
参考:
crontab定时任务
/etc/crontab中每行任务的描述格式
minute hour day month dayofweek command
- minute 从0到59的整数
- hour 从0到23的整数
- day 从1到31的整数 (必须是指定月份的有效日期)
- month 从1到12的整数 (或如Jan或Feb简写的月份)
- dayofweek 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
- command 需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)
root: 表示以root用户身份来运行
run-parts: 表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本1
2
3
4
5
6
7# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
语法
- * 表示所有可用的值, 比如每隔10分钟执行一次:*/10
- 整数间的连字号(-)表示整数列: 例如1-4意思是整数1,2,3,4
- 逗号:如:3,4,6,8表示这四个指定整数
- 符号“/”指定步进设置: “/
”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如*/3用来运行每三个月份运行指定任务 - 井号”#”: 注释行,不会被执行
参考:
定时任务设置
问题:linux下请设置一个定时任务,要求/data/www/a.php在每天凌晨2点到晚上20点,每10分钟执行一次。
答案:1
2vim /etc/crontab
*/10 2-20 * * * /usr/local/bin/php /data/www/a.php
延伸:
定时任务在自己系统中是如何使用的,定时任务与持续运行脚本的区别。
定时任务:每隔一段时间执行一次,缺点:存在任务执行耗费时间过长,上次执行没有结束,下次执行又来了。
脚本运行:持续的脚本运行,可以使用supervisor进行管理,不过需要做兼容处理比如redis、mysql异常中断重连。