使用awk或sed进行比较

时间:2010-08-27 11:07:46

标签: sed awk

我有一个文件,其中包含以下行

13:26:35.655029 (TN) sh:sdf:sdf > ra:ram:raml, type Normal (800), length 21: ID 10.1.1.1 > 20.2.2.2: Addr 77: TP
13:26:35.656029 (TN) ra:ram:raml > sh:sdf:sdf, type Normal (800), length 21: ID 20.2.2.2 >10.1.1.1: Addr 77: TP 

我需要从第一行得到sh:sdf:sdf,ra:ram:raml,10.1.1.1,20.2.2.2和ra:ram:raml sh:sdf:sdf 20.2.2.2 10.1.1.1来自第二行。如何使用sed或awk

执行此操作

2 个答案:

答案 0 :(得分:1)

awk -F"[>,)]" '{gsub(/.*ID /,"",$6);gsub(/Addr.*/,"",$7);print $2,$3,$6,$7 }' file

基本上,它将字段分隔符设置为3种类型的字符>,)。然后2美元,3美元,6美元,7美元将包含你想要的东西,但有一些无关的字符串。所以我们使用gsub()来处理它们。

@OP,对不起,我无法解释更多。如果你在命令行上尝试它是最好的。从基础开始,

awk -F"[>,)]" '{print $2,$3,$6,$7 }' file

打印每个字段,看看会发生什么。然后逐个插回gsub()语句,看看会发生什么。

答案 1 :(得分:0)

我不确定你是否能从sed或awk获得这个级别的差异。使用Perl,Python或Ruby可能会更好。可能有一些awk魔法可以处理该作业,因为您可以将一个文件作为输入处理,并使用getline <filename varname每次迭代从另一个文件中读取一行。如果您以前从未使用过输入流以外的文件的I / O很奇怪,但您可能会采用这种方法。

这是一个完全未经测试的Awk脚本的开始。已经有一段时间了,因为我在awk中写的不仅仅是一行代码,所以这可能不完全正确。

{
    left_line = $0
    getline <'other-file.txt' right_line
    left_count = split(left_line, left_tokens)
    right_count = split(right_line, right_tokens)
    if (left_count >= right_count)
       token_count = left_count
    else if (right_count > left_count)
       token_count = right_count
    for (token_index=0; token_index<token_count; token_index+=1) {
       if (left_tokens[token_index] != right_tokens[token_index]) {
          print left_tokens[token_index], right_tokens[token_index]
       }
    }
}