将 awk 输出重定向到 bash 中的文件
redirecting awk output to file in bash
我正在编写一个 bash 脚本来捕获信标帧数据包(没有错误的 fcs)并以首选格式输出它们,但是我在将输出重定向到文件时遇到问题。
这是我重定向到名为 temp
的文件时的命令行
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};[=11=]~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=11=]~/CH:/) && !([=11=]~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}' >> temp
当我没有重定向到文件时,上面的命令行在终端中工作正常(显示输出)。当我重定向到一个文件时,我看到该文件存在但没有输出。
我尝试了以下方法
1.Pipe 命令行输出如 tee -a temp
(输出到标准输出和文件)
例子
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};[=12=]~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=12=]~/CH:/) && !([=12=]~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}'|tee -a temp
我试过了
exec > temp
command line above
由于数据包捕获速度很快,这可能是一个缓冲问题吗?
如何将上述命令行的结果重定向到文件中?
注意:命令行中的mon0
代表我在无线适配器上使用airmon-ng
启动的监控界面
编辑:代码细分如下
BEGIN {
FS=",| "
printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."
}
[=13=]~/Beacon/ {
for(i=1;i<=NF;++i) {
if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=13=]~/CH:/) && !([=13=]~/tsft bad-fcs/)) {
NR=++c
arr[$i]=1
gsub(/\(|\)/,"",$i)
printf("%-10s %-25s",NR,$i)
for(x=1;x<=NF;++x) {
if($x~/^CH:/) {
print $x " "$(x+1) "\tHit Ctrl+C to stop scan"
}
}
}
}
}
正如我提到的,代码工作正常。这只是重定向问题。如果需要,请提供对代码的改进。
可能不是答案,而且我一直没有使用 bash,但可能会尝试将其发送到文本文件。 temp 可以被视为一个目录。而是尝试 exec > temp.txt
在阅读了一些 awk 和 gawk 之后......我在我的一篇文章中遇到了一个关于缓冲行为的非常有趣的话题 text.This 解决了我的问题......我使用以下方法更改了 awk 的缓冲行为
fflush("") ==> gawk and newer versions of awk
或
system("")==> older versions of awk
这会强制 awk 立即为每个输入行刷新其输出。
我在命令行中尝试了上述每个功能,我的输出立即重定向到我的文件 temp
。
我正在编写一个 bash 脚本来捕获信标帧数据包(没有错误的 fcs)并以首选格式输出它们,但是我在将输出重定向到文件时遇到问题。
这是我重定向到名为 temp
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};[=11=]~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=11=]~/CH:/) && !([=11=]~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}' >> temp
当我没有重定向到文件时,上面的命令行在终端中工作正常(显示输出)。当我重定向到一个文件时,我看到该文件存在但没有输出。
我尝试了以下方法
1.Pipe 命令行输出如 tee -a temp
(输出到标准输出和文件)
例子
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};[=12=]~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=12=]~/CH:/) && !([=12=]~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}'|tee -a temp
我试过了
exec > temp command line above
由于数据包捕获速度很快,这可能是一个缓冲问题吗?
如何将上述命令行的结果重定向到文件中?
注意:命令行中的mon0
代表我在无线适配器上使用airmon-ng
编辑:代码细分如下
BEGIN {
FS=",| "
printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."
}
[=13=]~/Beacon/ {
for(i=1;i<=NF;++i) {
if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=13=]~/CH:/) && !([=13=]~/tsft bad-fcs/)) {
NR=++c
arr[$i]=1
gsub(/\(|\)/,"",$i)
printf("%-10s %-25s",NR,$i)
for(x=1;x<=NF;++x) {
if($x~/^CH:/) {
print $x " "$(x+1) "\tHit Ctrl+C to stop scan"
}
}
}
}
}
正如我提到的,代码工作正常。这只是重定向问题。如果需要,请提供对代码的改进。
可能不是答案,而且我一直没有使用 bash,但可能会尝试将其发送到文本文件。 temp 可以被视为一个目录。而是尝试 exec > temp.txt
在阅读了一些 awk 和 gawk 之后......我在我的一篇文章中遇到了一个关于缓冲行为的非常有趣的话题 text.This 解决了我的问题......我使用以下方法更改了 awk 的缓冲行为
fflush("") ==> gawk and newer versions of awk
或
system("")==> older versions of awk
这会强制 awk 立即为每个输入行刷新其输出。
我在命令行中尝试了上述每个功能,我的输出立即重定向到我的文件 temp
。