如何使用grep从文件中输出唯一的代码行?

时间:2013-03-08 20:51:17

标签: bash shell grep

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

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和文本可以不同。因此,给定上面的行,输出文件中的行将是:

82.117.22.206 www.mysite.org.uk

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

3 个答案:

答案 0 :(得分:2)

使用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

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

答案 1 :(得分:0)

如果你弄清楚要使用的正则表达式,你可以这样做:

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

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

答案 2 :(得分:0)

grep -Po "^[\d.]*|[^/]*(?=/ HTTP)" file|sed 'N;s/\n/ /'