当匹配条件在行中出现两次时,grep一个特定的值

时间:2016-06-19 18:37:06

标签: python regex shell awk grep

以下行中有两个长度。我想提取值46并添加16。

1466352405.455975 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 46) 192.168.52.53.32769 > 192.168.52.54.9600: UDP, length 18

我尝试了grep '\slength' | cut -d: -f1,但它没有给出正确的结果。我希望获得46并增加16。所以最终值应该是64.

谢谢

7 个答案:

答案 0 :(得分:0)

我想你的意思是“加18”;)

无论如何,因为你用“python”

标记了你的问题
import re
s = "1466352405.455975 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 46) 192.168.52.53.32769 > 192.168.52.54.9600: UDP, length 18"
re.findall("length (\d+)",s)

答案 1 :(得分:0)

Python中使用以下代码段:

import re

regex = r'length (\d+)'
# search for length, a space and digits (capture these)
string = "1466352405.455975 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 46) 192.168.52.53.32769 > 192.168.52.54.9600: UDP, length 18"

numbers = re.findall(regex, string)
print numbers
# ['46', '18']

a demo on ideone.comsum()向上,您可以将代码调整为:

# taken from http://interactivepython.org/runestone/static/pythonds/Recursion/pythondsCalculatingtheSumofaListofNumbers.html
def listsum(numList):
    theSum = 0
    for i in numList:
        theSum = theSum + int(i)
    return theSum

print listsum(numbers)
# 64

答案 2 :(得分:0)

$ awk '{print $17+16}' file
62

如果这不是您想要的,那么请编辑您的问题以澄清您的要求,并提供更具真实代表性的样本输入和预期输出。

答案 3 :(得分:0)

如果不了解输入格式的规则,就无法给出一个好的答案。鉴于你向我们展示了什么,

awk '{ x = 16 + $17; print x }'

将打印62.如果要打印64,请添加18。 ;-)

答案 4 :(得分:0)

如果在Awk中分割length上的输入,则可以访问每个字段中的第一个数字标记,就好像它是算术运算中的整个字段一样。

awk -F length 'NF==3{ print $2+16 }'

正如您所料,如果您需要,可以在$3中使用第二个值。

如果您想无条件地执行此操作,请删除当前验证有NF==3次出现的条件length(您可能希望NF>3检查两个或更多)。如果没有出现,则拆分不会拆分,因此字段数将为1(整行);如果只有一次出现,则该行将被拆分,因此有两个输入字段 - 发生前的部分和后面的部分;等

答案 5 :(得分:0)

尝试此命令获取第二个长度:

grep -oP 'length \d+.+length \d+' | grep -oP '\d+$'

对于给定的样本,它正确获得18,为结果添加16对您来说不是问题。

答案 6 :(得分:-1)

我相信你想加46和18.

对于单行,您可以使用以下命令

grep -o "length [0-9]*" file | cut -d " " -f2 | xargs | awk '{print $1 + $2}'

在使用您的示例执行时,它会给出结果64.

请注意,如果文件中有多行,则必须在循环中使用它。

干杯!