首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对uniq -c返回的值执行算术操作?

如何对uniq -c返回的值执行算术操作?
EN

Stack Overflow用户
提问于 2018-10-09 08:14:09
回答 1查看 156关注 0票数 0

我有Apache服务器的访问日志文件。使用Linux/UNIX命令,我计算了文件中的数字唯一日期。命令uniq -c返回文件中每个唯一日期的出现次数。是否可以使用uniq -c返回的值进行算术操作,或者是否有其他方法来计数发生和进行算术操作?下面是我的Linux逗号:

代码语言:javascript
复制
grep -E [0-9][0-9]/[A-Z]{1}[a-z]{2}/[0-9]{4} log.txt | sed 's/.*\(..\)\/Oct\/\(....\).*/\2-10-\1/' | sort | uniq -c | sort -ru | head -10

A这是输出:

代码语言:javascript
复制
358 2006-10-09
348 2006-10-10
347 2006-10-01
344 2006-10-20
339 2006-10-25
337 2006-10-24
337 2006-10-12
336 2006-10-06
336 2006-10-02
335 2006-10-19
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-09 09:03:17

您可能对一个awk脚本感兴趣,它可以在一次执行中完成上述所有操作(除了排序之外)。此外,如果您想做算术操作,awk是要使用的工具。

代码语言:javascript
复制
awk 'BEGIN{ ere="[0-9][0-9]/[A-Z][a-z][a-z]/[0-9][0-9][0-9][0-9]" }
     (match($0,ere)){ date=substr($0,RSTART,RLENGTH); a[date]++; n++ }
     END { for (date in a) {
              yyyy=substr(date,8,4);
              mm=(index("JanFebMarAprMayJunJulAugSepOctNovDec",substr(date,4,3))+2)/3
              mm=sprintf("%0.2d",mm)
              dd=substr(date,1,2)
              print a[date],a[date]/n,yyyy"-"mm"-"dd
           }
     }' log.txt

正如您提到的,您只想使用Linux/Unix命令来完成这一任务,我将自由地假定您是指bash。还有许多其他类型的外壳,但让我们来看看最常见的一种。

总之,这是不可能的。bash不支持浮点算法,但您可以伪造它。示例:

代码语言:javascript
复制
$ echo $(( 2/3 ))
1
$ printf "%f\n" "$(( 10**15 * 2 / 3  ))E-15"
0.666667

因此,假设您有所提供的输出,并且假设您必须进行总计,那么您可以这样做:

代码语言:javascript
复制
# total number of dates
n=3417

grep -E [0-9][0-9]/[A-Z]{1}[a-z]{2}/[0-9]{4} log.txt | sed 's/.*\(..\)\/Oct\/\(....\).*/\2-10-\1/' | sort | uniq -c | sort -ru | head -10 | \
while read -r count date; do
   printf "%f %d %s\n"  "$(( 10**15 * count / n  ))E-15" "$count" "$date"
done

但是既然你已经使用了sed,我还是建议awk

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52716302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档