Linux 如何使频率出现在终端中的图案后?
我有一个Apache web服务器。我需要在终端上显示2006年10月1日前10位主机的使用频率。我的代码如下:Linux 如何使频率出现在终端中的图案后?,linux,shell,ubuntu,terminal,Linux,Shell,Ubuntu,Terminal,我有一个Apache web服务器。我需要在终端上显示2006年10月1日前10位主机的使用频率。我的代码如下: 6 k141cluster2.fsv.cvut.cz 4 cm-84.209.247.208.chello.no 4 bl1sch2043806.phx.gbl 4 207.188.28.33 3 ppp196-169.adsl.forthnet.gr 3 c-67-169-64-181.hsd1.ca.comcast.net 3 222.231.42.14 2 tang-six-o
6 k141cluster2.fsv.cvut.cz
4 cm-84.209.247.208.chello.no
4 bl1sch2043806.phx.gbl
4 207.188.28.33
3 ppp196-169.adsl.forthnet.gr
3 c-67-169-64-181.hsd1.ca.comcast.net
3 222.231.42.14
2 tang-six-o-five.mit.edu
2 slim07.kataweb.it
2 s010600055ddf8597.ed.shawcable.net
cat log.txt | grep 01/Oct/2006 | cut-d'-f1 | sort | uniq-c | sort-rn | head-10
其输出如下:
6 k141cluster2.fsv.cvut.cz
4 cm-84.209.247.208.chello.no
4 bl1sch2043806.phx.gbl
4 207.188.28.33
3 ppp196-169.adsl.forthnet.gr
3 c-67-169-64-181.hsd1.ca.comcast.net
3 222.231.42.14
2 tang-six-o-five.mit.edu
2 slim07.kataweb.it
2 s010600055ddf8597.ed.shawcable.net
但我希望它显示为:
k141cluster2.fsv.cvut.cz 6
cm-84.209.247.208.chello.no 4
bl1sch2043806.phx.gbl 4
207.188.28.33 4
ppp196-169.adsl.forthnet.gr 3
c-67-169-64-181.hsd1.ca.comcast.net 3
222.231.42.14 3
tang-six-o-five.mit.edu 2
slim07.kataweb.it 2
s010600055ddf8597.ed.shawcable.net 2
如何使用标准命令获取它,如:cut
,paste
,head
,tail
,cat
,tac
,wc
,grep
,sort
,sed
,uniq
我想把它们相互替换。但是我不知道有什么方法可以做到这一点。这里有一个没有awk的解决方案(如评论中所问)
#/bin/bash
#访问次数
grep'01/Oct/2006'log.txt | cut-d'-f1 |
分拣| uniq-c |分拣-rn |头-10|
#删除前导空格
sed's//^*//g'|
#Grep表示后跟空格的数字
grep-o“[0-9]*”>访问
#主人
grep'01/Oct/2006'log.txt | cut-d'-f1 |
排序| uniq-c |排序-rn | head-10 |
sed's//^*//g'| cut-d'-f2>主机
#对于频率,使用wc-l计算主机总数(10000)。
#0,06%x1000=6次访问
同时阅读nbr;做
主机=$(wc-l>百分比
粘贴主机百分比>主机百分比
#或浏览次数
#粘贴主机访问
您可以使用sed
修改管道的输出:
$ cat log.txt | grep 01/Oct/2006 | cut -d' ' -f1 | sort | uniq -c | sort -rn |
head -10 | sed -E 's/^([ ][ ]*[[:digit:]][[:digit:]]*[ ][ ]*)(.*$)/\2\1/'
k141cluster2.fsv.cvut.cz 6
cm-84.209.247.208.chello.no 4
bl1sch2043806.phx.gbl 4
207.188.28.33 4
ppp196-169.adsl.forthnet.gr 3
c-67-169-64-181.hsd1.ca.comcast.net 3
222.231.42.14 3
tang-six-o-five.mit.edu 2
slim07.kataweb.it 2
s010600055ddf8597.ed.shawcable.net 2
您还可以编写一个gawk
脚本,该脚本将替换整个管道并允许更轻松的自定义:
$ gawk 'function by_vi(i1,v1,i2,v2) {
v1 = v1+0
v2 = v2+0
if (v1 > v2) return -1
if (v2 > v1) return 1
# vals are same; now sort on idx
return (i2 < i1) ? -1 : (i1 != i2)
}
/01\/Oct\/2006/ {cnt[$1]++}
END{PROCINFO["sorted_in"]="by_vi"
lcnt=1
for (e in cnt) { printf "%s \t%s\n", e, cnt[e]
if(++lcnt>10) break
}
}' log.txt
# same output
_vi(i1、v1、i2、v2)提供的$gawk'函数{
v1=v1+0
v2=v2+0
如果(v1>v2)返回-1
如果(v2>v1)返回1
#VAL是相同的;现在在idx上排序
返回(i210)中断
}
}'log.txt
#相同输出
您能描述一下您预期的“使用百分比”吗?什么百分比?使用awk
。通读输入,将$1添加到total变量中,并将所有行保存在一个数组中。然后在END
块中,循环遍历数组,将计数除以总数得到百分比,然后将它们全部打印出来。欢迎使用堆栈溢出!StackOverflow不是免费的编码服务。所以我希望你能。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅并使用:)Try append to your command:*|awk'{print$2”“$1}'**。