如何用AWK、TShark批量脚本实现数据包ASCII内容换行输出?
网络数据包ASCII内容捕获与写入方案
1. 实时写入并允许运行期间读取文件
默认命令行工具会缓冲输出,导致文件无法实时更新。要实现实时写入,需关闭输出缓冲:
- 使用
stdbuf强制无缓冲输出:
说明:stdbuf -oL tshark -i 1 -f "CaptureFilter" -x -l | awk 'BEGIN{buf=""} /^$/{if(buf!=""){print buf;buf=""} next} {buf=buf $NF} END{if(buf!="") print buf}' >> output.txtstdbuf -oL:强制后续命令采用行缓冲,输出会立刻写入文件tshark -l:让tshark按行输出,配合缓冲设置实现实时刷新>>:确保内容追加而非覆盖文件- awk脚本负责合并单个数据包的ASCII内容(逻辑见问题3)
2. 单次捕获单个数据包并追加写入
若实时方案不可行,可循环单次捕获数据包,每次运行时追加内容:
- 编写bash循环脚本:
说明:while true; do tshark -i 1 -f "CaptureFilter" -x -c 1 | awk 'BEGIN{buf=""} /^$/{if(buf!=""){print buf;buf=""} next} {buf=buf $NF} END{if(buf!="") print buf}' >> output.txt sleep 0.1 # 可选,避免过于频繁捕获 donetshark -c 1:仅捕获1个数据包>> output.txt:将结果追加到文件末尾,完全不会覆盖原有内容- 循环持续运行,每次捕获一个包就写入一行
3. 将单个数据包的ASCII内容合并为单行
要把每个数据包的多行ASCII内容合并成一行,每个数据包单独占一行,可通过awk处理tshark的输出:
核心awk逻辑:
BEGIN { buf = "" } # 遇到数据包分隔的空行时,输出当前缓冲内容并重置 /^$/ { if (buf != "") { print buf buf = "" } next } # 提取每行的ASCII部分(tshark输出中每行最后一个字段),拼接到缓冲区 { buf = buf $NF } # 处理最后一个未被空行触发的数据包 END { if (buf != "") print buf }
整合到命令后,输出格式完全符合预期:
..a1...c].....d..6..@.f........3.2.. ..a1...c].....d..6..@.f........3.2.. ..a1...c].....d..6..@.f........3.2..
内容的提问来源于stack exchange,提问作者JimmyJohnson
相关产品推荐
相关产品推荐

