一个统计的命令,引出grep、awk、sort、uniq。结果为
77351 191.16.43.167
76989 191.16.43.165
77173 191.16.43.163
1248 192.168.50.18
60 191.16.43.17
这条统计命令为
1 |
zcat access.2014-12-11.log.gz |grep /api/test.json|awk '{print $(NF-2)}'|sort|uniq -c|sort -nr |
统计耗时大于2s的请求,使用awk的if语句。
1 |
$ cat access_log.2019041004 | awk -F ' ' '{if($12 >=2){print $12,$4}}' | sort -n |
2.482 /app/test
1 grep
1、grep命令使用
查询catiout.out文件中每一行不包含xxx的内容。
1 |
grep -v xxx catiout.out |
2、正则表达式
1 |
grep '正则表达式' |
注意:要使用单引号,不要使用双引号,双引号表示字符串
3、–corlor
高亮查询结果
4. -A和-B
-A 表示向后展示多少行
-B 表示向前展示多少行
5. -a
出现”Binary file matches **.log”,可以通过”-a”参数,命令如下:
1 |
grep -a "xxx" a.log |
6、 或
(1)通过“\|”来表示,必须要加上”\”。如下表示搜索包含 xx或者yy的行。
1 |
grep "xx \| yy" test.txt |
(2)通过 -e表示
1 |
grep -e pattern1 -e pattern2 filename |
如下
1 |
grep -e xx -e yy test.txt |
7、与
通过”.*” 来实现,如下表示即包含xx且又包含yy的行
1 |
grep "xx.*yy" test.txt |
8、 -i
用于不区分大小写
9、查看tar文件
使用zgrep和–binary-files=text来实现,如下
1 |
zgrep --binary-files=text '2017' biz-common.log.tar.gz |
2 awk
1. 命令范式
1 |
awk -F ‘分隔符’ '{command命令}' input-file |
(1)如果不使用-F,说明默认分隔符为空格。
(2)都是单引号
2. awk目的
awk是以文件的一行为处理单位,awk每接收文件的一行,就根据分割符,分解成多个域,对每一个域根据command进行处理
3. 使用变量
1 2 3 4 5 6 7 |
FS 设置输入域分隔符,等价于命令行 -F选项 NF 一行的域的个数 NR 行号 $0 变量是指整行的内容。$1表示当前行的第一个域,$2表示当前行的第二个域,...... |
举例
1 |
awk -F ':' '{printf("文件名:%10s,行号:%s,此行域的个数:%s,此行的内容:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd |
3 uniq
1. -c 可以输出重复行的重复次数
2. uniq 执行前要执行sort命令,这是因为uniq比较的是前后两行。
4 sort排序
1 2 3 4 5 |
1. 排序的单位是域。 2. 问题 这里当两行对应域的值一样时,如当按照第三个域进行排序时,如果两个记录这个域的值是一样,就按照下一个域比较值来比较 |
1. -n 按照数字进行排序。如果不指定-n,会按照字符进行排序
如果想要按照数值排序而不是字符排序时,需要-n。(如111和2,按照字符排序111在前,按照数字排序2在前)。
默认的情况下排序都是按照第一个域进行排序的。可以通过-t和-k来进行指定哪个域进行排序。
2. -t和-k 指定排序的域
如果想要按照指定的一个域进行排序,则使用-t<分割符>和-k<域个数>来进行排序
3 -r 排序为逆序方式。如果不指定-r,排序为顺序方式
5 sed
sed在统计ip中没有用到,但是作为常用命令这里也一起总结了。
1. 和awk比较
(1)sed 处理单位是一行
(2)awk 处理的单位是一个行分解的域
2. 参数
(1)-e 是为了在一行使用多个命令,如
1 |
sed -e '1,5d' -e 's/te/check/' test.txt |
结果是删除1行和5行,然后将te替换成check
(2)-n
一般都是和显示(命令p)一起使用。如,显示第一行
1 |
sed -n '1p' test.txt |
此命令就会只显示第一行信息,如果没有"-n"就会显示所有行
3. a 新增一行
(1)在一行后面添加
1 |
sed '1a drink tea' test.txt #第一行后增加字符串"drink tea" |
(2)在多行后面添加
1 |
sed '1,3a drink tea' test.txt #第一行到第三行后增加字符串"drink tea" |
4. c 替换一行的内容为指定行的内容
(1)替换一行的内容
1 |
sed '1c Hi' test.txt #第一行代替为Hi |
(2)替换多行的内容
1 |
sed '1,3c Hi' test.txt #第一行到第三行代替为Hi |
5. d 删除行
(1)包含某些词的行
1 |
sed '/city/d' example.txt |
(2)删除指定的行
1 |
sed '1,5d' ' example.txt |
6. p打印行
和-n结合使用打印出某些行
(1)打印一行
1 |
sed -n '1p' test.txt #显示第一行 |
(2)打印一个区间
1 |
sed -n '1,3p' test.txt #显示第一行到第三行 |
(3)打印到最后一行
1 |
sed -n '2,$p' ab #显示第二行到最后一行 |
7. s 替换行中某些关键词
1 |
sed 's/test/check/' example.txt |
8、查看匹配内容所在行号
1 |
sed -n -e '/关键词/=' test.txt |
6 cut
主要有两种方式 -c和-f,分表表示按照字符和field模式。
1、 -c
1 |
echo "echohellolunce" | cut -c 5-9 |
赎回结果为
hello
2、-f
必须通过某一个字符来进行分割,通过-d来指定这个字符。如下
1 |
echo "123ms" | cut -d 'm' -f1 |
输出结果为
123
(全文完)