运维常用命令

  • 从根目录开始查找所有扩展名为.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 ym@xx.xx.xx.xx:/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 ymserver@106.75.166.110:/home/ymserver/
rsync -vzrtopg --progress -e ssh --delete work@172.16.78.192:/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 查找出不包含字符串的行,并且替换?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容