从批处理Linux到Windows的awk和sed命令。如何转换它?

时间:2016-05-04 11:07:55

标签: linux windows bash awk wireshark

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

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

在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.

任何人都可以帮我正确格式化吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

并使用"

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

答案 1 :(得分:0)

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

将其放入script.awk

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

并将其执行为:

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