2

我使用一个命令,比如 cat 一个管道文件并 grep 一些数据。一个简单的代码,例如,

temp=""
temp=$(cat file|grep "some data"| wc -c)
if [ $temp -gt 0 ]
then
    echo "I got data"
fi

该文件是一个管道(FIFO),它将输出数据并且不会停止。如何在有限时间内终止 cat pipe 的命令?

4

5 回答 5

0

我在第 3 行将 $ 添加到临时变量:

if [ $temp -gt 0 ]

因为您想比较 temp 值,并且在变量之前使用 $ 得到它。

关于文件“管道”,你可以执行 cat 直到你得到一个特定的字符串。我的意思是,您可以使用 cat 进行阅读并在收到例如“\n”时停止。

我会给你一个可以在终端中运行的例子:

cat > example_file.txt << EOF
hello
I'm a example filen
EOF

cat 将从标准输入读取,直到您输入“EOF”。然后,文件的内容将是:

cat example_file.txt 
hello
I'm an example file

因此,您可以通过这种方式读取块,例如行。

于 2012-09-25T17:18:40.167 回答
0

grep|wc是这项工作的错误工具。选择一个更好的,例如sed

if sed -n -e '/some data/q;$q1' file; then
    ....
fi

awk,

found=$(awk '/some data/{print"y";exit}' file)
if [ -n "$found" ]; then
    ....
fi

sh本身。

found=
while read line; do
    if expr "$line" : ".*some data" >/dev/null; then
        found=y
        break
    fi
done <file
if [ -n "$found" ]; then 
    ....
fi
于 2012-09-25T18:02:36.677 回答
0

只需检查grep自身的退出状态:

if grep -q "some data" file; then
    echo "I got data"
fi

如果找到匹配项,则可以防止将-q任何内容写入标准输出。

于 2012-09-26T01:48:29.277 回答
0

另一种方法是使用 shell 脚本。

cat <some file and conditions> &
< perform your task>

kill $(pidof cat)

只要您一次运行一个“cat”实例,它就可以工作。

于 2017-06-08T19:52:10.943 回答
0

您可以使用timeout命令,它是coreutils.

man timeout

NAME
       timeout - run a command with a time limit

SYNOPSIS
       timeout [OPTION] DURATION COMMAND [ARG]...
...

等待 10 秒:

temp=$(timeout 10 cat file|grep "some data"| wc -c)
if [ $temp -gt 0 ]
then
    echo "I got data"
fi

于 2020-10-18T10:51:23.410 回答