Linux 如何使频率出现在终端中的图案后?

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

我有一个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-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}'**。