Apache 如何在awk中打印一系列数据?

Apache 如何在awk中打印一系列数据?,apache,bash,awk,centos,Apache,Bash,Awk,Centos,我正在查看我的访问日志,如: cat access_log | grep 16/Sep/2012:17 | awk '{print $12 $13 $14 $15 $16}' | sort | uniq -c | sort -n | tail -40 其目的是查看在过去一小时内一直点击我的服务器的任何人的用户代理,并按点击次数排序。我的服务器有异常活动,我想阻止任何不需要的爬行器/等 但是:awk'{print$12$13$14$15$16}'这一部分更可取,就像:awk'{print$12

我正在查看我的访问日志,如:

cat access_log | grep 16/Sep/2012:17 | awk '{print $12 $13 $14 $15 $16}' | sort | uniq -c | sort -n | tail -40
其目的是查看在过去一小时内一直点击我的服务器的任何人的用户代理,并按点击次数排序。我的服务器有异常活动,我想阻止任何不需要的爬行器/等

但是:
awk'{print$12$13$14$15$16}'
这一部分更可取,就像:
awk'{print$12 through end of line}'
这样我就可以看到整个用户代理,每个代理的长度都不同


有没有办法用awk做到这一点?

不是非常优雅,但它可以:

grep 16/Sep/2012:17 access_log | awk '{for (i=12;i<=NF;++i) printf "%s ",$i;print ""}'

grep 16/Sep/2012:17访问日志(i=12;i不是非常优雅,但它可以:

grep 16/Sep/2012:17 access_log | awk '{for (i=12;i<=NF;++i) printf "%s ",$i;print ""}'

grep 16/Sep/2012:17访问日志| awk'{for(i=12;i我从未找到一个;在这种情况下,我使用
cut
(假设我不需要
awk
灵活处理字段分隔):


(澄清:我从来没有找到一个好方法。我在必要时使用@twalberg的for循环,但如果可能的话更喜欢使用
cut

我从来没有找到过一个;在这种情况下,我使用
cut
(假设我不需要
awk
灵活处理字段分隔):

(澄清:我从来没有找到一个好方法。我在必要时使用@twalberg的for循环,但如果可能的话,我更喜欢使用
cut

为什么不呢

  #!/bin/bash
  awk "/$1/"'{for (i=12;i<=NF;i++) printf("%s ", $i) ;printf "\n"}' log | sort | uniq -c | sort -n | tail -40 
没有办法测试此权限。请检查是否存在任何格式/语法错误。 希望你能明白

为什么不呢

  #!/bin/bash
  awk "/$1/"'{for (i=12;i<=NF;i++) printf("%s ", $i) ;printf "\n"}' log | sort | uniq -c | sort -n | tail -40 
没有办法测试此权限。请检查是否存在任何格式/语法错误。 希望你能明白

IHTH

$echo somefields:;cat somefields;echo from-to.awk:\
cat from-to.awk;echo;awk-f from-to.awk somefields
某些字段:
a b c d e f g h i j k l m n o p q r s t u v w x y z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
from-to.awk:
{for(i=12;i
$echo somefields:;cat somefields;echo from-to.awk:\
cat from-to.awk;echo;awk-f from-to.awk somefields
某些字段:
a b c d e f g h i j k l m n o p q r s t u v w x y z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
from-to.awk:


{for(i=12;i
awk'/16/Sep/2012:17/{for(i=1;i
awk'/16/Sep/2012:17/{for(i=1;i
cut-f12-
获取所有
awk'{从行尾打印$12}“
,按照O.P.党的说法,忘记了
cut
。好的解决方案!好的观点。我按照字面意思接受了12-16,但是
cut-f12-
更愿意得到整个行的剩余部分。它似乎是空格分隔的,而不是制表符分隔的。我喜欢这个主意,但它不起作用。@danielson317我已经更新了我的答案,但只有在有了的情况下它才会起作用。”每个字段之间正好有一个空格。
awk
更灵活,因为它考虑了任意数量的空格(由空格、制表符等组成)来分隔两个字段。非常好。我已经将另一个标记为解决方案,因为它使用了awk,但我投票支持你。获得所有
cut-f12-
不是吗{从行尾打印$12}“
,按照O.P.党的说法,忘记了
cut
。好的解决方案!好的观点。我按照字面意思接受了12-16,但是
cut-f12-
更愿意得到整个行的剩余部分。它似乎是空格分隔的,而不是制表符分隔的。我喜欢这个主意,但它不起作用。@danielson317我已经更新了我的答案,但只有在有了的情况下它才会起作用。”每个字段之间只有一个空格。
awk
更灵活,因为它考虑了任意数量的空白(由空格、制表符等组成)将两个字段分开。很好。我已经将另一个标记为解决方案,因为它使用了awk,但我投票支持你。脚本上的好主意。我现在做的还不足以证明必须设置所有这些。谢谢。但是,脚本上的好主意。我现在做的还不足以证明必须设置所有这些。谢谢尽管如此。我不确定我是否理解。不过感谢您的回复。awk读取的文件中的每一行(或从其他命令(如grep)输出)都是一条记录。NF是“字段”的数量每行。在上面的示例中,字母表有26个字段,数字行有21个字段,文件由2条记录组成。我不确定是否理解。不过感谢您的回复。awk读取的文件中的每一行(或从ANN其他命令(如grep)输出)都是一条记录。NF是“字段”的数量在上面的例子中,字母表有26个字段,数字行有21个字段,文件由2条记录组成。这也比我的回答有好处,我的回答允许你通过移动
awk
脚本中的搜索文本来消除
grep
awk'/16\/Sep\/2012:17/{…}“访问日志”
。与我的回答相比,这还有一个好处,即允许您通过将搜索文本移动到
awk
脚本:
awk'/16\/Sep\/2012:17/{…}“访问日志”
中来消除
grep
$ echo somefields:; cat somefields ; echo from-to.awk: ; \
  cat from-to.awk ; echo ;awk -f from-to.awk  somefields 
somefields:
a b c d e f g h i j k l m n o p q r s t u v w x y z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
from-to.awk:
{ for (i=12; i<=NF; i++) { printf "%s ", $i }; print "" }

l m n o p q r s t u v w x y z 
12 13 14 15 16 17 18 19 20 21 
awk '/16/Sep/2012:17/{for(i=1;i<12;i++){$i="";}print}' access_log| sort | uniq -c | sort -n | tail -40