shell常用命令
持续更新
awk打印第二至第五列
awk '{print $2,$3,$4,$5}' data.txt
提取关键字
grep -i biztype 2017_09_05.stderrout.log | sed 's/.*\("bizType":[0-9]\).*/\1/g'
grep -i biztype 2017_09_05.stderrout.log | while read line; do expr "$line" : '.*\(\"bizType\":[0-9]\).*'; done
查找socket泄露
lsof -p pid | grep -i 'can't identified'
socket监控
ss -lnt
# 参数
-h:显示帮助信息;
-V:显示指令版本信息;
-n:不解析服务名称,以数字方式显示;
-a:显示所有的套接字;
-l:显示处于监听状态的套接字;
-o:显示计时器信息;
-m:显示套接字的内存使用情况;
-p:显示使用套接字的进程信息;
-i:显示内部的TCP信息;
-4:只显示ipv4的套接字;
-6:只显示ipv6的套接字;
-t:只显示tcp套接字;
-u:只显示udp套接字;
-d:只显示DCCP套接字;
-w:仅显示RAW套接字;
-x:仅显示UNIX域套接字。
查看端口pid即运行情况
// pid超出65535时看不到pid,如果看不到可以使用下面的lsof命令
netstat -anp | grep port
lsof -i:port
查看指定用户下进程文件句柄数
lsof -u linux_user_name | awk '{print $2}' | sort | uniq -c | sort -rn
查看io负载
iostat -d -x -k 1 10
cat /proc/pid/io
查看指定网卡网络带宽
sudo ethtool eth1
查看网络负载
dstat
iftop
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
测试网速(会有10秒左右占满带宽)
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
或者直接登录复制文件至服务器即可:https://github.com/sivel/speedtest-cli
python speedtest-cli
查看内存使用情况
free -h
vmstat
查看cpu负载
uptime
w
w命令输出含义
USER – 登录用户名
TTY – 登录用户使用的终端名
FROM –登录用户来源的主机名或IP地址
LOGIN@ – 用户登录时长
IDLE – 自用户上一次与终端进行交互以来的空闲时间
JCPU – 附加到tty的所有进程使用的时间
PCPU –用户当前进程所用的时间。 显示在“ WHAT”字段中的那个
WHAT – 用户当前的进程及选项/参数。
查看文件夹和文件大小
du -h --max-depth=0 dm 查看dm目录大小
du -h --max-depth=1 dm 查看dm目录大小,以及dm各文件文件夹的大小
du -h --max-depth=0 查看当前文件夹大小
查看命令历史(含时间戳)
export HISTTIMEFORMAT='%F %T ';history| more
查看cpu
cat /proc/cpuinfo
//只看cpu数量
grep "model name" /proc/cpuinfo | wc -l
查看磁盘使用情况
df -h
磁盘被未释放的文件占满问题排查
# 查看已删除的文件大小排序top 10
lsof | grep deleted | sort -k8,8rn | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 848 10482 admin 1w REG 253,224 41779200 3276805 /test.log (deleted)
综合查看系统资源
top
sar
查看进程
ps -ef
// 如果安装了可以使用tree,可以查看所有进程与子线程
pstree -p <pid>
杀进程
kill pid 如果强制杀加“-9”参数
查看进程状态
kill -3 pid > dump.log
根据关键字杀进程
ps -ef | grep -i test.sh | grep -v grep | awk '{print $2}' | xargs -I {} kill -9 {}
根据关键字删除文件
find . -type f -name "*.log" -print0 | xargs -0 rm -f
find / -iname "*my-file*" -delete 2>/dev/null
# 缺点,文件过多时会参数超长报错
find / -name "*my-file*" -exec rm -rf {} \; 2>/dev/null
查找超过指定大小文件
find / -type f -size +500M -exec ls -lh '{}' \; 2>/dev/null
按照更新时间(ctime创建时间)移动N天前文件
大写I可以指定替换符,小写默认{},-代表N天内,+代表N天外,无符号代表具体某天
find / -type f -mtime +31 | xargs -i mv {} /tmp
awk统计各个线程打印日志数量
awk '/^[0-9]+/{gsub("\-[0-9]+","",$4);print $4}' tmp.log | sort | uniq -c
dmesg查看异常日志
查看异常日志,是否存在os kill等异常
dmesg --level = err,warn -T> dmesg_output
sort排序
参数t指定分隔符,k指定分隔后按照第x列至第x列进行排序,r指定按照反向排序,n代表将指定的列的字符看作数字进行排序
sort -t " " -k3,3rn
恢复误删文件
进程依然存在并且依然持有文件句柄情况下可以使用如下方法
# lsof |grep /var/log/myapp.log
syslogd 1383 gallant 2w REG 3,3 6386077 5763657 /var/log/myapp.log (deleted)
cat /proc/1383/fd/2 > /var/log/myapp.log
进程已经结束,并且不再持有文件句柄情况,亲测可行:https://blog.51cto.com/sf1314/2054166
上下文切换监控
cswch/s : 每秒自愿上下文切换数。Total number of voluntary context switches the task made per second.
nvcswch/s : 每秒非自愿上下文切换数。Total number of non voluntary context switches the task made per second.
pidstat -w 1
02:12:07 PM UID PID cswch/s nvcswch/s Command
02:12:08 PM 0 1 1.00 0.00 systemd
02:12:08 PM 0 404 1.00 0.00 syslog-ng
02:12:08 PM 0 1906 1.00 0.00 ilogtail
02:12:08 PM 1079 2791 10.00 0.00 tengine
02:12:08 PM 1079 2792 10.00 0.00 tengine
02:12:08 PM 1079 2794 10.00 0.00 tengine
02:12:08 PM 1079 110501 1.00 0.00 pidstat
替换换行符
花括号后追加换行符,反之替换换行符
awk 'BEGIN{RS="}";ORS="}\n";}{print $0}' source.txt > target.txt
系统故障诊断
# 查看被系统kill的进程及原因
sudo dmesg | grep kill
查看环境变量
# 查看所有环境变量
set
# 查看当前用户环境变量
env
# 查看特定环境变量
echo ${变量名称} # 例如:echo $PATH
查看网络连接情况
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
# 输出
CLOSE_WAIT 6
TIME_WAIT 1
ESTABLISHED 56
for循环+数组定义
indices=(user_operation_log_v1_202301 user_operation_log_v1_202302)
for((i=0;i<${#indices[*]};i++));do
curl -HContent-Type:application/json -XPOST localhost:9200/_reindex?pretty -d'{
"source": {
"index": "'${indices[i]}'"
},
"dest": {
"index": "'${indices[i]}'-reindexed"
}
}'
done
字符串替换
// 替换一次 v1 为 v2
target_index=${indices[i]/v1/v2};
// 替换所有 v1 为 v2
target_index=${indices[i]//v1/v2};
// 替换开头为v1的字符 为 v2
target_index=${indices[i]/#v1/v2};