以下行中有两个长度。我想提取值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.
谢谢
答案 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.com
要sum()
向上,您可以将代码调整为:
# 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.
请注意,如果文件中有多行,则必须在循环中使用它。
干杯!