一些简单常用的shell、awk、sed实例

摘要

本文将记录一些简单实用的shell命令、脚本以及一些命令组合。

用ping来做链路监控

1
2
3
4
5
cat ping.sh
ping xxx.xxx.xxx.xxx -i 2 | awk '{ print $0"\t" strftime("%D-%H:%M:%S",systime()) } '
类似ping 或者tail -f 这种动态输出做过过滤之后的结果因为有buffer 所以不能直接重定向到某个文件中,可以用以下方法去除buffer
unbuffer sh ping.sh >> ping.log &

多个日志文件合并处理以及日志分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 可以用cat多个文件的方式进行处理
cat log1 log2 log3 |sort -k 4 -t " "
# 可以用sort 讲多个文件合并之后再处理
sort -m log1 log2 -o log_all
# 统计日志不通时间段的访问量
grep ' 15:[0-2][0-9]' haproxy.log | awk '{print $3}' | sed 's/:[0-9]*//' | awk '{++S[$NF]} END {for (a in S) print a, S[a]}'
grep '2015:15:[0-2][0-9]' haproxy.log | awk -F':' '{print $7}' | awk '{++S[$NF]} END {for (a in S) print a, S[a]}'
# 统计用户访问量
grep "android&version_number=2.2.0" 4.log | grep member_id | sed 's/.*member_id%22%3A%22//' | awk -F'%' '{print $1}' | sort -n |uniq -c |sort | wc -l

端口存活、端口扫描

1
2
3
4
5
6
7
8
9
10
11
12
# 可以使用nping来检查某个ip的某个端口的存活状态
yum install nmap
nping 172.18.4.233 --tcp -p 22
# 用zmap来检查某个网段哪些开启了某个端口
zmap -p 22 10.0.0.0/8 -o b.txt
# 用nc俩检查某个ip开启了哪些端口
nc -z -v -n 192.168.9.2 20-25
# ping整个网段
fping 10.0.0.0/24 -g -a

查看本机开放端口、统计tcp连接数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看本机开放端口
netstat -antp
ss -ant
# 查看本机tcp连接
netstat -antulp
ss -ntlp
ss -ntrlp
# 统计tcp连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
ss -ant | awk '{++S[$1]} END {for(a in S) print a, S[a]}’
# 其他相关命令
netstat -atpn | perl -nE 'BEGIN{our %stat;};chomp;next if (not /^tcp.*\s+([A-Z]+[A-Z0-9_]+)\s+.*/);if (not exists $stat{$1}){$stat{$1}=1;} else {$stat{$1}++;}END{foreach $k (sort keys %stat) {say "$k: $stat{$k}";}}’
ss -ant | grep ESTAB | awk '{print $5}' | sed 's/:.*//' | awk '{++S[$1]} END {for(a in S) print a, S[a]}'
ss -tan 'sport = :80' | awk '{print $(NF)" "$(NF-1)}' | sed 's/:[^ ]*//g' | sort | uniq -c

sed

1
2
3
4
5
6
7
8
# sed修改主机名
sed "s/WEBMB/WEB`ifconfig | grep "10.0.0" |awk '{print $2}' | sed 's/.*\.//'`/" -i /etc/sysconfig/network
sed "s/WEBMB/WEB`ifconfig | grep "10.0.0" |awk '{print $2}' | sed 's/.*\.//'`/" /etc/hosts -i
hostname WEB`ifconfig | grep "10.0.0" |awk '{print $2}' | sed 's/.*\.//'`
sed -i "/HOST/s/=.*/`hostname`/" /etc/sysconfig/network
hostname `hostname`.lifec.me

tcpdump抓包

tcpdump抓包会有单独的文章来做记录

1
2
3
4
5
tcpdump -i eth0
tcpdump -i eth0 tcp and tcp[13]==2 -nn and port 6379
tcpdump -i eth1 -tnn dst port 4730 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

反转

1
echo "abcdef" | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

一个简单的awk问题

1
2
3
4
5
# 题目 要求将下列内容中第一列是a=${num}的 num+1
a=1 x=1
b=2 v=1
a=4 t=121
c=6 a=12
1
2
3
4
5
awk '$1~/a=[0-9]/{split($1,a,"=");a[2]+=1;$1=a[1]"="a[2]}1'
# 另一道题的 题目没了
awk -F'<td>|</td>' '{if(NF%2==0){S[NR-1]=S[NR-1]"\t"$3}else{S[NR]=$1}}END{for(a in S){print S[a]}}’ a

awk处理文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# ques 1
# cat a.ini
[zk]
10.100.0.1
10.100.0.2
[es]
10.0.5.5
awk '{if($1~/\[(.*)\]/){split($1,a,"[");split(a[2],b,"]");t=b[1];c[b[1]]=""}else{t=b[1];c[b[1]]=c[b[1]]$1","}}END{for(i in c){print i,c[i]}}' a.ini
zk 10.100.0.1,10.100.0.2,
es 10.0.5.5,
################################
# cat a.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import re
def getConf(file_name):
myjson = {}
with open(file_name,"r") as cfg:
for i in cfg:
i = i.strip()
matchObj = re.match(r'\[(.*)\]',i,re.M|re.I)
if matchObj:
keys = matchObj.group(1)
myjson[keys] = []
continue
myjson[keys].append(i)
return myjson
def main():
file_name = ["a.ini",]
for files in file_name:
print("## file_name : %s" %files)
config = getConf(files)
#print(config)
for k in config:
print(k + ":" + ",".join(config[k]))
if __name__ == "__main__":
main()

awk 行转列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat a
a b c d e
1 2 3 4 5
! @ # $ %
awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(j=1;j<=NF;j++)for(k=1;k<=NR;k++)print a[k,j]}' a
a
1
!
b
2
@
c
3
#
d
4
$
e
5
%

查看etc目录inode使用量

1
find /etc/ -exec stat -c "%n %i" {} \;|awk -F "[/ ]" '{if(! a[$1-$NF]++) l[$1]++}END{for (i in l) print i,l[i]}'

iperf测试网速

1
2
3
4
# server端开启
iperf -s
# client端打流量
iperf -c 172.16.18.131 -i 1 -p5001