文件中多个参数的计数器

时间:2019-03-27 16:42:25

标签: bash

awk '{print $1}' ios-example.com.access | sort | uniq -c | sort -nr

https://pajda.fit.vutbr.cz/ios/ios-19-1-logs/blob/master/ios-example.com.access.log- 这是ios-example.com.access

我制作了一些东西,并且效果很好,但并不完全符合我的要求。有人可以帮助我并升级我的命令吗?

输出现在看起来像这样:

8 192.27.69.191
2 82.202.69.253

输出必须看起来像这样:

198.27.69.191 (8): ########
82.202.69.253 (2): ##

即使是标签也需要它

3 个答案:

答案 0 :(得分:1)

您可以通过在列表中添加另一个awk来升级命令,或者可以对整个操作使用单个awk:

awk '{a[$1]++}
     END { for(i in a) { 
             printf "%s (%d):" ,i,a[i]
             for(j=0;j<a[i];++j) printf "#"; printf "\n"
           }
     }' file

答案 1 :(得分:0)

xargsshprintf一起使用。在两行之间添加注释。实时版本位于tutorialspoint

# sorry cat
cat <<EOF |
8 192.27.69.191
2 82.202.69.253
EOF
# for each 2 arguments
xargs -n2 sh -c '
    # format the output as "$2 ($1): "
    printf "%s (%s): " "$2" "$1"
    # repeat the character `#` $1 times
    seq "$1" | xargs printf "#%.0s"
    # lastly a newline
    printf "\n"
' --

我认为我们可以通过以下方式将其缩短:

xargs -n2 sh -c 'printf "%s (%s): %s\n" "$2" "$1" $(printf "#%.0s" $(seq $1))' --

或者如果输入足够安全,也可能只是回声:

xargs -n2 sh -c 'echo "$2 ($1): $(printf "#%.0s" $(seq $1))"' --

答案 2 :(得分:0)

cat ios-example.com.access | sort | uniq -c | awk 'ht="#"{for(i=1;i<$1;i++){ht=ht"#"} str=sprintf("%s (%d): %s", $2,$1, ht); print str}'

预期文件内容如下:

ipadress1
ipadress1
ipadress1
ipadress2
ipadress2
ipadress1
ipadress2
ipadress1
相关问题