- 从根目录开始查找所有扩展名为.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 查找出不包含字符串的行,并且替换?