如何对uniq -c返回的值进行算术运算?

时间:2018-10-09 08:14:10

标签: shell sed grep uniq

我具有Apache Web服务器的访问日志文件。使用Linux / UNIX Shell命令,我计算了文件中唯一日期的数量。命令uniq -c返回文件中每个唯一日期的出现次数。是否可以使用uniq -c返回的值进行算术运算,或者是否有其他方法可以计算发生次数并进行算术运算?这是我的Linux命令:

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

这是输出:

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

1 个答案:

答案 0 :(得分:2)

您可能对单个脚本感兴趣,该脚本可以一次性完成上述所有操作(排序除外)。另外,是您要进行算术运算的工具。

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 Shell命令来执行此操作,因此我可以自由地假设您的意思是。还有许多其他类型的外壳,但让我们采用最常见的一种。

简而言之,不,这不可能。 不支持浮点运算,但是您可以伪造它。示例:

$ echo $(( 2/3 ))
1
$ printf "%f\n" "$(( 10**15 * 2 / 3  ))E-15"
0.666667

因此,假设您拥有呈现的输出,并且还假设必须总计,则可以执行以下操作:

# 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

但是由于您已经使用,所以我仍然建议