本文发布于Cylon的收藏册,转载请著名原文链接~
sed
语法
sed '/过滤的内容/处理的命令' 文件
参数 | 注释说明 |
---|---|
n | 取消sed默认的输出 |
i | 替换文件内容 |
r | 如果有特殊字符不用转义(正则) |
g | 全局替换 |
d | 删除 |
p | print打印 |
# 为分隔符可以用其他符号替换(最好用$ @ /)替换内容中如果有分隔符,需要将分隔符替换为别的分隔符,如果不换可将内容转义 s 为search g为globla全局替换,不加的话只替换一列
打印
$ 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的内容
文件原内容
$ 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
替换功能:
$ 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
默认不加参数会将文件原内容打印再将符合的内容打印
$ 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
在指定文件中指定行插入数据
$ 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取消默认的输出
$ sed -n '/aaa/p' 1.txt
aaa
将符合的内容删除后输出,并不操作文件
$ 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
删除文件中一部分内容
# 删除首行
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 | 版本信息 |
$ 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码值进行比较,最后将他们按升序输出。
$ 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:
$ 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选项的使用:
$ 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 | 仅打印不重复的行 |
实例:删除重复行
$ uniq a.txt
a
b
c
d
e
f
g
h
i
g
k
在文件中找出重复的行:
sort file.txt | uniq -d
查找重复次数
$ 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 | 指定分隔符 |
实例
$ cat 1.log
i am a protester myqq is 1112222
$ cut -d " " -f4,7 1.log
protester 1112222
- 以字节取,我们想去who命令的第三个字节
$ 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、2、3和第23个字节
$ who|cut -b 1-3,23
roo2
roo2
lc 2
- 如果取中文的话,-c 与 -b就有差异了,-c取的是字节,而-b取得是8位2进制来计算输出的是乱码或空
$ 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 | 给匹配倒的字符串加颜色(不是整行。关键字高亮显示) |
实例
- 显示/etc/services 下3306和1521 端口信息
$ 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
- 过滤出文件内指定字符串
$ cat text.txt
zhangsan
lisi
oldbl
$ grep "lisi" text.txt
lisi
- 排除指定字符
$ grep -v "lisi" text.txt
zhangsan
oldbl
$ grep -n "555" a.html
6:555
- 一个文件有100行,只看20~30行
# 方法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
- 列出文件名
$ 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
日志查询中常用命令
打印一段时间的日志
sed -n '/2019-12-28 11:26/,/2019-12-28 12:13/p' nohup.out
输出日志文件中的某个日期中的ERROR的行
sed -n '/^2016-06-21.*ERROR/p' nohup.out
统计http相应状态码
cat looklinix.com_access.log | cut -d '"' -f3 | cut -d ' ' -f2 | sort | uniq -c | sort
使用awk
awk '{print $9}' looklinix.com_access.log | sort | uniq -c | sort
列出404的接口
awk '($9 ~ /404/)' looklinix.com_access.log | awk '{print $7}' | sort | uniq -c | sort -r
检查404请求来自哪里
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
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数量排行
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 50
统计所有的IP请求量
awk '{print $1}' access.log | sort -n | uniq | wc -l
统计某一时间段的IP请求量
grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l
统计IP请求数量大于一个值的排行
awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
列出请求时间超过3s的接口
cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20
获取每分钟的请求数量并输出成csv文件
cat access.log | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > access.csv
查看搜索引擎爬虫
# 百度爬虫 降序
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
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2016/08/awesome-linux-log-command/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。