一尘不染

使用“ uniq -c”命令时需要从输出中删除计数

linux

我正在尝试读取文件,并按特定字段出现的次数对其进行排序。假设我想从日志文件中找出最重复的日期,然后使用uniq -c选项并按降序对其进行排序。像这样的东西

uniq -c | sort -nr

这将产生这样的输出-

809 23/Dec/2008:19:20

第一个字段实际上是计数,这对我来说是个问题..我想从上述输出中获取日期,但我无法获取。我试图使用cut命令并执行此操作

uniq -c | sort -nr | cut -d' ' -f2

但这只是打印空白…请有人可以帮我确定日期并减少计数。我只想要

23/Dec/2008:19:20

谢谢


阅读 956

收藏
2020-06-03

共1个答案

一尘不染

uniq除非计数中的位数超过7位,否则from 之前会带有空格,因此您需要执行以下操作:

uniq -c | sort -nr | cut -c 9-

使列(字符位置)向上9。或者您可以使用sed

uniq -c | sort -nr | sed 's/^.\{8\}//'

要么:

uniq -c | sort -nr | sed 's/^ *[0-9]* //'

当重复计数达到10,000,000或更多时,第二种选择是可靠的;如果您认为这可能是个问题,那么它可能比cut替代方法更好。无疑还有其他选择。


注意:计数是通过在Mac OS X 10.7.3上进行实验确定的,但使用的uniqcoreutils8.3版本的GNU 。BSD在uniq -c产生一位数之前产生了3个前导空格。POSIX规范说来自的输出uniq -c应格式化为:

printf("%d %s", repeat_count, line);

不会有任何空白。鉴于输出格式可能存在这种差异,sed带有[0-9]正则表达式的脚本是处理以下观察值和理论输出的变化的最可靠方法uniq -c

uniq -c | sort -nr | sed 's/^ *[0-9]* //'
2020-06-03