运维常用命令

  • 从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行 or 不查找某些文件使用 ! -name
find / -type f -name "*.log" | xargs grep "ERROR"
find ./ -type f ! -name "*.log"|xargs grep "a"  
  • 关于端口
ps -ef |grep nginx  # 查找出nginxp的pid
netstat -apn|grep ${pid} # 用上一步的pid查找进程监听了什么端口
  • 复制目录文件带上默认的权限,时间, 加上-p参数, 可以省很多时间,不用sudo 完还要修改所有者
    sudo cp -p -r /var/lib/mysql /var/lib/mysql_3302

  • 远程复制文件夹
    scp -r -P10087 [email protected]:/tmp/folder/ /tmp/

  • 过滤配置文件注释行
    grep "^[^#;\t].*$" /etc/supervisord.conf

  • redis模糊匹配批量删除键值
    redis-cli KEYS "pattern" | xargs redis-cli DEL

  • redis 批量添加集合
    redis-cli -n 2 sadd uu_os_pkgs `cat ~/tmp/uu_pkgs.txt`

  • 查询日志访问次数排行
    tail access.log -n 20000|awk '{print $7}'|sort|uniq -dc|sort -n

  • 按文件扩展名grep字符串
    grep -r --include=\*.py User

  • 分析LOG日志游戏包下载次数
    cat chn_app_rec.log|awk '{if ($1=="2017-02-12" && $5==2000973 && $8==2110000) print $0}'|wc -l

  • 分析log日志某个url指定日期访问次数
    cat access.log |awk '{if ($7 ~ /rec\/app\/detail\/xmqy2110000.html/ && $4 ~ /12\/Feb/) print $0}' > /tmp/2-12-rec.log

  • 统计每秒的请求数,top100的时间点(精确到秒)
    awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100
    还有个稍微转折的方法(用awk的数组累加):

cat   xx.log| awk '/14\/Mar\/2018:(19)/{ print $4"###"$7}'|awk -F "###" '{s[$1]++} END {for (k in s) print k, s[k]}'|sort -n -k 1
  • 查看页面访问次数超过100次的页面
cat /data/log/nginx/tg.ouwan.com.access.log|awk '{print $7}'|sort|uniq -c |sort -n |tail
cat /data/log/nginx/tg.ouwan.com.access.log|cut -d " " -f 7 |sort|uniq -c |sort -n |tail
# 两个的区别是第一个用awk print $7直接获取url
# 第二个是用cut  -d 指定分隔符, -f 指定第几列,类似awk 
  • 统计每分钟的请求数,top100的时间点(精确到分钟)
    awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

  • 统计IP访问次数,并显示查看访问500次以上的IP
    cat xx.log|awk '{print $1}'|sort|uniq -c |sort -n -k 1|awk '{if($1 > 500) print $0}'

  • 分析日志某个url 并且返回码是500的统计
    cat access.log |awk '{if ($7 ~ /api\/wechat/ && $9 != "200") print $1}'|sort|uniq -c|sort -nr -k 1

  • 分析nginx access log 的URL请求总数, 请求总时间,请求平均时间

tail /data/log/nginx/api.mobi.ouwan.com.access.log -n 5000 | awk '/[0-9]\.[0-9]{3}$/{print  $NF, $7}'|cut -d "?" -f 1|awk '{url[$2]+=$1;url_count[$2]++}; END {for (k in url) print "url: " k, "time_consume: "url[k], "request_count: " url_count[k], "avg_time_consume: " url[k]/url_count[k]}'

输出内容

url: /essay/nativeEssayByHostId/ time_consume: 0.257 request_count: 3 avg_time_consume: 0.0856667
url: /test/user/nativeFollowCommunityList/ time_consume: 1.361 request_count: 15 avg_time_consume: 0.0907333
url: /mission/nativeGetCouponReward/ time_consume: 0.208 request_count: 4 avg_time_consume: 0.052
url: /mission/nativeMissionSignin/ time_consume: 7.021 request_count: 43 avg_time_consume: 0.163279
url: /user/nativeMyInfo/ time_consume: 89.307 request_count: 1127 avg_time_consume: 0.0792431
url: /test/user/nativeMyInfo/ time_consume: 28.502 request_count: 15 avg_time_consume: 1.90013
  • 获取socket链接状态统计
    ss -ant|awk '{s[$1]++} END {for (k in s) print k, s[k] }'

netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}' # $NF是最后一个字段 ;NF 是字段数
netstat -an | awk '{print $6}' | sort | uniq -c | sort -rn

CLOSE-WAIT 4
ESTAB 130
TIME-WAIT 64
LISTEN 64
SYN-SENT 3
State 1
  • awk 显示行数
    awk '{print NR " == " $0}' /etc/passwd

uniq 是去除相邻重复的两行, 所以用uniq之前先sort一下,把重复的都放到相邻位置
uniq
-c或——count:在每列旁边显示该行重复出现的次数;
-d或--repeated:仅显示重复出现的行列;
sort
-n 按数字大小排序
-r 倒序排列
-k 以第几列排序

统计的IP:

    次数      IP
     81 101.226.62.17
     51 101.226.233.156
      .....
  • 快速生成100M的文件 填入一个10MB的随机比特流数据
    head -c 10M < /dev/urandom > /var/log/log-file

  • grep 的and 和 or

# 同时有这个搜索条件的行数
grep -E 'pattern1.*pattern2' filename
cat chn_app_rec.log|grep -E '2017-02-13.*2000973.*2104006'

# 同时搜索p1&&p2 || p1&&p3
grep -E 'pattern1.*pattern2|pattern1.*pattern3' filename
cat chn_app_rec.log|grep -E '2017-02-13.*2000973.*2098000|2017-02-15.*2000973.*2098000'


# or 用法1
grep 'pattern1\|pattern2' filename
# or 用法2
grep -E 'pattern1|pattern2' filename
# or 用法3
grep -e pattern1 -e pattern2 filename

# and 用法
grep -E 'pattern1.*pattern2' filename
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

grep 链接 http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators/

  • 使用grep 查找文件名
find ./ |xargs grep keyword
# 或者
# 查找目录:
find /(查找范围) -name '查找关键字' -type d
# 查找文件:
find /(查找范围) -name 查找关键字 -print
  • 查看进程gid (按格式输出ps内容)
    ps ax o user,pid,%cpu,%mem,vsz,rss,tty,stat,start,time,comm,group,gid
    ps ax o user,gid,pgid,pid,ppid,group,start,time,command|grep owan_web
    ps o 格式详解: http://blog.csdn.net/shuanghujushi/article/details/51814447
    查看进程用户,组 ,命令:
    ps -eo "%U %G %a" | grep nginx
  • 删除文件时排除特定文件
    删除当前目录下所有 *.txt文件,除了test.txt
    rm `ls *.txt|egrep -v test.txt`
    或者
    rm `ls *.txt|awk '{if($0 != "test.txt") print $0}'`
    排除多个文件
    rm `ls *.txt|egrep -v '(test.txt|fff.txt|ppp.txt)'`
    rm -f `ls *.log.1|egrep -v '(access-2010-09-06.log|error-2010-09-06.log)'`
    rm -f `ls *.log|egrep -v '(access-2010-09-06.log|error-2010-09-06.log)'`
  • 用sed命令可以批量替换多个文件中的 字符串。
    sed -i "s/原字符串/新字符串/g" grep 原字符串 -rl 所在目录
    例如:我要把mahuinan替换 为huinanma,执行命令:
    sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
    在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
    grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'

  • 查看文件从N到M行数据
    awk 'NR >= 57890000 && NR <= 57890010' /path/to/file
    https://unix.stackexchange.com/questions/47407/cat-line-x-to-line-y-on-a-huge-file
    还有sed方法,sed, awk 变形很厉害,玩的溜可以完成很多任务

  • scp 复制文件夹, rsync是增量复制

# -a 递归复制所有文件,并保持文件时间所属用户权限; -e 是命令, 加个双引号把ssh 配置另外扩起来, 另外,ssh 没有写user@ 是默认使用当前终端用户
rsync -avP -e "ssh   -p 10087"  /data/bak/2017-08-29_17-32-35  10.13.114.111:/data/ 
# 复制本地文件到远程服务器
rsync -vzrtopg --progress -e "ssh -p 10087" /tmp/ssl.tar [email protected]:/home/ymserver/
rsync -vzrtopg --progress -e ssh --delete [email protected]:/www/* /databack/experiment/rsync

来自: http://man.linuxde.net/rsync

  • 对两个命令的输出 求差集
comm <(cat requirements.txt|sort) <(pip freeze|sort) -2 -3

参考
输入重定向 <
http://www.1987.name/351.html
https://stackoverflow.com/questions/345505/how-can-you-diff-two-pipelines-in-bash

sed

sed 默认是读取文件,用<输入重定向可以读取grep 出来的东西再处理
sed 's/^[^#]/#/g' <(cat cron.log|grep -v ouwan_admin_env)

问题:
如果用grep 或者sed 查找出不包含字符串的行,并且替换?

你可能感兴趣的:(运维常用命令)