gpt4 book ai didi

linux - 如何获得grep每条输出行的长度

转载 作者:太空狗 更新时间:2023-10-29 12:02:54 25 4
gpt4 key购买 nike

我是 bash 脚本的新手。我有一个要解析的网络跟踪文件。跟踪文件的一部分是(两个数据包):

    [continues...]
+---------+---------------+----------+
05:00:00,727,744 ETHER
|0
|00|03|a0|09|5c|1c|00|10|07|df|a4|20|08|00|45|00|00|38|e7|55|

+---------+---------------+----------+
05:00:00,727,751 ETHER
|0
|00|03|a0|09|5c|1c|00|10|07|df|a4|20|08|00|45|00|00|38|e7|56|00|00|3a|01|

[continues...]

对于每个数据包,我想打印时间戳和数据包的长度(十六进制值出现在 |0 header 之后的下一行),因此输出将如下所示:

    05:00:00.727744 20 bytes
05:00:00.727751 24 bytes

我可以在 bash 中使用 grep 分别获取带有时间戳的行和数据包:

times=$(grep  '..\:..\:' $fileName)
packets=$(grep '..|..|' $fileName)

但在那之后我无法使用单独的输出行。整个结果连接在两个变量“times”和“packets”中。如何获取每个数据包的长度?

附言一个很好的引用,真正解释了如何进行 bash 编程,而不仅仅是做例子,我们将不胜感激。

最佳答案

好吧,用普通的旧外壳...

你可以这样得到线的长度:

line="|00|03|a0|09|5c|1c|00|10|07|df|a4|20|08|00|45|00|00|38|e7|55|"
wc -c<<<$line
62

那一行有六十二个字符。将每个字符视为 |00其中 00可以是任何数字。在这种情况下,还有一个额外的 |最后。另外,wc -c包括 NL最后。

所以,如果我们取 wc -c 的值, 并减去 2,我们得到 60 .如果我们将其除以 3,我们会得到 20这是字符数。

好的,现在我们需要一个小循环,找出不同的行,然后解析它们:

#! /bin/bash

while read line
do
if [[ $line =~ ^[[:digit:]]{2} ]]
then
echo -n "${line% *}"
elif [[ $line =~ ^\|[[:digit:]]{2} ]]
then
length=$(wc -c<<<$line)
((length-=2))
((length=length/3))
echo "$length bytes"
fi
done < test.txt

有一个PURE BASH解决您的问题的方法!

你是 Bash 程序员的新手,你不知道发生了什么......

让我们一步一步来:

在 BASH 中循环遍历文件的一种常见方法是使用 while read环形。这结合了 whileread :

while read line
do
echo "My line is '$line'"
done < test.txt

test.txt 中的每一行正在读入 $line外壳变量。

我们来看下一个:

if [[ $line =~ ^[[:digit:]]{2} ]]

这是一个 if陈述。始终使用 [[ ... ]]括号,因为它们修复了 shell 插值问题。此外,它们还有更多的权力。

=~是正则表达式匹配。 [[:digit:]]匹配任何数字。 ^将正则表达式锚定到行首,{2}意味着我想要其中两个。这表示如果我匹配以两位数字开头的行(这是您的时间戳行),请执行此 if条款。

${line% *}是一个模式过滤器。 %说匹配右边的(glob)最小的glob模式并从我的$line中过滤它多变的。我用它来删除 ETHER从我的行。 -n告诉echo不要做 NL。

让我们来看看我的 elif这是一个 else if 子句。

elif [[ $line =~ ^\|[[:digit:]]{2} ]]

同样,我正在匹配一个正则表达式。此正则表达式以 (The ^) a | 开头.我必须在前面加一个反斜杠,因为 |是一个神奇的正则表达式字符和\杀死魔法。现在只是一根 pipe 。然后,后面跟着两位数字。注意这会跳过 |0但捕获了|00 .

现在,我们必须做一些计算:

length=$(wc -c<<<$line)

$(...)说执行附带的命令并将其重新替换回行中。 wc -c计算字符和 <<<$line是我们正在计算的。这给了我们 62人物。我们必须减去 2,然后除以 3。这是接下来的两行:

((length-=2))
((length/=3))

((...))允许我做基于整数的数学。第一个从 $length 中减去 2接下来将它除以 3 .现在,我可以回应这一点:

echo "$length bytes"

这就是我们对这个问题的纯 Bash 回答。

关于linux - 如何获得grep每条输出行的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com