【问题标题】:How to use grep to output unique lines of code from a file?如何使用 grep 从文件中输出唯一的代码行?
【发布时间】:2013-03-09 05:12:17
【问题描述】:

我有一个大型日志文件,其中包含以下行:

82.117.22.206 - - [08/Mar/2013:20:36:42 +0000] "GET /key/0/www.mysite.org.uk/ HTTP/1.0" 200 0 "-" "-"

我想从与上述模式匹配的每一行中仅提取 ip 82.117.22.206 后跟一个空格和其中的文本 www.mysite.org.uk。 ip 和 text 可以不同。因此,鉴于上述行,输出文件中的行将是:

82.117.22.206 www.mysite.org.uk

如何在 bash 中使用 grep 或其他命令使输出唯一,以使输出文件不包含两条相同的行?有人可以推荐我到一个开始学习更多关于这种 shell 脚本的好地方吗?

【问题讨论】:

  • ip 很简单:cat log|awk '{print $1}'|sort|uniq。提取该主机名将更加困难。是不是 uri 总是 /key/0/hostname_goes_here
  • @MarcB 总是在/key/0/ 和另一个破折号/ 之间

标签: bash shell grep


【解决方案1】:

使用 perl 你可以捕获部分

use strict;
use warnings;

if (m/^(\d+\.\d+\.\d+\.\d+)\s+-\s+-\s+\[.+?\]\s+\"GET\s+\/key\/0\/(.+?)\//) {
    print "$1 $2\n";
}

并将其称为

perl -n script.pl logfile.txt | sort -u

这会提取所需的字段,排序并消除重复的行。

【讨论】:

  • 我没有得到任何输出
  • @Tom 我用您的示例作为输入对此进行了测试,它按预期工作。如果您没有得到任何输出,则您的日志文件可能是空的,或者模式与您发布的不同。
【解决方案2】:

如果您确定要使用的正则表达式,您可以执行以下操作:

echo "Hello World" | grep "Hell" | sed 's/\(Hell\).*\(World\)/\1 \2/'

只是,你会记录你的日志,而不是回显一个字符串。

【讨论】:

    【解决方案3】:
    grep -Po "^[\d.]*|[^/]*(?=/ HTTP)" file|sed 'N;s/\n/ /'
    

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多