gpt4 book ai didi

linux - awk 和数据流通过管道不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:15 24 4
gpt4 key购买 nike

我今天遇到一个问题,在 ubuntu 14.04 下使用 fifo 的 awk 命令和数据流。

我有一个 writer.sh 提供数据

#!/bin/bash

PIPE_NAME="pipe.fifo"
DATA="dataA,dataB"

# create fifo if doesn't exist
if ! [ -p "$PIPE_NAME" ]; then
mkfifo $PIPE_NAME
fi
# keep fifo openned
sleep 10000 > $PIPE_NAME &

while [[ true ]];
do
echo $DATA > $PIPE_NAME
sleep 1
done

工作正常。

在另一个 shell 上,如果我写命令:

cat pipe.fifo|grep data|awk -F, '{print $1}'

我什么都没得到

我尝试创建一个包含以下内容的 dataList.txt 文件:

dataA,dataB
dataA,dataB
dataA,dataB

以下命令:

cat dataList.txt|grep data|awk -F, '{print $1}'

产生预期的结果:

dataA
dataA
dataA

注意:grep 命令在这里没有任何意义,但在我的应用程序中,仅获取与特定模式匹配的数据很有用。

你知道我误解了什么吗?

最佳答案

writer.sh 中对管道的第一次写入将阻塞,直到从管道中读取内容。我建议这样写 writer.sh:

#!/bin/bash

pipe_name="pipe.fifo"
data="dataA,dataB"

[ -p "$pipe_name" ] || mkfifo "$pipe_name"

while :; do
echo "$data"
sleep 1
done > "$pipe_name"

在这里,管道将保持打开状态,直到您的 while 循环退出。

如果 grep 正在缓冲它的输出,那么它会在数据到达时不断地从管道中读取,但是它不会输出任何东西到管道到 awk 直到该缓冲区已满或直到它存在。由于 writer.sh 处于无限循环中,您只需等待缓冲区已满即可。

由于 grep | 的组合awk 有点反模式(因为 awk 可以进行自己的过滤),您可以用

替换阅读器
awk -F, '/data/ {print $1}' pipe.fifo

因为它正在写入终端,所以不会缓冲其输出。

关于linux - awk 和数据流通过管道不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42559274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com