前言
本文主要讲述在Linux下,跟文本统计相关的一些命令,比如wc,sort,uniq,cut等。
wc命令
在文本统计中,wc命令是比较常见的一个,该命令比较简单,主要有四个参数:
-c, --bytes : 统计字节数
-l, --lines : 统计行数
-m, --chars : 统计字符数,一个字符可能由多个字节组成
-w, --words : 统计字数
用Python生成测试文件:
with open('test.log', 'w') as fw:
for i in range(100):
fw.write('序号:' + str(i) + '\n')
测试效果:
# 1190个字节
$ wc -c test.log
1190 test.log
# 100行
$ wc -l test.log
100 test.log
# 590个字符
# 一个汉字,或者一个数字,或者换位符都算一个字符。
$ wc -m test.log
590 test.log
# 100个字
# 一个字被定义为由空白、跳格或换行字符分隔的字符串,所以每一行相当于一个字
$ wc -w test.log
100 test.log
awk命令
awk命令是一个强大的流处理工具,也可以用来统计行数,不过会稍微复杂一点
# 方式一
$ awk 'END {print NR}' test.log
# 方式二
$ awk '{print NR}' test.log | tail -n 1
sed命令
sed命令同样可以用来统计行数。
$ sed -n '$=' test.log
100
cut命令
cut命令用于剪切文本,有时候我们需要统计的只是文本中的某一列,就可以先使用cut命令剪切,再进行统计。
测试文件:
# cut.log
yangan console Jun 19 10:38
yangan ttys000 Jun 20 18:02
yangan ttys001 Jun 20 18:05
cut命令常见的用法有:
# -b :以字节为单位进行分割
$ cut -b 3 cut.log
n
n
n
# 提取多个字符,连续使用-符号,非连续使用逗号
$ cut -b 1-3,5-7 cut.log
yanan
yanan
yanan
# -c :以字符为单位进行分割。由于测试文件没有中文,所以 -c 和 -b 结果一致
$ cut -c 3 cut.log
n
n
n
# -d :自定义分隔符,默认为制表符
# -f :与-d一起使用,指定显示哪个区域,可以理解为第几列
$ cut -d ' ' -f 1 cut.log
yangan
yangan
yangan
# 指定分隔符,并提取多列
$ cut -d ' ' -f 1-2 cut.log
yangan console
yangan ttys000
yangan ttys001
uniq命令
uniq命令用于文本去重,这个比较好理解,不过该命令一般会与cut命令一起使用。
测试文件:
# cut.log
root console Feb 19 10:38
root ttys000 Feb 20 18:02
yangan console Jun 19 10:38
yangan ttys000 Jun 20 18:02
yangan ttys001 Jun 20 18:05
uniq命令常见的用法有:
# -c:在每列旁边显示该行重复出现的次数
$ cut -d ' ' -f 1 uniq.log| uniq -c
2 root
3 yangan
# -d:所有邻近的重复行只被打印一次
$ cut -d ' ' -f 1 uniq.log| uniq -d
root
yangan
# -u:只打印非邻近的重复行(相邻没有重复的,所以全部打印出来)
$ cut -d ' ' -f 2 uniq.log| uniq -u
console
ttys000
console
ttys000
ttys001
# 相邻都是重复的,所以没有打印出来
$ cut -d ' ' -f 1 uniq.log| uniq -u
sort命令
sort命令用于文本排序,需要注意该命令默认是按照ASCII码排序,而不是自然排序。从上面uniq用法我们可以看到一个弊端,就是uniq的去重只针对相邻的行,所以并不是做到“绝对的去重”,所以这时候就需要搭配上sort命令了。
测试文件:
# sort.log
1 aa
2 bb
10 cc
4 dd
2 ee
sort命令常见的用法有:
# -k:使用第几列进行排序
$ sort -k 2 sort.log
1 aa
2 bb
10 cc
4 dd
2 ee
# -n:使用自然排序
$ sort -n sort.log
1 aa
2 bb
2 ee
4 dd
10 cc
# -r:反序
$ sort -nr sort.log
10 cc
4 dd
2 ee
2 bb
1 aa
统计实战
在面试中,经常文本统计也是一个常见考点,比如面试官会问如何统计访问量前10的URL,或者访问量排名前10的IP,亦或者最耗时的界面,答案如下:
# 1.访问量前10的URL
# cut命令获取URL,第一个sort命令用去排序,方便uniq命令进行去重,接着用sort命令对结果再次排序
$ cat access.log | cut -f4 -d " " | sort | uniq -c | sort -k 1 -n -r | head -10
# 2.访问量排名前10的IP
# 原理同URL
$ cat access.log | cut -f1 -d " " | sort | uniq -c | sort -k 1 -n -r | head -10
# 3.最耗时的界面
$ cat access.log | sort -k 2 -n -r | head -10
写在最后
各位老板,创作不易,更需不断地磨练和总结,欢迎关注我,我是言淦,为你分享各种实用的编程知识与编程技巧,你们的点赞与关注是我前进和创作的最大动力!!