sed

语法

bash
1
sed  '/过滤的内容/处理的命令' 文件
参数注释说明
n取消sed默认的输出
i替换文件内容
r如果有特殊字符不用转义(正则)
g全局替换
d删除
pprint打印

# 为分隔符可以用其他符号替换(最好用$ @ /)替换内容中如果有分隔符,需要将分隔符替换为别的分隔符,如果不换可将内容转义 s 为search g为globla全局替换,不加的话只替换一列

打印

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ sed -n '2p' 3.txt
1

$ sed -n '1,20p' 3.txt
0
1
2
3
4
5
6

8
9
10
11
12
13
14
15
16
17
18
19

问:已知一个文件内容为 aaa bbb ccc lisi 请打印出不包含lisi的内容

文件原内容

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ cat 1.txt          
-bash: ech: command not found
-bash: ech: command not found
-bash: ech: command not found
dasda
aaa
bbb
ccc
ddd
eee
fff

ggg

替换功能

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ sed -i 's#aaa#cylon#g' 1.txt

$ cat 1.txt                           
-bash: ech: command not found
-bash: ech: command not found
-bash: ech: command not found
dasda
cylon
bbb
ccc
ddd
eee
fff

ggg

默认不加参数会将文件原内容打印再将符合的内容打印

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ sed '/aaa/p' 1.txt  
-bash: ech: command not found
-bash: ech: command not found
-bash: ech: command not found
dasda
aaa
aaa
bbb
ccc
ddd
eee
fff

ggg

在指定文件中指定行插入数据

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ cat test.txt 
1
2
3
4
5

# $为行尾  a\为行后追加 i\为行前追加 c\为替换 不加$为行首
$ sed -i "3a zhangsan" test.txt   
$ cat test.txt 
1
2
3
zhangsan
4

-n取消默认的输出

bash
1
2
$ sed -n '/aaa/p' 1.txt 
aaa

将符合的内容删除后输出,并不操作文件

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ sed  '/aaa/d' 1.txt    
-bash: ech: command not found
-bash: ech: command not found
-bash: ech: command not found
dasda
bbb
ccc
ddd
eee
fff

ggg

删除文件中一部分内容

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 删除首行
sed '1d' nginx.conf

# 删除1-102行
sed '1,102d' nginx.conf

# 正则表达式
# 删除每行中 on
sed '/on/d' nginx.conf

# 删除偶数行删除偶数行
sed '0~2d' nginx.conf

# 删除奇数行
sed '1~2d' nginx.conf

wc

参数说明
c统计字节数
l统计行数
m统计字符数,不能与c一起用
w统计字数,一个字被定义为由空白、跳格、或换行字符分割的字符串
L打印最长行的字符数量
–help帮助信息
–version版本信息
bash
 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
$ cat -n a.html
     1  000
     2  111
     3  222
     4  333
     5  444
     6  555
     7  666
     8  777
     9  888
    10  999
    11  aaa
    12  bbb
    13  ccc
    14  ddd
    15  eee
    16

$ wc -c a.html
61 a.html

$ wc -l a.html
16 a.html

$ wc -w a.html
15 a.html

$ wc -L a.html
3 a.html

sort ★★★★

将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入

参数选项注释说明
-b忽略每行前面开始出的空格字符;
-c检查文件是否已经按照顺序排序;
-d排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f排序时,将小写字母视为大写字母;
-n依照数值的大小排序
-r以相反的顺序来排序

实例:sort将 文件/文本 的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ cat sort.txt 
aaa:10:1.1 
ccc:30:3.3 
ddd:40:4.4 
bbb:20:2.2 
eee:50:5.5 
eee:50:5.5 

$ sort sort.txt 
aaa:10:1.1 
bbb:20:2.2 
ccc:30:3.3 
ddd:40:4.4 
eee:50:5.5 
eee:50:5.5 

忽略相同行使用-u选项或者uniq:

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat sort.txt 
aaa:10:1.1 
ccc:30:3.3 
ddd:40:4.4 
bbb:20:2.2 
eee:50:5.5 
eee:50:5.5 

$ sort -u sort.txt 
aaa:10:1.1 
bbb:20:2.2 
ccc:30:3.3 
ddd:40:4.4 
eee:50:5.5

# 
$ uniq sort.txt 
aaa:10:1.1 
ccc:30:3.3 
ddd:40:4.4 
bbb:20:2.2 
eee:50:5.5 

sort的-n、-r、-k、-t选项的使用:

bash
 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
$ cat sort.txt 
AAA:BB:CC 
aaa:30:1.6 
ccc:50:3.3 
ddd:20:4.2 
bbb:10:2.5 
eee:40:5.4 
eee:60:5.1 
# 将BB列按照数字从小到大顺序排列 

$ sort -nk 2 -t: sort.txt 
AAA:BB:CC 
bbb:10:2.5 
ddd:20:4.2 
aaa:30:1.6 
eee:40:5.4 
ccc:50:3.3 
eee:60:5.1 
# 将CC列数字从大到小顺序排列

$ sort -nrk 3 -t: sort.txt 
eee:40:5.4 
eee:60:5.1 
ddd:20:4.2 
ccc:50:3.3 
bbb:10:2.5 
aaa:30:1.6 
AAA:BB:CC 
# -n是按照数字大小排序,-r是以相反顺序,-k是指定需要排序的栏位,-t指定栏位分隔符为冒号

uniq

用于报告或忽略文件中的重复行,一般与sort命令结合使用

参数选项注释说明
-c在每行前面显示改行重复的次数
-d仅打印重复出现的行
-u仅打印不重复的行

实例:删除重复行

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ uniq a.txt     
a
b
c
d
e
f
g
h
i
g
k

在文件中找出重复的行:

bash
1
sort file.txt | uniq -d

查找重复次数

bash
 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
$ uniq -c a.txt 
      5 a
      1 b
      2 c
      2 d
      1 e
      1 f
      1 g
      3 h
      2 i
      1 g
      1 k

$ uniq -d a.txt  
a
c
d
h
i

$ uniq -u a.txt  
b
e
f
g
g
k

cut

用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容

参数选项注释说明
-b以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c以字符为单位进行分割
-f与-d一起使用,取第几列
-d指定分隔符

实例

bash
1
2
3
4
5
$ cat 1.log
i am a protester myqq is 1112222

$ cut -d " " -f4,7 1.log   
protester 1112222
  1. 以字节取,我们想去who命令的第三个字节
bash
1
2
3
4
5
6
7
8
$ who
root     pts/0        2010-02-02 04:09 (192.168.88.1)
root     pts/1        2010-02-02 08:34 (192.168.88.1)
lc       pts/2        2010-02-02 08:44 (192.168.88.1)

$ who|cut -b 3
o
o
  1. 取第1、2、3和第23个字节
bash
1
2
3
4
$  who|cut -b 1-3,23
roo2
roo2
lc 2
  1. 如果取中文的话,-c 与 -b就有差异了,-c取的是字节,而-b取得是8位2进制来计算输出的是乱码或空
bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ cat a.txt 
星期一
星期二
星期三
星期四
星期五
星期六
星期日

$ cut -b 3 a.txt

$ cut a.txt -c 3

grep

Global search Regular Expression(RE) and Print out the line,全面搜索正则表达式并把行打印出来;是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

过滤,将想要的和不想要的去除

参数说明
==-E==同egrep同时过滤多个字符串,使grep可以使用正则表达式
-v翻转查找,查找除了匹配到结果之外的信息
-B Num除了显示匹配的一行之外,并显示该行之前的num行
-A Num除了显示匹配的一行之外,并显示改行之后的num行
-C Num除了显示匹配的一行之外,并显示改行之前后各num行
-o输出匹配字符,而不是默认的整行输出
-i不区分大小写
-n讲匹配出的结果在文件所在的行号打印
-c打印匹配到的行数
-H在匹配到符合行之前打印文件名
–color=auto给匹配倒的字符串加颜色(不是整行。关键字高亮显示)

实例

  1. 显示/etc/services 下3306和1521 端口信息
bash
1
2
3
4
5
$ grep -E "3306|1521" /etc/services 
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
ncube-lm        1521/tcp                # nCube License Manager
ncube-lm        1521/udp                # nCube License Manager
  1. 过滤出文件内指定字符串
bash
1
2
3
4
5
6
7
$ cat text.txt
zhangsan
lisi
oldbl

$ grep "lisi" text.txt
lisi
  1. 排除指定字符
bash
1
2
3
4
5
6
$ grep -v "lisi" text.txt
zhangsan
oldbl

$ grep  -n "555" a.html
6:555
  1. 一个文件有100行,只看20~30行
bash
 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
# 方法1
$ grep 30 -B 10 test.txt
20
21
22
23
24
25
26
27
28
29
30

# 方法2
$ head -30 3.txt|tail -11
20
21
22
23
24
25
26
27
28
29
30
  1. 列出文件名
bash
1
2
3
$ grep -H root /etc/passwd 
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin

日志查询中常用命令

打印一段时间的日志

bash
1
sed -n '/2019-12-28 11:26/,/2019-12-28 12:13/p' nohup.out

输出日志文件中的某个日期中的ERROR的行

bash
1
sed -n '/^2016-06-21.*ERROR/p' nohup.out

统计http相应状态码

bash
1
cat looklinix.com_access.log | cut -d '"' -f3 | cut -d ' ' -f2 | sort | uniq -c | sort

使用awk

bash
1
awk '{print $9}' looklinix.com_access.log | sort | uniq -c | sort

列出404的接口

bash
1
awk '($9 ~ /404/)' looklinix.com_access.log | awk '{print $7}' | sort | uniq -c | sort -r

检查404请求来自哪里

bash
1
awk -F \" '($2 ~ "/survey/report/na"){print $1}' looklinix.com_access.log | awk '{print $1}' | sort | uniq -c | sort –r

查询x 分钟内访问最多的前 10 个IP

day hour minutes

bash
1
awk -vDate=`date -d'now-30 minutes' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10

查询请求URL数量排行

bash
1
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 50

统计所有的IP请求量

bash
1
awk '{print $1}' access.log | sort -n | uniq | wc -l

统计某一时间段的IP请求量

bash
1
grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l  

统计IP请求数量大于一个值的排行

bash
1
awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

列出请求时间超过3s的接口

bash
1
cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

获取每分钟的请求数量并输出成csv文件

bash
1
cat access.log | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > access.csv

查看搜索引擎爬虫

bash
1
2
3
4
5
6
7
8
# 百度爬虫 降序
cat access.log | grep "Baiduspider" | awk '{print $7}' | sort | uniq -c | sort -r

# 谷歌爬虫降序
cat access.log | grep "Googlebot" | awk '{print $7}' | sort | uniq -c | sort -r

# 谷歌爬虫404的次数
grep 'Googlebot' access.log |grep '404' | wc -l