linux - 监听 netcat 工作但不能 grep'able(或其他几个实用程序)

标签 linux bash shell pipeline netcat

我正在测试一些 netcat udp shell 工具,并试图获取输出并通过标准管道发送它。在这个例子中,我有一个 netcat 客户端,它发送 'foo',然后是 'bar',然后是 'foo',每次尝试从监听器读取时都带有换行符:

[root@localhost ~ 05:40:20 ]# exec 5< <(nc -d -w 0 -6 -l -k -u 9801)
[root@localhost ~ 05:40:25 ]# awk '{print}' <&5
foo
bar
foo
^C
[root@localhost ~ 05:40:48 ]# awk '{print}' <&5 | grep foo
^C
[root@localhost ~ 05:41:12 ]# awk '{print}' <&5 | grep --line-buffered foo
^C
[root@localhost ~ 05:41:37 ]#
[root@localhost ~ 05:44:38 ]# grep foo <&5
foo
foo
^C
[root@localhost ~ 05:44:57 ]#

我已经检查了 --line-buffered... 我也从“od -bc”得到了相同的行为,即什么也没有。 Grep 在 fd 上工作......但是如果我将该 grep 传递给任何东西(比如 od -bc,cut),我得到相同的(没有)。尝试在最后一个 grep 前加上 stdbuf -oL,但无济于事。可以 > to file 然后 tail -f 它,但感觉好像遗漏了什么。

更新: 似乎与描述符/顺序/时间相关。我创建了一个文件“tailSource”并改用它,这在我运行 echo -e "foo\nfoo\nbar\nfoo">> tailSource

时产生了同样的问题(无输出)
[root@localhost shm 07:16:18 ]# exec 5< <(tail -n 0 -f tailSource)
[root@localhost shm 07:16:32 ]# awk '{print}' <&5 | grep foo

...当我在没有'|的情况下运行时grep foo',我得到了我期望的输出。 (GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu))

最佳答案

awk 在其输出未进入终端时进行缓冲。如果你有 GNU awk,你可以使用它的 fflush() 函数在每次打印后刷新

gawk '{print; fflush()}' <&5 | grep foo

不过在这种特殊情况下,您不需要 awk 和 grep,两者都可以。

awk /foo/ <&5
grep foo <&5

参见 BashFAQ 9有关缓冲及其解决方法的更多信息。

关于linux - 监听 netcat 工作但不能 grep'able(或其他几个实用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252467/

相关文章:

bash - 检查命令是否成功使 shell 脚本很长

linux - 获取 tail -f 日志时 DSH(舞者的 shell )挂起

linux - 邮件命令行为不当

bash - 子shell IO重定向

linux - Pascal for Linux 的简单 IDE

python - 尝试将命令行输出保存到文件时出错

java - 如何下载较旧的 google play 服务?

bash - sed,只捕获数字

Android 10 - netstat 执行无法正常工作

linux - 如果字符出现在特定位置,则提取整行