我使用一个命令,比如 cat 一个管道文件并 grep 一些数据。一个简单的代码,例如,
temp=""
temp=$(cat file|grep "some data"| wc -c)
if [ $temp -gt 0 ]
then
echo "I got data"
fi
该文件是一个管道(FIFO),它将输出数据并且不会停止。如何在有限时间内终止 cat pipe 的命令?
我使用一个命令,比如 cat 一个管道文件并 grep 一些数据。一个简单的代码,例如,
temp=""
temp=$(cat file|grep "some data"| wc -c)
if [ $temp -gt 0 ]
then
echo "I got data"
fi
该文件是一个管道(FIFO),它将输出数据并且不会停止。如何在有限时间内终止 cat pipe 的命令?
我在第 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
因此,您可以通过这种方式读取块,例如行。
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
只需检查grep
自身的退出状态:
if grep -q "some data" file; then
echo "I got data"
fi
如果找到匹配项,则可以防止将-q
任何内容写入标准输出。
另一种方法是使用 shell 脚本。
cat <some file and conditions> &
< perform your task>
kill $(pidof cat)
只要您一次运行一个“cat”实例,它就可以工作。
您可以使用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