我有一个文件,其中包含以下行
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
执行此操作答案 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]
}
}
}