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): ##
即使是标签也需要它
答案 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)
将xargs
与sh
和printf
一起使用。在两行之间添加注释。实时版本位于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