Этот awk
скрипт покажет вам разницу в секундах между отметками времени во втором столбце первых двух строк
awk -F, '{ cmd = "date --date " $2 " +%s "; cmd | getline sec[NR] } NR>2 { exit } END { print (sec[2] > sec[1]) ? (sec[2] - sec[1]) : (sec[1] - sec[2]) }' <filename
Он может тоже можно разбить так, если хотите:
awk -F, '
# Read a line, get column two and convert it to seconds since the epoch
{ cmd = "date --date " $2 " +%s "; cmd | getline sec[NR] }
# After two lines start to exit
NR>2 { exit }
# At exit print the absolute value of the difference between the two times
END { print (sec[2] > sec[1]) ? (sec[2] - sec[1]) : (sec[1] - sec[2]) }
' <filename
Наконец, я получил действительно работающую систему. Это не идеальная настройка, но, по крайней мере, она работает, так что, возможно, это поможет кому-то в будущем.
Я использовал сценарий Python поверх PySerial для запуска tcpdump через UART и использования hexdump, чтобы двоичные данные могли пройти по каналу связи, не будучи измененными правилами транскрипции tty. Затем сценарий Python преобразует данные обратно и передает их в wireshark. Приведенный ниже сценарий является результатом, по сравнению со сценарием из вопроса, я добавил опцию -v
в hexdump, чтобы он не пытался сжимать одинаковые строки.
import serial
import sys
import subprocess
import binascii
def main(args):
with serial.Serial('/dev/ttyUSB0', 115200, timeout=5) as ser:
# Spawn tcpdump on the host and convert the raw output to stupid hex format
# We need hexdump -C because that's the only format that doesn't mess up with the endianess
length = ser.write(b"tcpdump -U -s256 -i eth0 -w - 2> /dev/null | hexdump -Cv\n")
# Discard command line that is echoed
discard = ser.readline()
# Spawn wireshark
wireshark = subprocess.Popen(
["wireshark", "-k", "-i", "-"], stdin=subprocess.PIPE
)
while True:
# Process each line separately
data = ser.readline().decode('ascii')
elements = data.split()
# Remove the address and ascii convertion of hexdump and spaces
hexa = "".join(elements[1:17])
# Convert back hex to binary
real_data = binascii.unhexlify(hexa)
# Feed to the shark
wireshark.stdin.write(real_data)
try:
wireshark.stdin.flush()
except BrokenPipeError as e:
break
# Stop tcpdump
ser.write(b"\x03")
wireshark.wait()
return 0
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))