No.4 Linux文本统计命令

273 阅读2分钟

前言

本文主要讲述在Linux下,跟文本统计相关的一些命令,比如wcsortuniqcut等。

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

写在最后

各位老板,创作不易,更需不断地磨练和总结,欢迎关注我,我是言淦,为你分享各种实用的编程知识与编程技巧,你们的点赞与关注是我前进和创作的最大动力!!

参考

1.Shell脚本统计文件行数的8种方法
2.单词计数
3.Linux之cut用法
4.Linux sort命令