awk 和 sed 命令从批次 Linux 到 Windows。如何转换?

awk and sed commands from batch Linux to Windows. How to convert it?

在我最近的项目中,我想制作一个脚本来转换 WireShark 输出以显示每个时间范围的字节数。有了这个我得到了工作脚本:

 ./tshark -r dumps/combinedOutput2.pcapng -T fields -e frame.time -e frame.len \
     | sed -e 's/\..*\t/\t/' \
     | awk -F"\t" '==last {sum += ; next} {
         printf("%s  %8d bytes/s (%6.2f Mbit/s)\n",last,sum,sum*8/1024/1024);
         last=;sum=}'

在 Windows 中(使用来自 GNU Windows 的 awk 和 sed 命令)引号和反斜杠的转义是不同的。但是我无法以正确的方式转换它并出现以下错误:

awk: {sed -e ^s/\.."\t/\t/}
awk:            ^ backslash not last character on line  
tshark: An error occurred while printing packets: Invalid argument.

谁能帮我正确设置格式?提前致谢!

您可以尝试用双引号替换 awk 单引号,如下所示

 ./tshark -r dumps/combinedOutput2.pcapng -T fields -e frame.time -e frame.len \
     | sed -e 's/\..*\t/\t/' \
     | awk -F"\t" '==last {sum += ; next} {
         printf("%s  %8d bytes/s (%6.2f Mbit/s)\n",last,sum,sum*8/1024/1024);
         last=;sum=}'

并使用 \

转义 " 中的双引号
 ./tshark -r dumps/combinedOutput2.pcapng -T fields -e frame.time -e frame.len \
     | sed -e 's/\..*\t/\t/' \
     | awk -F"\t" "==last {sum += ; next} {
         printf(\"%s  %8d bytes/s (%6.2f Mbit/s)\n\",last,sum,sum*8/1024/1024);
         last=;sum=}"

切勿在 Windows 中从命令行执行 awk 脚本,始终从文件中执行它以避免必须处理 Windows 噩梦般的引用规则。使用 awk 时也不需要 sed。

将此放入 script.awk:

BEGIN { FS="\t" }
{ sub(/\..*\t/,"\t") }
==last {sum += ; next}
{
    printf "%s  %8d bytes/s (%6.2f Mbit/s)\n", last, sum, sum*8/1024/1024
    last = 
    sum = 
}

并执行为:

./tshark -r dumps/combinedOutput2.pcapng -T fields -e frame.time -e frame.len \
 | awk -f script.awk